【问题标题】:declaring variables as locally as possible and switch statement尽可能在本地声明变量和 switch 语句
【发布时间】:2013-05-18 16:59:02
【问题描述】:

一些著名的代码风格书籍建议尽可能将变量声明为本地( https://stackoverflow.com/a/10205934/700825)
我的问题是:switch 语句是否不受此规则的约束?例如,如果所有(或大多数)案例具有相似的结构,并且它们都将字符串用于类似的事情,那么应该在每种情况下还是在切换之前声明该字符串?

【问题讨论】:

  • 代码风格是建议,而不是硬性规定。为了促进代码重用和可读性,它们通常是很好的建议,但它们仍然只是建议。像所有建议一样,用户(在这种情况下是您)需要考虑何时应该遵循它们以及何时不那么重要......通常如果不清楚需要发布它,它就不是那么重要.

标签: c++ c switch-statement


【解决方案1】:

就这样吧?

switch(cond)
{
    case 1:
    {
      // An inner scope...
      int x;
    }
    break;
}

【讨论】:

    【解决方案2】:

    检查是否可以在函数中封装您打算在 case-break 块中使用的代码。我建议只在案例语句中调用函数/方法,但不要有大的代码块。

    另一种可能性是在 switch-break 中使用 {}。例如:

    case 1:
    {
       int i=0;
    }
    break;
    

    应该可以。

    【讨论】:

      【解决方案3】:

      我建议您尽可能将它们保留在本地

      注意:

      switch(1) {
          case 1: int x = 0; // initialization
                  std::cout << x << '\n';
                  break;
          default: // compilation error: jump to default: would enter the scope of 'x'
                   // without initializing it
                   std::cout << "default\n";
                   break;
      }
      

      记得保护每个 case 块:

      switch(1) {
          case 1: {  int x = 0;
                     std::cout << x << '\n';
                     break;
                  } // scope of 'x' ends here
          default: {
                     std::cout << "default\n"; // no error
                     break;
                   }
      }
      

      参考:http://en.cppreference.com/w/cpp/language/switch

      【讨论】:

      • default 块也应该受到同样的保护,即使只是为了保持一致性。
      【解决方案4】:

      规则声明declare vars as local as possible
      首先请记住,这只是一个非常好的建议,而不是实际规则。

      但除此之外,如果所有案例都具有相似的结构,并且您决定在案例之前声明一个变量,那么在这种情况下它仍然尽可能局部。

      【讨论】:

        【解决方案5】:

        在性能方面没有显着差异。事实上,在 case 中声明变量可能比提前声明要好一些。在可读性方面,最好形成自然的变量组,即在每个案例中声明变量。

        【讨论】:

        • -1 表示“在性能方面没有差异”。这是一个为时过早的结论,即使它相当合理。
        • @Potatoswatter 一切都需要在某个时候进行初始化。我无法想象无论是在案件内部还是在切换之前发生任何变化。无论如何,任何半体面的编译器都可以移动公共元素。
        • 任何获取资源的对象都会在执行不使用它的案例块时产生影响。即使影响很小。
        • 优化通常包括组合相关操作以跳过不必要的步骤。如果编译器可以告诉在一种情况下字符串是用一些字符初始化的,那么它不需要事先将其初始化为空,但在 switch 之前声明它可能会强制它这样做。这是否会产生可衡量的差异取决于应用程序。
        • @CaptainObvlious 所以就性能而言,将东西放在箱子里会更好。我想我的回答过于保守,不支持内部案例方法。稍微编辑了我的答案以反映这一点。
        猜你喜欢
        • 1970-01-01
        • 2021-11-24
        • 2010-11-16
        • 1970-01-01
        • 2010-11-10
        • 2020-12-27
        • 1970-01-01
        相关资源
        最近更新 更多