case語句中聲明變量的各種情況分析:
1,
switch(ch)
{
case 'a':
int a = 0;
//break;將break去掉,便於說明
case 'b':
cout < < "ok" < < endl;
break;
}
這個是錯誤的,編譯器不會讓他通過編譯,理由是這樣的:
"int a = 0 "這個定義放在了case 'a '中,如果允許它順利通過編譯,會造成“不一致”,考慮西面兩種情況:
(1).ch= 'a ':執行case 'a '分支,a順利的被初始化爲0,執行完case 'a '之後,會順序執行case 'b '(因爲我把break註釋掉了),此時如果在case 'b '中引用了a,是沒有任何問題的。
(2).ch= 'b ':直接執行case 'b '分支,由於跳過了case 'a '分支,所以a並沒有被初始化爲0,但是a在case 'b '中仍然可見(即case 'b '中仍然可以引用a),那麼如果在case 'b '中引用了a,則出現了問題,因爲現在a是“未初始化的”。
好了,說到這裏,樓主應該清楚爲什麼編譯器禁止上述寫法了吧!
2,現在我們再來看看下面這種:
switch(ch)
{
case 'a ':
{int a = 0;}
//break;將break去掉,便於說明
case 'b ':
cout < < "ok " < < endl;
break;
}
這個可以通過編譯,因爲此時在case 'b '中a不可見(因爲a在語句快中),所以不會出現上述的“不一致”現象,因此編譯順利通過。
3,再來看看下面的情況:
switch(ch)
{
case 'a ':
...
//break;將break去掉,便於說明
case 'b ':
int a = 0;
break;
}
4,此時也會順利通過編譯,因爲a的定義(初始化)放在了最後一個分支中,由於在case 'b '後面沒有其他分支了,所以同樣不會出現上述的“不一致”現象,所以仍然順利通過編譯。
switch(ch)
{
case 'a':
int a;
a=0;
break;
case 'b':
int b;
b=1;
break;
}
這樣改動之後,編譯時也可以通過,因爲C語言變量在聲明是,已經非配了內存,但是內存中的數值是隨機的,相當於進行了初始化,所以在case b中引用不會出錯。