搜尋

首頁  >  問答  >  主體

c++ - 這種switch語句區塊中default放前面的情況怎麼走

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呢?

天蓬老师天蓬老师2723 天前2515

全部回覆(3)我來回復

  • 女神的闺蜜爱上我

    女神的闺蜜爱上我2017-07-06 10:37:10

    先明確一下switch中的一些注意點:

    1.

    switch 語句體由一系列 case 標籤和一個可選 default 標籤組成。 case 語句中的兩個常數表達式的計算結果不能為同一個值。 default 標籤只能出現一次。 標記語句不是語法要求,但如果它們不存在,switch 語句是無意義的。 預設語句(即default標籤)無需顯示在末尾;它可以顯示在 switch 語句體的任何位置casedefault 標籤只能顯示在 switch 語句內。
    摘自:Microsoft Visual Studio 2015 c++ Switch語句官方文件

    2.

    上述所說的casedefault本身就是標籤,就是告訴編譯器從滿足這個標籤開始向後執行,之後不會再判斷其他標籤的正確性,直到break語句或switch語句的作用域結束。

    For this problem

    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單步調試並結合資料得出的結論)

    回覆
    0
  • 三叔

    三叔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

    回覆
    0
  • 三叔

    三叔2017-07-06 10:37:10

    雷雷

    回覆
    0
  • 取消回覆