c++中switch语句的用法

C++ Usage of switch statement

本文关键字:用法 语句 switch c++      更新时间:2023-10-16
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;
}