1. 報錯this
switch(something)spa
{內存
case a:作用域
int a = 0;it
break;編譯
default:變量
break; error
}co
結果報錯:cas
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這句話只是在編譯的時候有用,執行的時候跳過的時候也無所謂!
③初始化變量分配空間並初始化(編譯時分配空間,運行時初始化賦值),假如存在,必定要執行!