亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

前言

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

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

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

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

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

錯(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'

正確寫法

也不能說是正確的寫法,只能說是編譯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;
}

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

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

研究

神奇的寫法

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

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.

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

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

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

POD類型

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

看一段代碼:

#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下均編譯通過和執(zhí)行;

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

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

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

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

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

      3、enums枚舉類型;

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

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

總結(jié)

      1、最好不要用goto;

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

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

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

參考

[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'

相關(guān)文章

  • undefined reference to `SetPduPowerConsumptionCnt''錯(cuò)誤的解決方法

    undefined reference to `SetPduPowerConsumptionCnt''錯(cuò)誤的解決方法

    編譯時(shí)出現(xiàn)undefined reference to `SetPduPowerConsumptionCnt'錯(cuò)誤要如何解決呢?有沒有什么好的解決方法?下面小編就為大家解答吧,如果你也遇到了這種情況,可以過來參考下
    2013-07-07
  • VC實(shí)現(xiàn)將網(wǎng)址解析出所有ip地址的實(shí)例代碼

    VC實(shí)現(xiàn)將網(wǎng)址解析出所有ip地址的實(shí)例代碼

    這篇文章主要介紹了VC實(shí)現(xiàn)將網(wǎng)址解析出所有ip地址的實(shí)例代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • Vs2019+Qt+Opencv環(huán)境配置心得(圖文)

    Vs2019+Qt+Opencv環(huán)境配置心得(圖文)

    這篇文章主要介紹了Vs2019+Qt+Opencv環(huán)境配置心得(圖文),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • vscode中配置LeetCode插件的教程(愉快刷題)

    vscode中配置LeetCode插件的教程(愉快刷題)

    這篇文章主要介紹了vscode中配置LeetCode插件的教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2020-03-03
  • 老生常談C++ explicit關(guān)鍵字

    老生常談C++ explicit關(guān)鍵字

    這篇文章主要介紹了C++ explicit關(guān)鍵字,explicit關(guān)鍵字只需用于類內(nèi)的單參數(shù)構(gòu)造函數(shù)前面,由于無參數(shù)的構(gòu)造函數(shù)和多參數(shù)的構(gòu)造函數(shù)總是顯式調(diào)用,這種情況在構(gòu)造函數(shù)前加explicit無意義,需要的朋友可以參考下
    2023-03-03
  • C語言數(shù)據(jù)結(jié)構(gòu)之二分法查找詳解

    C語言數(shù)據(jù)結(jié)構(gòu)之二分法查找詳解

    二分查找算法是在有序數(shù)組中用到的較為頻繁的一種算法,在未接觸二分查找算法時(shí),最通用的一種做法是,對數(shù)組進(jìn)行遍歷,跟每個(gè)元素進(jìn)行比較,其時(shí)間為O(n),但二分查找算法更優(yōu)
    2022-02-02
  • 詳解Matlab如何繪制?;鶊D

    詳解Matlab如何繪制?;鶊D

    桑基圖是一種特定類型的流程圖,圖中延伸的分支的寬度對應(yīng)數(shù)據(jù)流量的大小,通常應(yīng)用于能源、材料成分、金融等數(shù)據(jù)的可視化分析。本文將用Matlab繪制好看的?;鶊D,需要的可以參考一下
    2022-03-03
  • C++中的Qt?QTableView詳解

    C++中的Qt?QTableView詳解

    這篇文章主要介紹了Qt?QTableView詳解,主要包括常用接口,設(shè)置item屬性,右鍵彈出菜單,結(jié)合示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • 詳細(xì)理解函C語言的函數(shù)棧幀

    詳細(xì)理解函C語言的函數(shù)棧幀

    這篇文章主要為大家介紹了C語言的函數(shù)棧幀,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助,希望能夠給你帶來幫助
    2021-11-11
  • 淺談C++中的string 類型占幾個(gè)字節(jié)

    淺談C++中的string 類型占幾個(gè)字節(jié)

    本篇文章小編并不是為大家講解string類型的用法,而是講解我個(gè)人比較好奇的問題,就是string 類型占幾個(gè)字節(jié)
    2013-08-08

最新評論