最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++跳轉(zhuǎn)語(yǔ)句之Goto對(duì)變量定義的影響詳解

 更新時(shí)間:2016年11月29日 09:17:32   投稿:daisy  
goto語(yǔ)句也被稱(chēng)為無(wú)條件轉(zhuǎn)移語(yǔ)句,這篇文章主要介紹了C++跳轉(zhuǎn)語(yǔ)句之Goto對(duì)變量定義的影響,文中通過(guò)示例代碼解文字介紹的很詳細(xì),相信對(duì)大家的理解和學(xué)習(xí)具有一定的參考借鑒價(jià)值,有需要的朋友們下面跟著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。

前言

goto語(yǔ)句也稱(chēng)為無(wú)條件轉(zhuǎn)移語(yǔ)句,其基本形式如下 :

語(yǔ)句標(biāo)號(hào)由一個(gè)有效地標(biāo)識(shí)符和符號(hào)";"組成,其中,標(biāo)識(shí)符的命名規(guī)則與變量名稱(chēng)相同,即由字母、數(shù)字和下劃線(xiàn)組成,且第一個(gè)字符必須是字母或下劃線(xiàn)。執(zhí)行g(shù)oto語(yǔ)句后,程序就會(huì)跳轉(zhuǎn)到語(yǔ)句標(biāo)號(hào)處,并執(zhí)行其后的語(yǔ)句。

通常goto語(yǔ)句與if條件語(yǔ)句連用,但是,goto語(yǔ)句在給程序帶來(lái)靈活性的同時(shí),也會(huì)使得使程序結(jié)構(gòu)層次不清,而且不易讀,所以要合理運(yùn)用該語(yǔ)句。

發(fā)現(xiàn)問(wèn)題

我們經(jīng)常碰到有在goto后面定義變量,linux下編譯不通過(guò)的問(wèn)題(報(bào)錯(cuò)信息:crosses initialization of)。其實(shí),只要注意一下就好了,今天問(wèn)了一下公司前輩之后,也翻了些資料,記錄一下,加深記憶,也希望能對(duì)一些人有些許幫助。

錯(cuò)誤示例代碼:

#include <iostream>
using namespace std;

int main()
{
 goto Exit;
 int a = 0;
Exit:
 return 0;
}

報(bào)錯(cuò):

[root@localhost c-c++]# g++ goto_study.cpp 
goto_study.cpp: In function 'int main()':
goto_study.cpp:31: error: jump to label 'Exit'
goto_study.cpp:29: error: from here
goto_study.cpp:30: error: crosses initialization of 'int a'

正確寫(xiě)法

也不能說(shuō)是正確的寫(xiě)法,只能說(shuō)是編譯OK的寫(xiě)法。

直接上代碼:

寫(xiě)法一:

改變域,變成局部變量:

int main()
{
 goto Exit;
 {
 int a = 0;
 }
Exit:
 return 0;
}

寫(xiě)法二

神奇的寫(xiě)法:

int main()
{
 goto Exit;
 int a;
 a = 1;
Exit:
 cout << "a = " << a << endl;
 return 0;
}

關(guān)鍵是還可以訪問(wèn)!結(jié)果:

[root@localhost c-c++]# g++ goto_study.cpp 
[root@localhost c-c++]# ./a.out
a = 1259648

研究

神奇的寫(xiě)法

看到兩個(gè)可以編譯通過(guò)的寫(xiě)法之后,最納悶的是寫(xiě)法二為毛可以編譯通過(guò),而且還能使用???

C++規(guī)定

參考[1][2]中提到了C++標(biāo)準(zhǔn)中的規(guī)定: > It is possible to transfer into a block, but not in a way that bypasses declarations with initialization. A program that jumps from a point where a local variable with automatic storage duration is not in scope to a point where it is in scope is ill-formed unless the variable has POD type (3.9) and is declared without an initializer.

意思是說(shuō):如果一個(gè)程序的執(zhí)行路徑從代碼中的點(diǎn)A(某個(gè)局部變量x還未定義)跳到代碼中另一點(diǎn)B(該局部變量x已定義,并且定義的時(shí)候有初始化),那么編譯器會(huì)報(bào)錯(cuò)。這樣的跳躍可以是由于執(zhí)行g(shù)oto語(yǔ)句,或者是switch-case造成的。所以,在寫(xiě)法二中a是int類(lèi)型,是一個(gè)POD類(lèi)型,并且沒(méi)有初始化,所以編譯通過(guò)。但是,很明顯:如果去使用這個(gè)變量a的時(shí)候,結(jié)果是未知的,就像前輩說(shuō)的,沒(méi)有意義,還不如不支持!那如果只在局部使用,完全可以用花括號(hào)括起來(lái)!網(wǎng)上也有人說(shuō)到,C++規(guī)范雖然沒(méi)有明確說(shuō)明這樣是錯(cuò)誤的,但是變量的域的規(guī)定其實(shí)是隱性說(shuō)這種做法是不可取的,見(jiàn)參考[4]。

