令人困惑的开关语句行为
Confusing switch statement behaviour
我看到了这段代码,我希望输出是 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 语句,直到找到break
或switch
语句完成。
在此示例中,对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
在c
和c++
switch
语句中,语句的行为类似于文明的goto
语句。每个case
都是标签,执行到相应的标签,然后经历其他情况。因此,如果您不希望在一次case
之后执行其他案例,则必须在每次后使用break
。
相关文章:
- C 和 C++ 中开关语句的案例标签的常量值,但显示不同的行为
- 为什么布尔开关语句有编译器警告?
- 如何使用"equal to"以外的评估编写开关语句
- 有没有办法在C++将字符串与开关语句一起使用?
- 带有开关语句的 do-while 循环 -- 无穷循环错误
- 如何在不同的开关大小写语句上使用对象的类成员函数?
- C++实用程序,用于将长开关语句转换为封装开关案例阶梯的简洁函数调用
- 如何循环开关语句直到找到所需的数字?
- 使用开关大小写语句抽取随机扑克牌等级和花色以显示用户
- 带有关闭/打开布尔值的开关语句
- 清理开关语句
- 我的开关语句在C++中不起作用
- 枚举和开关语句C++
- 如何在开关语句中使用 cin "as a parameter"
- 重构开关或 if/else 语句?
- "constexpr if"比开关语句好吗?
- C++ 默认值在开关语句中不起作用
- 初学者C :为什么此开关语句给我一个错误
- C 开关语句无法正常工作
- 为什么允许在开关语句中声明变量?但不是声明 初始化