在下面的代碼中開關變量:改變的情況下
int i = 0;
switch(i)
{
case 0:
cout << "In 0" << endl;
i = 1;
break;
case 1:
cout << "In 1" << endl;
break;
}
會發生什麼?它會調用未定義的行爲嗎?
在下面的代碼中開關變量:改變的情況下
int i = 0;
switch(i)
{
case 0:
cout << "In 0" << endl;
i = 1;
break;
case 1:
cout << "In 1" << endl;
break;
}
會發生什麼?它會調用未定義的行爲嗎?
沒有未定義的行爲。但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
)。
您中斷在將此開關語句設置爲1後,將其設置爲1,這是定義的行爲,因此它永遠不會輸入case 1
。
如果沒有「break」,行爲仍然會被很好地定義(但不同)。 –
是的,它會通過並打印兩者,而與下一個值爲情況1的事實無關。 – Joe
這裏沒有問題。達到開關條件時的表達式進行評估。它不一定是一個變量,如果它是變量,可以隨後修改,而不會對switch語句的行爲產生任何影響。
你的輸出將是:
「0」,即使您指定的值i = 1,它不會反映出來,因爲交換機不重複操作,這是一個時間選擇爲突破將
使其脫離switch語句。
爲什麼呢?如果你期待'case 1'被執行,因爲你把'i'改成了1,那麼也不會發生這種情況,因爲一旦'case'結尾處的'break'被執行到達'switch'語句的末尾0「。 – Praetorian