隱性說(shuō)明

Goto can't skip over definitions of variables, because those variables would not exist after the jump, since lifetime of variable starts at the point of definition. The specification does not seem to explicitly mention goto must not do that, but it is implied in what is said about variable lifetime.

-fpermissive標(biāo)記

參考[4]中提到,g++編譯器默認(rèn)是檢查的,自己可以設(shè)置編譯器的這個(gè)標(biāo)記變成警告,未實(shí)踐!!!

查了下資料-fpermissive標(biāo)記的作用是: 把代碼的語(yǔ)法錯(cuò)誤作為警告,并繼續(xù)編譯進(jìn)程,所以就安全起見(jiàn),這個(gè)角度就不要想了,還是老老實(shí)實(shí)碼磚!

POD類(lèi)型

參考[3],按照上面C++規(guī)定的說(shuō)法,只要是POD類(lèi)型,并且沒(méi)有初始化都是可以編譯通過(guò)的。

看一段代碼:

#include <iostream>
using namespace std;
class A{
public:
 // 注意:和B不同的是有構(gòu)造和析構(gòu)函數(shù), 所以編譯報(bào)錯(cuò)
 A(){}
 ~A(){}
 void testA(){
 cout << "A::test." << endl;
 }
};
class B{
public:
 void testB(){
 cout << "B::test." << endl;
 }
};
int main()
{
 goto Exit;
 // int a = 1; // windows ok.linux failed!
 //A classA; // failed:
 B classB; // success:
 classB.testB();
Exit:
 classB.testB();
 return 0;
}

結(jié)果:

[root@localhost c-c++]# g++ goto_study.cpp 
[root@localhost c-c++]# ./a.out
a = 1259648
B::test.

小結(jié):

      1、以上代碼在windows和linux下均編譯通過(guò)和執(zhí)行;

      2、A classA一句在windows和linux均編譯不通過(guò)!因?yàn)锳有構(gòu)造和析構(gòu)函數(shù),不滿(mǎn)足條件;

      3、至于int a = 1;這樣的寫(xiě)法在windows(msvc)下面能夠通過(guò)就與C++規(guī)范不符了,求解釋?zhuān)。。?br />

以下是POD類(lèi)型(還是看英文吧):

      1、int, char, wchar_t, bool, float, double是POD類(lèi)型,這些類(lèi)型的long/short and signed/unsigned版本也是;

      2、 指針(包括函數(shù)指針和成員指針)都是POD類(lèi)型;

      3、enums枚舉類(lèi)型;

      4、POD的const和普通變量也都是;

      5、POD類(lèi)型的class,struct和union也是。但要求所有的成員是public,并且沒(méi)有基類(lèi),沒(méi)有構(gòu)造、析構(gòu)函數(shù)和虛函數(shù)。靜態(tài)成員在這些規(guī)則下也是。

總結(jié)

      1、最好不要用goto;

      2、goto后面不要跳過(guò)定義和初始化的變量,如果是POD類(lèi)型可以先申明再定義,是不會(huì)編譯報(bào)錯(cuò)的。但是不建議這么使用,可以看到如果執(zhí)行語(yǔ)句跳過(guò)了賦值語(yǔ)句,那么變量的值是未知的,存在危險(xiǎn)性;

      3、goto后面如果是局部的變量,可以用花括號(hào)括起來(lái)構(gòu)成一個(gè)局部域,就安全了。

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流。

參考

[1]Getting a bunch of crosses initialization error

[2]>switch case、goto對(duì)變量定義的影響

[3]>“POD type” in C++

[4]>Statement goto can not cross pointer definition?

[5]>error: jump to label ‘foo' crosses initialization of ‘bar'

