case語句中宣告變數的各種情況分析: 1,
switch(ch)
這個是錯誤的,編譯器不會讓他通過編譯,理由是這樣的:
"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)
//break;將break去掉,便於說明
case 'b ':
cout < < "ok " < < endl;
break;
}
這個可以通過編譯,因為此時在case 'b '中a不可見(因為a在語句快中),所以不會出現上述的「不一致」現象,因此編譯順利通過。
3,再來看看下面的情況:
switch(ch)
4,此時也會順利通過編譯,因為a的定義(初始化)放在了最後乙個分支中,由於在case 'b '後面沒有其他分支了,所以同樣不會出現上述的「不一致」現象,所以仍然順利通過編譯。
switch(ch)
這樣改動之後,編譯時也可以通過,因為c語言變數在宣告是,已經非配了記憶體,但是記憶體中的數值是隨機的,相當於進行了初始化,所以在case b中引用不會出錯。
在case語句中定義變數的問題
cpp view plain copy switch n 編譯器會報錯 cpp view plain copy 錯誤 跳過了 inti 的初始化 如果我們這樣寫 在變數定義的地方加上 cpp view plain copy switch n break case 2 break case 3 bre...
case語句中定義變數要加括號
map iterator it map iterator itid recv acceptsocket,char recvbuf,sizeof recvbuf 0 switch recvbuf.protocol if it m muserpassword.end break case load it...
swtich和case語句中,定義變數要加花括號
switch是我們做條件選擇時,經常用到的乙個語句。一直以來對於他的使用相信大家也都是得心應手,前幾天在linux下寫乙個c 程式時遇到了這樣的乙個問題,請看例子 include using namespace std int main int i cout i switch i case 0 in...