關於在case語句中變數的定義

2021-06-04 14:24:04 字數 1049 閱讀 8442

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...