我看到了这段代码,我预计输出为6,但我得到了17。
int x = 3;
switch (x)
{
case 1: { x += x; }
case 3: { x += x; }
case 5: { x += x; }
default: { x += 5; }
}
std::cout << x;
为什么x
会变成17?通过选择案例3并退出switch语句,它不应该变为6吗?
即使在案例3之后它会经历默认情况,x
也只会是11.我看到x
将成为17的唯一方法是通过案例(1&amp; 3)或(3&amp; 5)+默认情况。我不明白为什么它会像那样工作。
任何关于一步一步发生的事情的方向都会很棒!
答案 0 :(得分:8)
如果您未在break
案例陈述中使用switch
,则代码不会在匹配案例评估中停止,而是继续执行下面的所有其他案例陈述,直到找到break
或switch
语句完成。
在这个例子中,第一个匹配的情况是为x == 3
执行的,然后它继续执行以下所有语句,结果导致17
。
您可以在此处详细了解相关原因:
答案 1 :(得分:5)
你忘记了break;
指令。当你切换案例时,c ++从第一个案例运行到真正的中断。所以你的代码是这样的:
int x = 3;
switch (x)
{
case 1: { x += x; } // ignored
case 3: { x += x; } // goes in
case 5: { x += x; } // still executes, because of no break
default: { x += 5; } // still executes, because of no break
}
std::cout << x;
答案 2 :(得分:2)
除非您添加break
,否则switch语句中的个案会转到下一个。即,当你给它3
时,它运行案例3,直到案例5
,然后进入默认情况。
为避免这种情况,请在案例结束时添加break;
:
int x = 3;
switch (x)
{
case 1: { x += x; break; }
case 3: { x += x; break; }
case 5: { x += x; break; }
default: { x += 5; break; }
}
std::cout << x;
答案 3 :(得分:1)
在c
和c++
switch
语句中,行为与文明goto
语句相似。每个case
都是一种标签,执行转到相应的标签,然后经过其他案例。因此,如果您不希望在一个案例之后执行其他案例,则必须在每break
后使用case
。