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這句話只是在編譯的時候有用,執行的時候跳過的時候也無所謂!
③初始化變量分配空間並初始化(編譯時分配空間,運行時初始化賦值),假如存在,一定要執行!