Mingling开关和C语言

时间:2013-03-06 18:52:25

标签: c while-loop switch-statement

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

#include <stdio.h>

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

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

3 个答案:

答案 0 :(得分:8)

case标签几乎与goto使用的标签完全相同。 1 如果您在这些条款中考虑您的代码,则应该清楚它是有效的。也就是说,您可以将switch语句视为荣耀条件goto

那就是说,我会打击在生产环境中编写代码的人。 2

<小时/> <子>

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

  2. 是的,这几乎与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;退出无限循环。