此代码由于某种原因起作用,但它根本没有意义。
#include <stdio.h>
int main(void)
{
switch(1)
{
case 0:
while(1)
{
case 1: puts("Works"); break;
}
}
return 0;
}
有人可以解释它为什么会起作用以及它有什么应用程序?
答案 0 :(得分:8)
case
标签几乎与goto
使用的标签完全相同。 1 如果您在这些条款中考虑您的代码,则应该清楚它是有效的。也就是说,您可以将switch
语句视为荣耀条件goto
。
那就是说,我会打击在生产环境中编写代码的人。 2
<小时/> <子>
事实上,它们都列在C99标准的相同语法部分(6.8.1)中。
是的,这几乎与Duff's device完全相同,但最后几十年前有任何实际用途。
答案 1 :(得分:5)
其工作原因有些不直观:case
语句的switch
标签与常规标签非常相似,即设计用于goto
语句的标签。您可以在代码中的任何位置放置此类标签。
事实证明,相同的规则适用于case
标签:您可以将它们放在相应的switch
语句中的任何位置,这些语句偶然包含任何嵌套循环的主体。
您可能希望将标签放在switch
语句正文中的控制语句中的原因更不直观:事实证明,您可以使用繁琐的方式执行循环展开 - 但非常直观的构造称为Duff's Device。正是这种结构导致在switch
语句中推广将案例标签嵌入其他控制结构的想法。
答案 2 :(得分:4)
您可以通过switch
标签交错语句,因为它们只是标签。这里发生的是:
while (1)
; switch (1)
语句跳转到case 1:
标签; "Works"
,然后break;
退出无限循环。