1

这段代码出于某种原因有效,但它根本没有意义。

#include <stdio.h>

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

有人可以解释它为什么起作用以及它有什么应用程序吗?

4

3 回答 3

8

case标签几乎与goto. 1 如果您以这些术语考虑您的代码,则应该清楚它是有效的。即,您可以将switch语句视为美化的 conditional goto

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


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

  2. 是的,这与Duff 的设备几乎相同,但最后一次在几十年前有任何实际用途。

于 2013-03-06T18:54:42.210 回答
5

这样做的原因有点不直观:语句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.

于 2013-03-06T18:56:48.953 回答
4

您可以通过 的标签交错语句switch,因为它们只是标签。这里发生的是:

  • 您使用while (1);定义了一个无限循环
  • switch (1)语句跳转到标签case 1:
  • where"Works"被打印出来,然后break;退出无限循环。
于 2013-03-06T18:56:17.517 回答