相關(guān)文章

  • c++實(shí)現(xiàn)通用參數(shù)解析類(lèi)示例

    c++實(shí)現(xiàn)通用參數(shù)解析類(lèi)示例

    使用命令行執(zhí)行程序的時(shí)候在程序后可跟多個(gè)參數(shù)列表,而main函數(shù)的argc和argv分別存儲(chǔ)了相關(guān)的參數(shù)個(gè)數(shù)和參數(shù)內(nèi)容,而循環(huán)輸入相關(guān)的時(shí)候就需要用戶(hù)自己來(lái)解析相關(guān)參數(shù)。以下代碼用c++的方式實(shí)現(xiàn)了相關(guān)解析的封裝,使用起來(lái)非常方便
    2014-03-03
  • C++類(lèi)常量和類(lèi)枚舉

    C++類(lèi)常量和類(lèi)枚舉

    這篇文章主要介紹了C++類(lèi)常量和類(lèi)枚舉,給類(lèi)當(dāng)中定義一些常量,可以給所有類(lèi)的對(duì)象使用,比如說(shuō)我們?cè)陬?lèi)當(dāng)中定義一個(gè)數(shù)組,希望可以定義一個(gè)常量,用來(lái)初始化數(shù)組的長(zhǎng)度,那么下面我i嗎就來(lái)看看過(guò)程當(dāng)如何吧
    2022-01-01
  • Cocos2d-x Schedule定時(shí)器的使用實(shí)例

    Cocos2d-x Schedule定時(shí)器的使用實(shí)例

    這篇文章主要介紹了Cocos2d-x Schedule定時(shí)器的使用實(shí)例,本文的講解內(nèi)容包含在代碼注釋中,需要的朋友可以參考下
    2014-09-09
  • C++實(shí)現(xiàn)神經(jīng)BP神經(jīng)網(wǎng)絡(luò)

    C++實(shí)現(xiàn)神經(jīng)BP神經(jīng)網(wǎng)絡(luò)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)神經(jīng)BP神經(jīng)網(wǎng)絡(luò),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • C++類(lèi)靜態(tài)成員與類(lèi)靜態(tài)成員函數(shù)詳解

    C++類(lèi)靜態(tài)成員與類(lèi)靜態(tài)成員函數(shù)詳解

    靜態(tài)成員不可在類(lèi)體內(nèi)進(jìn)行賦值,因?yàn)樗潜凰性擃?lèi)的對(duì)象所共享的。你在一個(gè)對(duì)象里給它賦值,其他對(duì)象里的該成員也會(huì)發(fā)生變化。為了避免混亂,所以不可在類(lèi)體內(nèi)進(jìn)行賦值
    2013-09-09
  • 初學(xué)C++之自定義類(lèi)型名簡(jiǎn)化詳解

    初學(xué)C++之自定義類(lèi)型名簡(jiǎn)化詳解

    下面小編就為就大家?guī)?lái)一篇初學(xué)C++之自定義類(lèi)型名簡(jiǎn)化詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-09-09
  • C++結(jié)構(gòu)體與類(lèi)的區(qū)別詳情

    C++結(jié)構(gòu)體與類(lèi)的區(qū)別詳情

    這篇文章主要介紹了C++結(jié)構(gòu)體與類(lèi)的區(qū)別,C++中的struct對(duì)C中的struct進(jìn)行了擴(kuò)充,它已經(jīng)不再只是一個(gè)包含不同數(shù)據(jù)類(lèi)型的數(shù)據(jù)結(jié)構(gòu)了,它已經(jīng)獲取了太多的功能。下面我們一起進(jìn)入文章倆姐具體內(nèi)容,需要的朋友也可以參考一下
    2021-11-11
  • 獲取當(dāng)前系統(tǒng)本地時(shí)間,精確到毫秒的實(shí)例

    獲取當(dāng)前系統(tǒng)本地時(shí)間,精確到毫秒的實(shí)例

    下面小編就為大家?guī)?lái)一篇獲取當(dāng)前系統(tǒng)本地時(shí)間,精確到毫秒的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • C++通過(guò)類(lèi)實(shí)現(xiàn)控制臺(tái)貪吃蛇

    C++通過(guò)類(lèi)實(shí)現(xiàn)控制臺(tái)貪吃蛇

    這篇文章主要為大家詳細(xì)介紹了C++通過(guò)類(lèi)實(shí)現(xiàn)控制臺(tái)貪吃蛇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C語(yǔ)言中一些將字符串轉(zhuǎn)換為數(shù)字的函數(shù)小結(jié)

    C語(yǔ)言中一些將字符串轉(zhuǎn)換為數(shù)字的函數(shù)小結(jié)

    這篇文章主要介紹了C語(yǔ)言中一些將字符串轉(zhuǎn)換為數(shù)字的函數(shù)小結(jié),分別為atoi()函數(shù)和atol()函數(shù)以及atof()函數(shù),需要的朋友可以參考下
    2015-08-08

最新評(píng)論

县级市| 临安市| 哈尔滨市| 昌图县| 清水河县| 昭觉县| 东山县| 湛江市| 乐至县| 德化县| 灵山县| 沧源| 辽宁省| 襄汾县| 尚义县| 孟州市| 沂南县| 浙江省| 天长市| 凌云县| 新郑市| 上蔡县| 北宁市| 荃湾区| 长兴县| 遵义县| 凤城市| 宾阳县| 顺昌县| 洛南县| 九寨沟县| 安塞县| 兴业县| 南木林县| 南溪县| 湖南省| 台江县| 宁津县| 临猗县| 陆河县| 南木林县|