【问题标题】:Do you consider this bad coding style?你认为这种糟糕的编码风格吗?
【发布时间】:2011-08-31 18:26:17
【问题描述】:

我今天看到了这段代码:

 if(++counter == 10)
{

 //Do Something
 foo();

 }

我认为这是不好的风格,但是,执行编译器是否也依赖于?假设计数器在我们到达这一行之前设置为 8,它会增加它,然后比较 10 和 8,之前的值,或者比较 10 和 9,增加之后的值?

你怎么看?这是常见的做法吗?风格不好?

【问题讨论】:

  • 这是一种不常见的坏风格,但它的含义是精确的,不依赖于编译器。

标签: c coding-style


【解决方案1】:

这段代码的行为与编译器无关(除了可能的溢出行为)。风格好不好,看个人喜好了。我通常避免在条件句中进行修改,但有时它会很有用,甚至很优雅。

此代码保证将 new 值与 10 进行比较(即在您的示例中将 9 与 10 进行比较)。正式地说,比较发生在 counter 递增之后是不正确的。这里没有“之前”或“之后”。甚至在将新值物理放入counter 之前,就可以预先计算新值并与 10 进行比较。

换句话说,++counter == 10 的评估可以这样进行

counter = counter + 1
result = (counter == 10)

或作为

result = ((counter + 1) == 10)
counter = counter + 1

请注意,在第一种情况下,counter 在比较之前递增,而在第二种情况下,它在比较之后递增。这两种情况在实践中都是有效且完全可能的。这两种情况都会产生语言规范要求的相同结果。

【讨论】:

    【解决方案2】:

    运算符优先级将始终导致在比较之前发生增量。如果你想让这个非常明确,你可以使用括号,但我不会称之为糟糕的编码风格。

    【讨论】:

    • 不知道是不是不好的编码风格,但是有点混乱。我的意思是当你第一次看到它时,你会在心里问自己++是否有问题。
    【解决方案3】:

    就我个人而言,我总是将其分成两个陈述。

    counter++;
    if (counter == 10)
        DoSomething();
    

    这样你就不需要考虑事情发生的顺序——没有混乱的余地。它对生成的代码没有任何影响,如果是这样,可读性和可维护性问题始终是王道。

    【讨论】:

      【解决方案4】:

      语言标准对它进行了很好的定义,它是否是一种糟糕的风格是个人喜好的问题,也是上下文的问题。我有一个使用与此类似的条件的函数,我认为它看起来和工作起来都非常好,并且我认为当从条件中取出增量时,它的可读性会降低。

      const char *GetStat(int statId)
      {
        int id = 0;
        if (statId==id++)
        {
          return "Buffers";
        }
        else if (statId==id++)
        {
          return "VBuffers";
        }
      #ifndef _XBOX
        else if (statId==id++)
        {
          return "Reset factor";
        }
      #endif
        else if (statId==id++)
        {
          return "CB Mem";
        }
        return "";
      }
      

      注意:这里的增量实际上根本没有“执行”,一个体面的编译器会将在 id 变量上完成的 ++ 消除为常量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-23
        • 1970-01-01
        • 2015-09-02
        • 1970-01-01
        • 2014-01-05
        • 2011-10-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多