Switch Case 失败场景

Jis*_*han 4 c switch-statement fall-through

所以我遇到了一个有竞争力的问题(询问输出)如下:

#include <stdio.h>
int main()
{
    int i = 0;
    for(i = 0; i < 20; i++)
    {
        switch(i)
        {
            case 0: i+=5;
            case 1: i+=2;
            case 5: i+=5;
            default: i+= 4;
            break;
        }
        printf("%d ", i);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是16, 21。虽然我知道 switch case 是如何工作的,但我无法解释这个秋天是如何工作的。为什么要添加默认值?K&R C 书不是说只有在没有任何情况匹配时才执行默认值吗?
谢谢。

Pat*_*ins 5

默认情况下只跃升至switch如果没有其他情况相匹配的语句。在其中一个匹配后,代码会像没有任何case语句存在一样执行,除非它遇到break. 所以这个default案子并没有像你期望的那样“跳过”。

K&R对此有点不清楚,您所指的这条线似乎是:

如果 case 与表达式值匹配,则从该 case 开始执行。所有 case 表达式必须不同。如果不满足任何其他情况,则执行标记为 default 的情况

但这是在谈论switch语句如何分支。Fallthrough 行为在下一页:

因为 case 只是作为标签,在一个 case 的代码完成后,除非你采取明确的行动来逃避,否则执行会一直执行到下一个 case。

这不取决于是否有default案例。

C标准更清晰:

switch 语句导致控制跳转到、进入或跳过作为 switch 主体的语句,具体取决于控制表达式的值……如果转换后的值与提升的控制表达式的值匹配,则控制跳转到下面的语句匹配的大小写标签。否则,如果存在默认标签,则控制跳转到带标签的语句。

一旦控制跳转,casedefault标签就不再重要了。