亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標題: switch里面的case,似乎不是一種if判斷,而是很復(fù)雜的東東 [打印本頁]

作者: zserewr    時間: 2015-12-31 09:46
標題: switch里面的case,似乎不是一種if判斷,而是很復(fù)雜的東東
例如:
case不合條件的時候,似乎就是一個if。
而一旦符合條件的case找到了,除非有break,否則一直執(zhí)行,其他的case沒有if的作用:

  1. int main()
  2. {
  3.     int n=3;
  4.     switch(n)
  5.     {
  6.         default:cout<<"default"<<endl;
  7.         case 2:cout<<"2"<<endl;
  8.         case 3:cout<<"3"<<endl;
  9.         case 4:cout<<"4"<<endl;
  10.         case 5:cout<<"5"<<endl;
  11.     }
  12.     return 0;
  13. }
復(fù)制代碼
輸出是

  1. 3,4,5
復(fù)制代碼
而如果n的初始值是6,那么將打印:

  1. default
  2. 2
  3. 3
  4. 4
  5. 5
復(fù)制代碼
問題:
(1) default語句寫在哪里,書上說不重要,因為default最后匹配。但是在我的例子里面n=6的時候,default語句確實先執(zhí)行了。

如果程序先判斷default下面的4個case都不符合,然后執(zhí)行default,說明default還是最后執(zhí)行的。那為什么之后再次進入了4個case對應(yīng)的語句呢?

(2) 為什么case一旦符合,那么除非有break,否則其他的case似乎起不到if的作用。
換句話說,switch/case并不等同于if/else if/else這樣的邏輯判斷。

我知道if語句最后會生成類似jnz這樣的跳轉(zhuǎn)指令,那么switch/case這樣奇怪的語義,會生成什么指令呢? 因為case不合條件的時候似乎是jnz,而符合條件就被忽略了,直到遇到break。

(3)switch/case這樣的語義被編譯成什么樣的intel匯編指令?
作者: lxyscls    時間: 2015-12-31 09:46
switch case可以看做是symbol(標號)

case 1
case 2
case 3
default

等于
symbol_1
symbol_2
symbol_3
symbol_default

你不break,可不就是一路執(zhí)行下去嘛{:2_170:}
作者: hellioncu    時間: 2015-12-31 10:07
沒有break就往下執(zhí)行,就是這么規(guī)定的
switch/case會被編譯器優(yōu)化,可能是查表,也可能是簡單的if/else if,等等
作者: zserewr    時間: 2015-12-31 10:17
回復(fù) 2# hellioncu

那么,在下面n=6的情況下:

  1. int main()
  2. {
  3.     int n=6;
  4.     switch(n)
  5.     {
  6.         default:cout<<"default"<<endl;
  7.         case 2:cout<<"2"<<endl;
  8.         case 3:cout<<"3"<<endl;
  9.         case 4:cout<<"4"<<endl;
  10.         case 5:cout<<"5"<<endl;
  11.     }
  12.     return 0;
  13. }
復(fù)制代碼
豈不是: 進入switch以后,先case2,不符合,再case3,不合符,再case4,不合符,再case5,不符合,然后default
之后因為沒有break,所以case2跳過判斷直接執(zhí)行,case3跳過判斷直接執(zhí)行,case4跳過判斷直接執(zhí)行,case5跳過判斷直接執(zhí)行。

換句話說,case 2其實被執(zhí)行了兩遍,第一遍是剛進入switch的時候,判斷是否符合條件,第二遍是default執(zhí)行完以后,不判斷case的條件而直接執(zhí)行cout<<"2"。
是這樣的嗎?

   
作者: hellioncu    時間: 2015-12-31 10:26
zserewr 發(fā)表于 2015-12-31 10:17
回復(fù) 2# hellioncu

那么,在下面n=6的情況下:豈不是: 進入switch以后,先case2,不符合,再case3,不合 ...


這個倒沒研究過,我想應(yīng)該是這樣處理的:

1、找符合條件的case
2、找不到則選擇default
3、往下執(zhí)行,直到break或者switch結(jié)束


作者: hanxin83    時間: 2015-12-31 10:28
本帖最后由 hanxin83 于 2015-12-31 10:29 編輯

case 2其實被執(zhí)行了兩遍,第一遍是剛進入switch的時候

錯! 你這樣理解吧: case X和default都只是一個標號. 決定跳到哪里的是swtich(x).
不管是不是查表還是變成if else, 都會保證switch的語義的行為.

別想多了. 除非, 你可以看懂編譯出來的匯編碼.
唉, 前些天還見到一個天天研究機器碼的題主, 騷年們別走彎路啊.
作者: folklore    時間: 2015-12-31 10:53
像這樣。

if(n ==2){
xxxx;
goto end; // break;
}

if(n ==3){
xxxx;
goto end; // break;
}

end:
// the end of switch
作者: zserewr    時間: 2015-12-31 17:47
回復(fù) 5# hanxin83


    恩,把case/default理解為一個標號,很好的解釋!
作者: cokeboL    時間: 2015-12-31 17:58
本帖最后由 cokeboL 于 2015-12-31 17:58 編輯

廣大cer、cpper累不累,整天研究茴字的N種寫法,好像真需要自己造編譯器一樣
作者: zsszss0000    時間: 2015-12-31 18:52
不如你看看匯編好了




歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2