int c,i;
for (int i = 1; i < 3; ++i)
{
switch (i)
{
default: c+=i;
case 2: c++;break;
case 4: c+=2;break;
}
}
printf("%d\n", c);
這個程式碼為什麼會等於3啊?這裡面不是default第一次i為1的時候走default: c =i;,第二次i等於2就走case 2: c ;break;然後就結束,最後輸出c=2嗎?為什麼是3呢?
女神的闺蜜爱上我2017-07-06 10:37:10
先明確一下switch中的一些注意點:
switch
語句體由一系列 case
標籤和一個可選 default
標籤組成。 case
語句中的兩個常數表達式的計算結果不能為同一個值。 default
標籤只能出現一次。 標記語句不是語法要求,但如果它們不存在,switch
語句是無意義的。 預設語句(即default
標籤)無需顯示在末尾;它可以顯示在 switch 語句體的任何位置。 case
或 default
標籤只能顯示在 switch
語句內。
摘自:Microsoft Visual Studio 2015 c++ Switch語句官方文件
上述所說的case
和default
本身就是標籤,就是告訴編譯器從滿足這個標籤開始向後執行,之後不會再判斷其他標籤的正確性,直到break
語句或switch
語句的作用域結束。
STEP 1 :當i=1
時,由於i!=2&&i!=4
故從default
標籤後開始執行,此時執行語句c+=i;
default(我們現在就假設編譯器幫你把c初始化為0,要知道並不是所有的編譯器都這麼友好)執行後c的值為1;
STEP 2:綜合上述1,2可知由於此時沒有碰到任何break
語句也沒到switch
語句的作用域結束(因為這個default
語句是放在第一個的)所以它接著向後執行case 2
後的語句(此時編譯器已經不看滿不滿足case
標籤了)此時執行語句c++
;執行後c的值為2;遇到break
語句跳出switch
語句。
STEP 3:當i=2
時,由於i滿足case 2
的情況,所以直接從case 2
便籤後的語句開始執行,此時執行語句c++++
,執行後執行的值為3,遇到break
語句跳出switch
語句。
STEP 4:當i=3時,跳出for
循環輸出c=3;
(上述過程為本人用 Visual Studio 2015單步調試並結合資料得出的結論)
三叔2017-07-06 10:37:10
當i=1時候進入default: c=1 沒有break 所以繼續向下匹配case 2 得c=2 break
當i=2時候優先匹配case 2 進入case 2: c=3 break
當i=3時候循環不成立。
輸出c為3