c++語言規定:不允許跨過變數的初始化語句直接跳轉到該變數作用域內的另一個位置
片段一:
int sc = 1;
switch (sc)
{
case 0:
int val = 10;
break;
case 1:
val = 5; // error,跳過了初始化
break;
default:
{
}
}
分析: 此時 switch語句跳過case標籤0中變數val的初始化語句,直接跳轉到case標籤1中,此時val = 5;是不允許的,因為val雖然在作用域之內,但是它跳過了該變數的初始化,為非法行為。
片段二:
int sc = 1;
switch (sc)
{
case 0:
int val;
break;
case 1:
val = 5; //right
break;
default:
{
}
}
分析: 相比片段一,標籤0中變數val並沒有初始化,此時,switch語句直接跳轉至標籤1,此用法沒有問題。
片段三:
int sc = 1;
switch (sc)
{
case 0:
{
int val = 10;
break;
}
case 1:
val = 5; //error, 不在作用域內
break;
default:
{
}
}
分析: 片段三,標籤1中的變數val不在作用域內,報錯!!
總結: 第一種,如果打算在case標籤內定義並初始化一個變數,最好該case標籤使用複合語句,即用{}包含在內(推薦使用)
第二種,如果case下不使用{},則case下變數不能初始化;
第三種,在最後一個標籤,可定義並初始化一個變數(如果含default,則default才是最後一個標籤)。
如果在某一處一個帶有初始值的變數位於作用域之外,在另一處該變數位於作用域之內,則從前一處跳轉到後一處的行為是非法行為。