pmp*_*pmp 4 c while-loop switch-statement
我最近遇到了下面显示的代码片段,我原以为它是一个语法错误,但令我惊讶的是,代码产生了有效的输出.
#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;
}
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)output: 2 4
编译器:GCC 6.3
我发现了一个类似的问题,但它并不能完全证明上述条件, 在C中混合'切换'和'同时'
谁能解释一下,
case X: some_statement;是一个带标签的声明(6.8.1)就像goto_label: some_statement;唯一的警告一样,case/ default标签可能只出现在一个体内switch(可能在一个任意嵌套的复合语句中).这使得case语句在switch句法上只与es 松散地耦合.
从语义上讲,switches可以实现为计算gotos,就像常规gotos一样,它们可以在任何地方跳转(在C11中,你不能跳过VLA声明),包括循环内部(参见https://en.wikipedia.org/ wiki/Duff%27s_device#另一种描述的机制).
在你的例子中,case 3:因为of而被跳过break,但是case 4:因为breakafter case 3:是一个循环中断break,而不是一个开关中断break(break/ continue总是应用于它们可以应用的最近的构造).