这段代码出于某种原因有效,但它根本没有意义。
#include <stdio.h>
int main(void)
{
switch(1)
{
case 0:
while(1)
{
case 1: puts("Works"); break;
}
}
return 0;
}
有人可以解释它为什么起作用以及它有什么应用程序吗?
这段代码出于某种原因有效,但它根本没有意义。
#include <stdio.h>
int main(void)
{
switch(1)
{
case 0:
while(1)
{
case 1: puts("Works"); break;
}
}
return 0;
}
有人可以解释它为什么起作用以及它有什么应用程序吗?
case
标签几乎与goto
. 1 如果您以这些术语考虑您的代码,则应该清楚它是有效的。即,您可以将switch
语句视为美化的 conditional goto
。
也就是说,我会打任何在生产环境中编写类似代码的人。2
事实上,它们都列在 C99 标准的同一语法部分 (6.8.1) 中。
是的,这与Duff 的设备几乎相同,但最后一次在几十年前有任何实际用途。
这样做的原因有点不直观:语句case
的标签switch
与常规标签非常相似,即为与goto
语句一起使用而设计的标签。您可以在代码中的任何位置放置此类标签。
事实证明,同样的规则也适用于case
标签:您可以将它们放在相应switch
语句中的任何位置,其中顺便包括任何嵌套循环的主体。
The reasons why you may want to place labels inside control statements within the body of your switch
statement are even less intuitive: it turns out that you can perform loop unrolling with a cumbersome-looking but very intuitive construct called Duff's Device. It is this construct that lead to popularizing the idea of embedding case labels inside other control structures within switch
statements.
您可以通过 的标签交错语句switch
,因为它们只是标签。这里发生的是:
while (1)
;定义了一个无限循环switch (1)
语句跳转到标签case 1:
;"Works"
被打印出来,然后break;
退出无限循环。