switch中的嵌套case语句

时间:2017-01-08 13:31:55

标签: c loops switch-statement

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

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

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

2 个答案:

答案 0 :(得分: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,并且当i2时,循环将结束。

答案 1 :(得分:1)

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

如果i==1i==4,代码会跳转到那里,因此sum变为2。值0,2和3会导致switch跳转default标签,这是一条continue;指令,导致循环进行下一次迭代。

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