c++中switch语句的用法
C++ Usage of switch statement
int i = 10;
switch( i )
{
case 1:
// do sth1
break;
case 2:
// do sth2
break;
case 3:
// do sth3
break;
default:
// do sth default
break;
}
问题1>当switch语句执行时,我们是直接跳到右边的case语句,还是从上到下搜索?
答案:直接跳到右case语句
问题2>我们应该在默认语句之后使用break语句吗?
回答:视情况而定。如果默认语句是最后一个case语句,则不需要使用break。
以上问题我的答案正确吗?
问题1:取决于编译器。c++标准不要求建立跳转表。
在许多情况下,特别是在少量稀疏情况下,GCC、MSVC和其他编译器将逐句检查(就好像它是if语句一样)。举个例子,假设您的案例分别是1、15和1000000。从代码的角度来看,直接跳转是不高效的。
gcc有-fno-jump-tables
选项强制它构建等价的if-else列表。
问题2:最后一个子句不需要break语句。
你的答案是正确的,除了我要补充的是,如果它是最后一个case 或它不是,那么在默认语句之后需要一个break,你不想让它掉下去。但那只是个小问题。
问题1的答案取决于是否启用了优化以及编译器有多聪明。如果优化是低或禁用(或你的编译器只是旧的和/或不是很复杂),它会做一个搜索从上到下跳过默认情况下(感谢q0987)。如果优化被启用并且编译器决定这样做,它将被优化成一个跳转表,在这种情况下,它将直接跳转到正确的case。
问题1>当switch语句执行时,我们是否直接跳到右边还是从上到下搜索?
我认为标准中没有提到这个实现细节。但是,你的答案是正确的。
问题2>我们应该在默认语句之后使用break语句吗?
是的,这取决于需求。有时你可能根本不需要它。考虑这种情况,你想对default:
做点什么而对case 1:
做点小一点的。例如,
switch(i)
{
default: foo();
case 1: bar();
break;
case 2: abc();
break;
case 3: xyz();
break;
}
- 我的简单if-else语句是如何无法访问的代码
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- 为什么是0;C++中的有效语句
- 这个指针在c++中的用法
- Insert函数不适用于2 if语句C++
- If语句未被求值C++
- C++嵌套if语句,基本货币交换
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 是否可以使用if constexpr删除控制流语句
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 我似乎对if/else的基本语句有问题:/
- 当调用switch语句中的函数时(即使函数不包含循环),似乎是永不结束的循环的问题
- If语句在c++中被忽略
- 比较if语句中的数组值和int值
- 以在Qt中的IF语句中设置时间延迟
- Craps游戏问题,忽略if语句
- "类模板示例<int>;"语句对 C++11 是什么意思?
- 如何编写一个使用n倍三元条件语句的C++布尔函数
- c++中switch语句的用法