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

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中引用不會出錯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章