【发布时间】:2018-07-29 19:37:33
【问题描述】:
我最近遇到了如下所示的代码 sn-p,我原以为这是一个语法错误,但令我惊讶的是,该代码产生了有效的输出。
#include <stdio.h>
int main(void) {
int x = 2;
switch(x) {
case 1: printf("1"); break;
do {
case 2: printf("2 "); break;
case 3: printf("3 "); break;
} while(++x < 4);
case 4: printf("4"); break;
}
return 0;
}
output: 2 4
编译器:GCC 6.3
我发现了一个类似的问题,但它不能完全证明上述条件, Mixed 'switch' and 'while' in C
谁能解释一下,
- 这里到底发生了什么?
- 为什么不是语法错误?
- 为什么会跳过案例“3”?
【问题讨论】:
-
您提问的 Stack Overflow 中的一个 cmets 指向另一个关于 Duff’s Device 的问题。它是有效的 C,因为 case 标签的语法允许它们作为任何语句的前缀。编译器只是将它们实现为跳转指令(在其抽象机器中)。
标签: c while-loop switch-statement