[問題] switch控制與while

作者: Ruid (這人生,煙花一場)   2018-06-21 17:47:07
請問一下以下的問題
int a=4;
int b=10;
switch(a)
{
case 1:
cout<<"case 1"<<endl;
break;
case 2:
cout<<"case 2"<<endl;
break;
case 3:
cout<<"case 3"<<endl;
while(a<b)
case 4:
cout<<"case 4"<<endl;
{a+=5}
break;
case 5:
cout<<"case 5"<<endl;
default:
cout<<"default"<<endl;
break;
}
要請問的問題在於,a=4所以switch會到case 4:這個標籤下執行
但卻是一直在while無窮迴圈,在「c語法暨程式庫標準辭典」這本書的第106頁
有段說明「switch主體通常是case標籤起始的區塊陳述式,而且不會執行第一個
case標籤之前的陳述式」
所以是從「case 4:」標籤開始執行,那while判斷式為什麼會被執行到呢???
謝謝,麻煩各位了。
作者: MOONRAKER (㊣牛鶴鰻毛人)   2018-06-21 17:53:00
太厲害了真是奇葩 XDwhile無窮迴圈有沒有輸出什麼
作者: jerryh001   2018-06-21 18:01:00
我猜啦 因為while後沒分號 所以"下一個分號之前"是while的內容 所以就包含了 case4和cout case4兩行
作者: Ruid (這人生,煙花一場)   2018-06-21 18:03:00
是一直輸出case 4這行
作者: Yshuan (倚絃)   2018-06-21 18:14:00
;
作者: MOONRAKER (㊣牛鶴鰻毛人)   2018-06-21 18:14:00
那就對啦 沒有大括號的while只包含後面的cout而Case 4: 則被當成label處理a==4時 執行到switch (a) 相當於goto到Case 4:的位置跳進了while block就在裏面出不來
作者: sarafciel (Cattuz)   2018-06-21 18:23:00
一個分號引發的慘劇XDD
作者: Ruid (這人生,煙花一場)   2018-06-21 18:52:00
以goto來想可以了解,但書上說不會執行case之前的陳述式這點就不是很了解,因為while是在case 4之前應該不會執行先謝謝以上各位大大的解釋了
作者: MOONRAKER (㊣牛鶴鰻毛人)   2018-06-21 19:10:00
可能他的實作並不完全符合規格。
作者: Schottky (順風相送)   2018-06-21 19:23:00
[捂臉.jpg] 我可以笑嗎?
作者: Ruid (這人生,煙花一場)   2018-06-21 19:25:00
再請教一個問題,若是把cout<<"case 4<<endl;這行刪除那{a+=5}這行的區塊陳述式是屬switch的還是while的,謝謝
作者: yvb   2018-06-21 19:27:00
把 while(a<b) 改成 while(cout<<"while"<<endl,a<b) 試試.labeled statements 就只是個讓 goto 或 switch 跳到該處,你那本書的說明是它的說法, 原文標準應該沒多做這樣的解釋.{a+=5} => {a+=5;} 你的while()後沒大括號,只包含cout那一列.抱歉, 漏看 "...刪除" 那一句. 該說同時屬switch和while吧?
作者: MOONRAKER (㊣牛鶴鰻毛人)   2018-06-21 20:47:00
其實有搜尋到某網頁 標題是不要用switch...case跳進迴圈中 示範的code是一個for loop 從第一個case尾巴拉到第三個case中間...其實這種笨的錯誤不是沒機會發生尤其多人專案裡面有人不分青紅皂白亂刪code的時候...
作者: yvb   2018-06-21 21:01:00
google: Duff's Device
作者: LPH66 (-6.2598534e+18f)   2018-06-21 21:02:00
一個這種性質濫用(O)的例子是 Duff's device
作者: yvb   2018-06-21 21:07:00
前幾樓 M 大說的可能是 google: MSC20-C switch statement
作者: ilikekotomi (Young)   2018-06-22 00:24:00
沒想到會有這種問題 真有趣
作者: Ruid (這人生,煙花一場)   2018-06-22 06:35:00
感謝以上各位大大的解釋
作者: cphe (魔鬼藏在垃圾筒裡)   2018-06-22 10:28:00
這例子實在是特例…一般正常寫很難遇到~不過是不錯的例子

Links booklink

Contact Us: admin [ a t ] ucptt.com