2014-01-29 169 views
1

我的一個朋友剛剛開玩笑說,這可能在C,我對此迴應:不可能。原來,這是可能的,沒有任何警告編譯。在開關盒內的迴路內開關盒

#include "stdio.h" 

int main(){ 

    int x = 1; 

    switch(x) { 
     case 1: 
      printf("1\n"); 

      while(1) { 
       case 2: 
        printf("bad 2\n");   
      } 
      break; 

     default: 
      printf("default\n"); 
      break;   
    } 

} 

設置在無限循環中打印bad 2所有的時間x 1或2的結果。

爲什麼?這是怎麼回事,這甚至是合法的?

我使用GCC 4.8.2,Windows中,-std=c99 ...


編輯:這個問題是關於爲什麼是合法的,如果是合法的,因爲當。例子很好,但不是我的問題的目標。我想知道,如果整個case標籤的放置都是有意識的C設計,或者是意外事故,或者泄漏的抽象/實現細節泄露?

+3

哦達夫,你在哪裏? –

回答

2

這是合法的。 switch的相關部分實際上只是一個任意語句或塊,casedefault標籤只是爲了實現其他標籤的規則,即爲語句添加前綴。

在這個例子中,你給了這個沒有多大意義,但也有一些例子,即臭名昭着的Duff設備使用這種功能。

+0

是的,我會在短時間內讀到達夫的,但只會對待一個例子。我所要求的一般是,如果這是合法的C(從那以後?從那以後?),也許,爲什麼這是合法的? Java永遠不會允許編寫這樣的代碼 - 開關/案例是一個單獨的構造,而在C中,似乎(請確認),該案例只是一個標籤? – Parobay

+0

@Parobay,我確實回覆了那個不?它符合C標準,並且符合其任何版本。對於你的問題「爲什麼?」,我的猜測是C被認爲是一種簡單的語言,在語法上。與其他任何控制結構相關的依賴結構都是語句或塊。 –

+0

http://en.wikipedia.org/wiki/Duff%27s_device#Mechanism這是相當不錯的 – Parobay

0

這合法嗎?是的,這是因爲在語法上,您可以根據需要在交換機內嵌入儘可能多層次的案例。這是完全合法的:

switch(a) 
{ 
case 1: break; 
{ 
    { 
     case 2: break; 
    } 
} 
} 

而且可以使用while()來代替任何語句。只要它們都是有效的C語句,編譯器就不用費心檢查裏面的內容。