c++ - 這種switch語句區塊中default放前面的情況怎麼走
天蓬老师
天蓬老师 2017-07-06 10:35:10
0
3
2453
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呢?

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回覆(3)
女神的闺蜜爱上我

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

三叔

當i=1時候進入default: c=1 沒有break 所以繼續向下匹配case 2 得c=2 break
當i=2時候優先匹配case 2 進入case 2: c=3 break
當i=3時候循環不成立。
輸出c為3

三叔

雷雷

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!