【问题标题】:C++ Usage of switch statementC++ switch 语句的用法
【发布时间】:2011-08-25 02:15:31
【问题描述】:
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;
}

问题一> 当switch语句执行时,是直接跳转到右边的case语句还是从上往下搜索?

答案:直接跳转到正确的case语句。

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

答案:视情况而定。如果默认语句是最后一个 case 语句,则不需要使用 break。

上述问题的答案是否正确?

【问题讨论】:

  • default 语句应该总是是最后一种情况。
  • 始终小心。我有一个案例,我首先在 duff 的设备类型构造中实现了它。
  • 我想补充一点,虽然使用 fall through 是一种有效且有效的技术,但可能与您一起处理代码的其他人可能会将其视为“错误”,并希望将break 语句。忘记插入是一个相当常见的错误,所以这是可以理解的。为避免这种情况,留下评论说失败是故意的会有所帮助。
  • @Clairvoire:我通常会在有意失败时添加//nobrake 评论。

标签: c++ switch-statement


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    您对答案二是正确的,除了我要补充一点,如果它是最后一种情况 它不是并且您不希望它失败,那么在默认语句之后需要中断。但这只是吹毛求疵。

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

    【讨论】:

    • 如果禁用优化并假设你说的是对的,那么如果我把默认语句放在所有情况的前面,代码将无效。如果我没记错的话,C++ 不需要将默认值放在特定位置。
    • “如果这是最后一个案例并且您不希望它失败。但这只是一个挑剔。”...失败到哪里?这是最后一个案例!
    【解决方案3】:

    问题一> switch语句执行时,我们是不是直接向右跳转 case 语句还是我们从上到下搜索?

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-11
      • 2021-07-24
      • 2011-11-27
      • 1970-01-01
      • 2018-01-11
      • 1970-01-01
      • 2015-01-08
      相关资源
      最近更新 更多