switch-case內不能定義變量?


1. 報錯

switch(something)

{

  case a:

    int a = 0;

    break;

  default:

    break;  

}

結果報錯:

error: cannot jump from switch statement to this case label……

 

2. 錯誤原因

究其根本原因,是C++的一條規則:在任何作用域內,假如存在變量初始化語句,該初始化語句不可以被跳過,一定要執行

這里強調在作用域內的變量一旦初始化就不能跳過,但是可以跳過整個作用域!

比如初始化語句int a=0,就有雖然進入其所在的作用域,但是不被執行的風險,所以就報錯了!

 

3. 如何修改

①把int a;移到switch和case之間:

switch(something)

{

  int a;

  case a:

    a = 0;

    break;

  default:

    break;  

}

②在case后+作用域符號{}

switch(something)

{

  case a:

  {

    int a = 0;

    break;

  }

  default:

    break;  

}

這兩種修改,都保證了只要進入a的作用域,都會執行a的初始化語句!

 

4. 判斷對錯

switch(something)

{

  case a:

    int a;

    break;

  case b:

    a = 5;

    break;

  default:

    break;  

}

在C++中是正常編譯和執行的,因為:int a只是定義了a,並沒有初始化,沒有違背上述規則!

編譯的時候,編譯到case a的時候分配空間,編譯到case b的時候賦值,a的作用域就是switch后的整個{},完全沒有問題。

 

5. 關於聲明、定義和初始化:

①聲明變量不會分配內存空間;

②定義變量int a,編譯的時候會分配內存,但是並不會產生任何可執行的代碼,

所以int a這句話只是在編譯的時候有用,執行的時候跳過的時候也無所謂!

③初始化變量分配空間並初始化(編譯時分配空間,運行時初始化賦值),假如存在,一定要執行!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM