C语言 交换机中的嵌套大小写语句



所以我已经为此苦苦挣扎了一段时间,我不明白为什么会这样。

int main(void)
{
    int sum = 0;
    for(int i = 0; i < 10; i++) {
        switch(i) {
            case 1: case 4: case 7: sum++;
            default: continue;
            case 5: break;
        }
        break;
    }
    printf("%d", sum);
}

输出:

2

我无法在其他任何地方找到有关嵌套案例语句的任何信息。

switch(i) {
    case 1: case 4: case 7: sum++;
    default: continue;
    case 5: break;
}

以上可以等效地重写为

switch(i) {
    case 1:
    case 4:
    case 7: sum++;
    default: continue;
    case 5: break;
}

案件14表现出失败。这意味着执行进入下一个 case 语句。最终导致所有三种情况都执行相同的代码。

需要注意的有趣部分是,default也是一个有效的标签。而且它不必最后出现!如果删除 continue 语句,则执行将从default继续case 5,循环将在i 2时结束。

它们不是嵌套的。它们只是同一sum++;指令的三个标签。

代码在i==1i==4的情况下跳到那里,因此sum变得2。值 0、2 和 3 会导致switch跳转 default 标签,这是一个continue;指令,导致循环进行下一次迭代。

i==5,开关以内部break;指令终止,执行进入switch(i){...}之后的break。这会导致循环终止,因此i变量永远不会达到值 7,sum保持 2。

最新更新