令人困惑的switch语句行为

时间:2016-06-27 08:55:49

标签: c++

我看到了这段代码,我预计输出为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)+默认情况。我不明白为什么它会像那样工作。

任何关于一步一步发生的事情的方向都会很棒!

4 个答案:

答案 0 :(得分:8)

如果您未在break案例陈述中使用switch,则代码不会在匹配案例评估中停止,而是继续执行下面的所有其他案例陈述,直到找到breakswitch语句完成。

在这个例子中,第一个匹配的情况是为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)

cc++ switch语句中,行为与文明goto语句相似。每个case都是一种标签,执行转到相应的标签,然后经过其他案例。因此,如果您不希望在一个案例之后执行其他案例,则必须在每break后使用case