2013-03-06 40 views
1

此代碼工作原因,但它沒有任何意義。Mingling開關,而在C

#include <stdio.h> 

int main(void) 
{ 
    switch(1) 
    { 
     case 0: 
     while(1) 
      { 
      case 1: puts("Works"); break; 
      } 
    } 
    return 0; 
} 

有人可以解釋爲什麼它的工作和這有什麼應用程序?

+4

http://c-faq.com/misc/duff.html – NPE 2013-03-06 18:54:04

+0

@ 0A0D這是一個不同的問題! – saadtaame 2013-03-06 18:56:41

+0

@saadtaame:看起來和我一樣。這是達夫的裝置。 – 2013-03-06 18:58:38

回答

4

您可以通過switch標籤交錯語句,因爲他們只是標籤。這裏發生的是:

  • 你有一個無限循環定義使用while (1);
  • switch (1)聲明跳轉到case 1:標籤;
  • 其中"Works"被打印,然後break;退出無限循環。
8

case標籤幾乎與goto所使用的標籤完全相同。 如果你用這些術語來考慮你的代碼,應該清楚它是有效的。也就是說,您可以將switch聲明視爲榮耀條件goto

也就是說,我會打擊任何在生產環境中編寫代碼的人。


  1. 事實上,它們都在C99標準的相同語法部分(6.8.1)中列出。

  2. 是的,這與Duff's device幾乎相同,但最後幾十年前有任何實際用途。

+0

如果可能的話,指向標準的鏈接? (或確切的部分:D) – saadtaame 2013-03-06 18:58:10

+0

@saadtaame:請參閱我的答案中的腳註! – 2013-03-06 18:58:34

+0

我看到它在模仿C中的異常的代碼中使用。 – saadtaame 2013-03-06 19:02:27

5

這部作品的原因是有些不直觀:一個switch陳述行爲case標籤非常像普通標籤,即設計用於goto發言的人。您可以在代碼中的任何位置放置此類標籤。

事實證明,同樣的規則適用於case標籤:您可以將它們放置在其對應的switch語句中的任意位置,該語句順便包含任何嵌套循環的主體。

爲什麼您可能希望switch聲明的正文中,裏面放上控制語句標籤的理由更不直觀的:事實證明,你可以進行循環使用稱爲Duff's Device繁瑣的前瞻性,但非常直觀的結構展開。正是這種結構導致了在switch陳述中將外殼標籤嵌入其他控制結構的想法。

+0

謝謝。什麼是循環展開?我感興趣 – saadtaame 2013-03-06 19:01:26

+1

@saadtaame循環展開(AKA「循環展開」)是當您重複幾次循環(比如四次)時,同時減少循環執行的次數。這樣可以減少迭代次數,從而減少每次迭代成本(檢查退出條件和增加索引)。這是[鏈接到wiki文章](http://en.wikipedia.org)./wiki/Loop_unwinding – dasblinkenlight 2013-03-06 19:03:56