将外壳切换到开关盒内的环路内

时间:2014-01-29 09:34:15

标签: c gcc switch-statement c99

我的一个朋友刚刚开玩笑说这可能在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设计,或意外,或泄漏的抽象/实现细节泄漏?

3 个答案:

答案 0 :(得分:2)

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

在你给出的这个例子中没有多大意义,但有一些例子,即臭名昭着的Duff设备使用这种功能。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

这合法吗?是的,因为从语法上讲,您可以根据需要在交换机中嵌套多个级别的案例。这完全合法:

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

可以使用while()代替任何语句。只要它们都是有效的C语句,编译器就无需检查内部的内容。