令人困惑的开关语句行为

Confusing switch statement behaviour

本文关键字:语句 开关      更新时间:2023-10-16

我看到了这段代码,我希望输出是 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 和 3( 或 (3 和 5( + 默认大小写。我不明白为什么它会那样工作。

任何

关于正在逐步发生的事情的方向都会很棒!

当您不在 switch case 语句中使用 break 时,代码不会在匹配大小写计算处停止,而是继续执行下面的所有其他 case 语句,直到找到breakswitch语句完成。

在此示例中,对x == 3执行第一个匹配案例,然后继续执行以下所有语句,从而导致17结果。

您可以在此处阅读有关此原因的更多信息

  • 为什么 switch 语句设计为需要休息?

你忘了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;

switch 语句中的案例会下降到下一个,除非您添加 break . 即,当你给它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;

参见

  • C++ 语法:switch

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