所以我遇到了一个有竞争力的问题(询问输出)如下:
#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书没有说默认只在没有案例匹配的情况下执行吗?
感谢。
答案 0 :(得分:4)
如果没有其他情况匹配,默认情况下只有从switch
语句跳转到。在其中一个匹配之后,代码执行就像没有case
个语句一样,除非它命中break
。所以default
案例并没有像你期望的那样“跳过”。
K&amp; R对此有点不清楚,你所指的那条线似乎是:
如果案例与表达式值匹配,则在该情况下开始执行。所有案例表达必须不同。如果不满足其他任何情况,则执行标记为default的案例
但这是在讨论switch
语句如何分支。下一步行为在下一页:
因为案例就像标签一样,在完成一个案例的代码之后,除非你采取明确的行动来逃避,否则执行将进入下一个案例。
不依赖于是否存在default
个案例。
C标准更清晰:
switch语句使控制跳转到,转换或超过作为switch主体的语句,具体取决于控制表达式的值...如果转换后的值与提升的控制表达式匹配,则控制跳转到匹配案例标签后面的陈述。否则,如果存在默认标签,则控制将跳转到带标签的语句。
一旦控件跳转,case
和default
标签就不再重要了。
答案 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语句,否则它将覆盖所有案例语句