切换案例落入情景

时间:2014-08-30 18:05:03

标签: 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;
}

输出为16, 21。虽然我知道开关盒如何工作但我无法解释自己今年秋天的工作方式。为什么默认会被添加? K&amp; R C书没有说默认只在没有案例匹配的情况下执行吗? 感谢。

4 个答案:

答案 0 :(得分:4)

如果没有其他情况匹配,默认情况下只有switch语句跳转到。在其中一个匹配之后,代码执行就像没有case个语句一样,除非它命中break。所以default案例并没有像你期望的那样“跳过”。

K&amp; R对此有点不清楚,你所指的那条线似乎是:

  

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

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

  

因为案例就像标签一样,在完成一个案例的代码之后,除非你采取明确的行动来逃避,否则执行将进入下一个案例。

不依赖于是否存在default个案例。

C标准更清晰:

  

switch语句使控制跳转到,转换或超过作为switch主体的语句,具体取决于控制表达式的值...如果转换后的值与提升的控制表达式匹配,则控制跳转到匹配案例标签后面的陈述。否则,如果存在默认标签,则控制将跳转到带标签的语句。

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

答案 1 :(得分:1)

&#34;身体&#34; switch语句是一个连续的线性复合语句。 case标签只是 - 标签,它们定义了连续语句的不同入口点。 default标签也只是一个标签,在这方面与case标签没有区别。

通过标签进入switch复合语句后,执行将以正常方式继续:顺序一直到复合语句的结尾(在该阶段case / { {1}}标签不再扮演任何角色)。如果您想防止这种情况发生,您有责任在适当的时候跳出该复合语句。您可以使用任何跳转语句,请记住您也可以使用default(在大多数情况下这是最合适的选择)。

换句话说,break不是高度结构化的分支选择器,因为它可能在第一眼看上去。 switch只是一个略有结构化的多目标switch。它所做的就是单个运行时参数化跳转。跳跃之后的一切都是你的责任。

在您的代码示例中,您在goto复合语句的末尾放置了一个break。在那个位置上它实际上完全没有任何结果,因为无论如何复合语句都会在那里结束。

答案 2 :(得分:0)

没有&#34;休息&#34;包含在默认情况下的交换机案例中。

当使用switch语句而没有中断时, 即使找到匹配的案例,代码也会继续执行。

请参阅下面的更正代码:

    switch(i)
    {
        case 0: i+=5;
        break;
        case 1: i+=2;
        break;
        case 5: i+=5;
        break;
        default: i+= 4;
        break;
    }

答案 3 :(得分:0)

您需要在每次需要结束特定情况时添加break语句,否则它将覆盖所有案例语句