Mingling开关和C语言

saa*_*ame 1 c while-loop switch-statement

此代码由于某种原因起作用,但它根本没有意义.

#include <stdio.h>

int main(void)
{
  switch(1)
    {
      case 0:
        while(1)
          {
            case 1: puts("Works"); break;
          }
    }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么它确实有效以及它有什么应用程序?

Oli*_*rth 8

case标签几乎与使用的标签完全一样goto.1 如果您在这些条款中考虑您的代码,应该清楚它是有效的.也就是说,你可以认为一个switch声明是一个美化的条件goto.

也就是说,我会打击任何在生产环境中编写代码的人.2


  1. 实际上,它们都列在C99标准的相同语法部分(6.8.1)中.

  2. 是的,这几乎与Duff的设备完全相同,但是几十年前它已经有了实际应用.


das*_*ght 5

其工作原因有些不直观:语句的case标签switch非常类似于常规标签,即设计用于goto语句的标签.您可以在代码中的任何位置放置此类标签.

事实证明,相同的规则适用于case标签:您可以将它们放在相应switch语句中的任何位置,这些语句偶然包含任何嵌套循环的主体.

你可能想要在语句正文中的控制语句中放置标签的原因switch甚至更不直观:事实证明你可以使用一个看起来很麻烦但非常直观的Duff's Device构造来执行循环展开.正是这种结构导致了将switch语句标签嵌入语句中的其他控制结构中的想法.