C ++ switch语句的用法

时间:2011-08-25 02:15:32

标签: c++ 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语句还是从上到下搜索?

回答:直接跳转到正确的案例陈述。

问题2 >我们应该在默认语句后使用break语句吗?

回答:取决于。如果default语句是最后一个case语句,则不需要使用break。

我是否在上述问题中得到了正确答案?

3 个答案:

答案 0 :(得分:4)

问题1:取决于编译器。 C ++标准不要求设置跳转表。

在许多情况下,特别是在稀疏案例数量较少的情况下,GCC,MSVC和其他编译器将进行逐条款检查(就像它是if语句一样)。举个例子,假设您的案例是1,15和1000000.直接跳转在代码方面效率不高。

gcc有选项-fno-jump-tables来强制它构建等效的if-else列表。

问题2:最后一个子句不需要break语句。如果执行应该向下流动,则应该省略它。

答案 1 :(得分:1)

对于答案二你是正确的,除非我在默认语句之后添加一个中断,如果它是最后一个案例它不是,你不希望它失败。但这只是一个挑剔。

问题1的答案取决于是否启用了优化以及编译器的智能程度。如果优化很低或禁用(或者您的编译器只是旧的和/或不是非常复杂),它将从上到下跳过默认情况(谢谢q0987)。如果启用了优化并且编译器决定执行此操作,它将被优化为跳转表,在这种情况下,它将直接跳转到正确的大小写。

答案 2 :(得分:0)

  

问题1> 当switch语句执行时,我们是否直接跳到右侧   案例陈述或我们从上到下进行搜索?

我认为标准中没有提及此实施细节。但是,你的答案是正确的。

  

问题2> 我们应该在默认声明后使用break语句吗?

是的,这取决于要求。有时您可能根本不需要它。考虑一下这种情况,你想为default:案例做些什么,而对于case 1:来说,则要做点小事。例如,

switch(i)
{
  default: foo();
  case 1:  bar();
           break;
  case 2:  abc();
           break;
  case 3:  xyz();
           break;
}