我的一个朋友刚刚开玩笑说这可能在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设计,或意外,或泄漏的抽象/实现细节泄漏?
答案 0 :(得分:2)
这是合法的。 switch
的依赖部分实际上只是一个任意的语句或块,case
和default
标签只需要满足其他标签的规则,即为语句添加前缀。
在你给出的这个例子中没有多大意义,但有一些例子,即臭名昭着的Duff设备使用这种功能。
答案 1 :(得分:0)
标准示例/解释是Duff的设备:http://en.wikipedia.org/wiki/Duff's_device
我建议你阅读这篇文章然后提出一个精确的问题,如果还有不清楚的地方。
答案 2 :(得分:0)
这合法吗?是的,因为从语法上讲,您可以根据需要在交换机中嵌套多个级别的案例。这完全合法:
switch(a)
{
case 1: break;
{
{
case 2: break;
}
}
}
可以使用while()代替任何语句。只要它们都是有效的C语句,编译器就无需检查内部的内容。