此代碼工作原因,但它沒有任何意義。Mingling開關,而在C
#include <stdio.h>
int main(void)
{
switch(1)
{
case 0:
while(1)
{
case 1: puts("Works"); break;
}
}
return 0;
}
有人可以解釋爲什麼它的工作和這有什麼應用程序?
此代碼工作原因,但它沒有任何意義。Mingling開關,而在C
#include <stdio.h>
int main(void)
{
switch(1)
{
case 0:
while(1)
{
case 1: puts("Works"); break;
}
}
return 0;
}
有人可以解釋爲什麼它的工作和這有什麼應用程序?
您可以通過switch
標籤交錯語句,因爲他們只是標籤。這裏發生的是:
while (1)
;switch (1)
聲明跳轉到case 1:
標籤;"Works"
被打印,然後break;
退出無限循環。case
標籤幾乎與goto
所使用的標籤完全相同。 如果你用這些術語來考慮你的代碼,應該清楚它是有效的。也就是說,您可以將switch
聲明視爲榮耀條件goto
。
也就是說,我會打擊任何在生產環境中編寫代碼的人。
事實上,它們都在C99標準的相同語法部分(6.8.1)中列出。
是的,這與Duff's device幾乎相同,但最後幾十年前有任何實際用途。
這部作品的原因是有些不直觀:一個switch
陳述行爲case
標籤非常像普通標籤,即設計用於goto
發言的人。您可以在代碼中的任何位置放置此類標籤。
事實證明,同樣的規則適用於case
標籤:您可以將它們放置在其對應的switch
語句中的任意位置,該語句順便包含任何嵌套循環的主體。
爲什麼您可能希望您switch
聲明的正文中,裏面放上控制語句標籤的理由更不直觀的:事實證明,你可以進行循環使用稱爲Duff's Device繁瑣的前瞻性,但非常直觀的結構展開。正是這種結構導致了在switch
陳述中將外殼標籤嵌入其他控制結構的想法。
謝謝。什麼是循環展開?我感興趣 – saadtaame 2013-03-06 19:01:26
@saadtaame循環展開(AKA「循環展開」)是當您重複幾次循環(比如四次)時,同時減少循環執行的次數。這樣可以減少迭代次數,從而減少每次迭代成本(檢查退出條件和增加索引)。這是[鏈接到wiki文章](http://en.wikipedia.org)./wiki/Loop_unwinding – dasblinkenlight 2013-03-06 19:03:56
http://c-faq.com/misc/duff.html – NPE 2013-03-06 18:54:04
@ 0A0D這是一個不同的問題! – saadtaame 2013-03-06 18:56:41
@saadtaame:看起來和我一樣。這是達夫的裝置。 – 2013-03-06 18:58:38