2011-04-25 38 views
1

民歌,C - Tricky Switch Case工作..!

最近開始學習C.
卡住了一點。它關於switch-case語句的工作。

下面的代碼:

#include<stdio.h> 

int main() { 
     int i=4; 
     switch(i) { 

       default :  
         printf("%s","Default"); 
       case 0:   
         printf("%s","Case 0"); 
       case 1:   
         printf("%s","Case 1"); 
       case 2:   
         printf("%s","Case 2"); 

     return 0; 
     } 
} 

我個人認爲,「Default」應打印,因爲它不與任何情況下的值相匹配。
但是,當我在Turbo C的運行代碼,我觀察到的是這樣的:

Default 
Case 0 
Case 1 
Case 2 

即使在這裏觀察到相同的:http://www.ideone.com/pFh1d

問題是什麼?這是編譯器問題或我的代碼中的任何錯誤?


編輯:

PS:錯這有什麼,如果在所有我必須先寫默認情況。有什麼傷害?

但是,一旦編譯器知道它必須執行默認語句,爲什麼我們需要在默認情況下的語句之後放置一個break語句?

+4

你的休息地點在哪裏?聲明? – 2011-04-25 07:33:47

+0

它是否預計每個病例會中斷? – 2011-04-25 07:34:54

+0

它不會但它會執行匹配的所有情況,直到它移出或發現中斷 – 2011-04-25 07:40:45

回答

6

該switch語句將跳轉到相應的casedefault,然後代碼將繼續,直到下一個break語句。

由於您的代碼沒有break,它將從default:開始,只需繼續執行以下所有語句即可。在編寫類似的條件時,這有時會是一個有用的技巧,但通常缺少break語句會導致混淆。

最後return也是在錯誤的地方,它應該在switch語句之後。

修改如下。

 int i=4; 
     switch(i) { 

       default :  
         printf("%s","Default"); 
         break; 
       case 0:   
         printf("%s","Case 0"); 
         break; 
       case 1:   
         printf("%s","Case 1"); 
         break; 
       case 2:   
         printf("%s","Case 2"); 
         break; 

     } 
     return 0; 
1

它與defaule相匹配,以便默認值,然後由於缺席break;所有的情況下,執行

使其如下得到您預期的結果

default :  
         printf("%s","Default"); break; 
       case 0:   
         printf("%s","Case 0");break; 
       case 1:   
         printf("%s","Case 1");break; 
       case 2:   
         printf("%s","Case 2");break; 
+0

但是,一旦編譯器知道它必須執行默認語句,爲什麼我們需要在默認情況下的語句之後放置一個break語句? – 2011-04-25 07:38:57

+0

@herbalessence查看開關案例,並在那裏解釋。 http://visualcplus.blogspot.com/2006/03/lesson-12-switch-case-break-and.html – zengr 2011-04-25 07:41:03

+0

另請參閱[this](http://www.cprogramming.com/tutorial/c/lesson5。html) – 2011-04-25 07:43:01

1

switch聲明在C語言中體是單個連續複合語句有幾個入口點。每個case/default標籤是入口點。您可以在任何入口點輸入該複合語句,並且它會一直執行到最後(除非另一個跳轉語句干預,當然)。換句話說,case標籤switch的標籤工作方式與goto標籤相同。在這方面,default標籤與case標籤沒有任何區別。

這正是您在實驗中觀察到的結果。在switch聲明如下所示

{ 
    printf("%s","Default"); 
    printf("%s","Case 0"); 
    printf("%s","Case 1"); 
    printf("%s","Case 2"); 
    return 0; 
} 

您通過您default:標籤,在開始進入這一說法。由於您在進入您的switch(除了可能錯位的最終return)身體之後沒有改變控制流程,所有四個printf都會發生「火災」變化。

以「但編譯器知道它必須執行默認語句...」開頭的問題的含義對我而言並不清楚。 C中構造的功能如上所述。這就是「編譯器知道的」。另一方面,你似乎遵循了一些完全沒有根據的自我發現的關於什麼的錯誤概念,並且出於某種原因希望編譯器遵循相同的誤解。我想說,你需要閱讀一本關於C語言基礎知識的書,而不是試圖猜測各種語言元素的作用。

首先製作default案例沒有任何問題。考慮到我上面所說的,在某些情況下,聲明中標籤的排序問題。重要的時候,你必須根據你的意圖安排他們。如果您需要將您的default箱子作爲第一個箱子,請先做好。如果你不需要它(或者沒有什麼區別),你可以把它放在最後或者你想放置的地方。

2

但是一旦編譯器知道它必須執行默認的語句,爲什麼我們需要把break語句默認case的語句之後?

因爲這是語言的工作方式。該語言的標準規定執行應該從匹配的案例標籤繼續。您可能想知道爲什麼編譯器不會自動添加break語句,在每個case之後。好吧,如果它沒有,我們就無法做到這一點:

switch(x){ 
case 1: 
case 2: 
case 3: 
// do something 
break; 
case 4: 
// do something else 
break; 
default:; 
} 

如果編譯器每種情況之後添加一個break,我們必須按如下方式重寫上面的代碼:

switch(x){ 
case 1: 
// do something 
case 2: 
// do the same thing 
case 3: 
// do the same thing 
case 4: 
// do something else 
default: 
} 
1

根據標準,程序員必須在每種情況下手動放置中斷,即使它是默認情況。 如果程序員不是地方中斷意味着它將執行所有情況下的情況。 標準在開關內將這種類型的開關編程稱爲FALL THROUGH條件。