亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++跳轉語句之Goto對變量定義的影響詳解

2020-05-23 13:59:02
字體:
來源:轉載
供稿:網友

前言

goto語句也稱為無條件轉移語句,其基本形式如下 :

語句標號由一個有效地標識符和符號";"組成,其中,標識符的命名規則與變量名稱相同,即由字母、數字和下劃線組成,且第一個字符必須是字母或下劃線。執行goto語句后,程序就會跳轉到語句標號處,并執行其后的語句。

通常goto語句與if條件語句連用,但是,goto語句在給程序帶來靈活性的同時,也會使得使程序結構層次不清,而且不易讀,所以要合理運用該語句。

發現問題

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

錯誤示例代碼:

#include <iostream>using namespace std;int main(){ goto Exit; int a = 0;Exit: return 0;}

報錯:

[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 heregoto_study.cpp:30: error: crosses initialization of 'int a'

正確寫法

也不能說是正確的寫法,只能說是編譯OK的寫法。

直接上代碼:

寫法一:

改變域,變成局部變量:

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

寫法二

神奇的寫法:

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

關鍵是還可以訪問!結果:

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

研究

神奇的寫法

看到兩個可以編譯通過的寫法之后,最納悶的是寫法二為毛可以編譯通過,而且還能使用???

C++規定

參考[1][2]中提到了C++標準中的規定: > 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.

意思是說:如果一個程序的執行路徑從代碼中的點A(某個局部變量x還未定義)跳到代碼中另一點B(該局部變量x已定義,并且定義的時候有初始化),那么編譯器會報錯。這樣的跳躍可以是由于執行goto語句,或者是switch-case造成的。所以,在寫法二中a是int類型,是一個POD類型,并且沒有初始化,所以編譯通過。但是,很明顯:如果去使用這個變量a的時候,結果是未知的,就像前輩說的,沒有意義,還不如不支持!那如果只在局部使用,完全可以用花括號括起來!網上也有人說到,C++規范雖然沒有明確說明這樣是錯誤的,但是變量的域的規定其實是隱性說這種做法是不可取的,見參考[4]。

隱性說明

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標記

參考[4]中提到,g++編譯器默認是檢查的,自己可以設置編譯器的這個標記變成警告,未實踐?。?!

查了下資料-fpermissive標記的作用是: 把代碼的語法錯誤作為警告,并繼續編譯進程,所以就安全起見,這個角度就不要想了,還是老老實實碼磚!

POD類型

參考[3],按照上面C++規定的說法,只要是POD類型,并且沒有初始化都是可以編譯通過的。

看一段代碼:

#include <iostream>using namespace std;class A{public: // 注意:和B不同的是有構造和析構函數, 所以編譯報錯 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;}

結果:

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

小結:

      1、以上代碼在windows和linux下均編譯通過和執行;

      2、A classA一句在windows和linux均編譯不通過!因為A有構造和析構函數,不滿足條件;

      3、至于int a = 1;這樣的寫法在windows(msvc)下面能夠通過就與C++規范不符了,求解釋!??!

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

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

      2、 指針(包括函數指針和成員指針)都是POD類型;

      3、enums枚舉類型;

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

      5、POD類型的class,struct和union也是。但要求所有的成員是public,并且沒有基類,沒有構造、析構函數和虛函數。靜態成員在這些規則下也是。

總結

      1、最好不要用goto;

      2、goto后面不要跳過定義和初始化的變量,如果是POD類型可以先申明再定義,是不會編譯報錯的。但是不建議這么使用,可以看到如果執行語句跳過了賦值語句,那么變量的值是未知的,存在危險性;

      3、goto后面如果是局部的變量,可以用花括號括起來構成一個局部域,就安全了。

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

參考

[1]Getting a bunch of crosses initialization error

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

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

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

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲18私人小影院| 成人在线播放av| 色综合久久久888| 欧美日产国产成人免费图片| 亚洲女人天堂成人av在线| 亚洲天堂成人在线| 欧美精品激情在线| 欧美性猛交xxxx乱大交3| 日韩av电影在线免费播放| 98视频在线噜噜噜国产| 亚洲午夜激情免费视频| 国产精品一区二区久久| 神马久久久久久| 亚洲理论电影网| 国产日韩在线看片| 91久久综合亚洲鲁鲁五月天| 久久夜色精品国产欧美乱| 欧美视频国产精品| 亚洲午夜色婷婷在线| 日韩免费观看视频| 91视频九色网站| 亚洲精品视频网上网址在线观看| www欧美日韩| 欧美在线欧美在线| 国产精品精品视频一区二区三区| 日韩va亚洲va欧洲va国产| 欧美最猛性xxxxx免费| 亚洲xxxxx电影| 成人激情视频在线观看| 91理论片午午论夜理片久久| 日韩av电影在线网| 亚洲国产成人久久| 久久影院在线观看| 午夜欧美大片免费观看| 欧美一区二区大胆人体摄影专业网站| 欧美国产日韩在线| 国产精品综合不卡av| 日韩高清欧美高清| 亚洲欧洲国产一区| 久久国产天堂福利天堂| 欧美高清在线播放| 欧美在线一区二区视频| 欧美自拍视频在线| 国产欧洲精品视频| 中文字幕亚洲精品| 国产精品白嫩美女在线观看| 欧美精品成人91久久久久久久| 国产亚洲视频中文字幕视频| 亚洲精品欧美一区二区三区| 久久亚洲欧美日韩精品专区| 韩国福利视频一区| 91精品视频播放| 亚洲第一福利网站| 亚洲天堂av综合网| 日韩av免费看网站| 97久久精品人搡人人玩| 精品久久久久久久久久ntr影视| 国产色婷婷国产综合在线理论片a| 日韩在线视频免费观看高清中文| 一区二区三区 在线观看视| 国产精品一区二区久久| 亚洲国产精品va在线看黑人| 国产精品永久免费视频| 91精品国产沙发| 最近2019中文免费高清视频观看www99| 91chinesevideo永久地址| www.久久色.com| 日韩欧美亚洲范冰冰与中字| 国产精品一区二区3区| 成人亚洲欧美一区二区三区| 国产精品极品美女粉嫩高清在线| 色偷偷av亚洲男人的天堂| 久久免费视频网站| 日韩欧美国产成人| 欧美日韩国产中字| 亚洲乱码国产乱码精品精| 久久久免费观看| 日韩av男人的天堂| 亚洲第一精品夜夜躁人人躁| 伊人久久久久久久久久久久久| 国产精品成人品| 91精品国产高清| 色婷婷av一区二区三区在线观看| 日本免费一区二区三区视频观看| 国产精品亚洲一区二区三区| 亚洲精品永久免费| 欧美极品少妇xxxxⅹ裸体艺术| 欧美亚洲第一区| 伊人伊人伊人久久| 亚洲韩国欧洲国产日产av| 韩国精品美女www爽爽爽视频| 久久精品国产亚洲精品| 日韩av在线网页| 日韩av中文字幕在线免费观看| 欧美黄色片视频| 俺也去精品视频在线观看| 4438全国成人免费| 黑人巨大精品欧美一区二区免费| 国产日韩欧美在线观看| 日韩欧美亚洲成人| 日韩av电影手机在线观看| 68精品国产免费久久久久久婷婷| 国产精品2018| 亚洲高清久久久久久| 欧美电影免费观看大全| 尤物九九久久国产精品的分类| 日韩精品中文字幕在线播放| 精品亚洲精品福利线在观看| 国产精品久久91| 欧美日韩精品中文字幕| 亚洲男人天堂手机在线| 亚洲激情在线视频| 日本aⅴ大伊香蕉精品视频| 久久影院中文字幕| 日韩在线观看免费| 亚洲精品xxxx| 欧美激情第99页| 欧美成人免费全部观看天天性色| 日韩精品极品在线观看播放免费视频| 国产成人精品在线| 亚洲国产高清福利视频| 91精品视频免费观看| 最近2019中文字幕在线高清| 久久久噜久噜久久综合| 亚洲国产精品电影在线观看| 热re99久久精品国产66热| 亚洲欧美色婷婷| 国产免费一区二区三区香蕉精| 中文字幕日韩av综合精品| 亚洲女性裸体视频| 久久精品国产96久久久香蕉| 久久亚洲精品一区二区| 欧美第一黄网免费网站| 国产精品久久久久久久app| 成人精品久久久| 色综合91久久精品中文字幕| xvideos国产精品| 日韩一区二区av| 国产69精品久久久久久| 国产精品吊钟奶在线| 色婷婷综合成人| 亚洲人成在线观看网站高清| 国产精品草莓在线免费观看| 国产精品久久久久久中文字| 在线亚洲男人天堂| 欧美日韩激情网| 国产精品白嫩美女在线观看| 91精品国产色综合久久不卡98| 亚洲精品久久在线| 日韩风俗一区 二区| 日韩av在线看| 国产成人精品久久二区二区| 精品久久久久久久久中文字幕| 97超碰国产精品女人人人爽| 亚洲级视频在线观看免费1级| 青青久久av北条麻妃海外网| 国产国产精品人在线视| 国产精品精品视频| 91精品视频一区| 欧美午夜片在线免费观看| 午夜剧场成人观在线视频免费观看| 亚洲第一男人av| 亚洲风情亚aⅴ在线发布| 欧美精品国产精品日韩精品|