2011-11-30 107 views
5

在下面的代碼中開關變量:改變的情況下

int i = 0; 

switch(i) 
{ 
    case 0: 
     cout << "In 0" << endl; 
     i = 1; 
     break; 
    case 1: 
     cout << "In 1" << endl; 
     break; 
} 

會發生什麼?它會調用未定義的行爲嗎?

+0

爲什麼呢?如果你期待'case 1'被執行,因爲你把'i'改成了1,那麼也不會發生這種情況,因爲一旦'case'結尾處的'break'被執行到達'switch'語句的末尾0「。 – Praetorian

回答

8

沒有未定義的行爲。但i的值僅在代碼達到switch (i)時才被測試。因此case 1:將被跳過(由break;聲明)。

switch關鍵字並不意味着「每當i的值爲0/1時運行代碼」。這意味着,檢查什麼i是現在,並基於此運行代碼。它不關心未來會發生什麼i

事實上,它有時有用的事:

for(step = 0; !cancelled; ++step) { 
    switch (step) 
    { 
     case 0: 
      //start processing; 
      break; 

     case 1: 
      // more processing; 
      break; 

     case 19: 
      // all done 
      return; 
    } 
} 

而改變控制變量中構建時,有限狀態機(儘管不是必需的,因爲你可以設置next_state裏面的一個case塊是極爲常見之後進行分配state = next_state)。

0

中斷在將此開關語句設置爲1後,將其設置爲1,這是定義的行爲,因此它永遠不會輸入case 1

+2

如果沒有「break」,行爲仍然會被很好地定義(但不同)。 –

+0

是的,它會通過並打印兩者,而與下一個值爲情況1的事實無關。 – Joe

1

這裏沒有問題。達到開關條件時的表達式進行評估。它不一定是一個變量,如果它是變量,可以隨後修改,而不會對switch語句的行爲產生任何影響。

0

你的輸出將是:

「0」,即使您指定的值i = 1,它不會反映出來,因爲交換機不重複操作,這是一個時間選擇爲突破將

使其脫離switch語句。

相關問題