【问题标题】:Switch case inside a loop inside a switch case [duplicate]开关盒内循环内的开关盒[重复]
【发布时间】:2014-01-29 09:34:15
【问题描述】:

我的一个朋友刚刚开玩笑说这在 C 中是可能的,我的回答是:不可能。事实证明这是可能的,并且可以在没有任何警告的情况下编译。

#include "stdio.h"

int main(){

    int x = 1;

    switch(x) {
        case 1: 
            printf("1\n");

            while(1) {
                case 2:
                    printf("bad 2\n");          
            }
            break;

        default:
            printf("default\n");
            break;          
    }

}

x 设置为 1 或 2 会导致无限循环一直打印 bad 2

为什么?这是怎么回事,这怎么合法???

我正在使用 GCC 4.8.2、Windows、-std=c99 ...


编辑:这个问题是关于为什么它是合法的,如果它是合法的,以及从什么时候开始。例子很好,但不是我的问题的目标。我想知道,在任何地方放置 case 标签是有意识的 C 设计,还是意外,还是抽象/实现细节泄漏?

【问题讨论】:

  • 噢,达夫,你去哪儿了?

标签: c gcc switch-statement c99


【解决方案1】:

这是合法的。 switch 的依赖部分实际上只是一个任意语句或块,casedefault 标签只需要满足其他标签的规则,即为语句添加前缀。

在您给出的示例中,这并没有多大意义,但是有一些示例,即臭名昭著的 Duff 设备使用了这种功能。

【讨论】:

  • 是的,我会立即阅读有关 Duff 的信息,但将仅作为示例。我要问的是,一般来说,如果这是合法的 C(从什么时候开始?因为总是?),也许,为什么这是合法的? Java 永远不会允许编写这样的代码 - switch/case 是一个单独的构造,而在 C 中,似乎(请确认),那个 case 只是一个标签?
  • @Parobay,我确实回复了没有?它符合 C 标准,并且符合其任何版本。对于您的问题“为什么?”,我的猜测是 C 在语法上被认为是一种简单的语言。依赖结构是任何其他控制结构的语句或块。
【解决方案2】:

对此的标准示例/解释是 Duff 的设备:http://en.wikipedia.org/wiki/Duff's_device

我建议你阅读这篇文章,如果还有不清楚的地方,请提出一个精致的问题。

【讨论】:

    【解决方案3】:

    这合法吗?是的,这是因为从句法上讲,您可以在 switch 中嵌套任意多个级别的 case。这是完全合法的:

    switch(a)
    {
    case 1: break;
    { 
        {
            case 2: break;
        }
    }
    }
    

    while() 可以用来代替任何语句。只要它们都是有效的 C 语句,编译器就不会检查里面的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多