同时循环C中的开关案例

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)
output: 2 4
Run Code Online (Sandbox Code Playgroud)

编译器:GCC 6.3

我发现了一个类似的问题,但它并不能完全证明上述条件, 在C中混合'切换'和'同时'

谁能解释一下,

  1. 究竟发生了什么?
  2. 为什么不是语法错误?
  3. 为什么会跳过"3"的情况?

PSk*_*cik 5

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总是应用于它们可以应用的最近的构造).