你认为这种糟糕的编码风格吗?

时间:2011-08-31 18:26:18

标签: c coding-style

我今天看到了这段代码:

 if(++counter == 10)
{

 //Do Something
 foo();

 }

我认为这是一种糟糕的风格,但是,执行编译器依赖于它吗?比如在我们到达这一行之前计数器设置为8,它会增加它,然后比较10到8,之前的值,或比较10到9,计数器增加后的值?

你觉得怎么样?这是常见做法吗?坏风格?

4 个答案:

答案 0 :(得分:12)

在此代码的行为中没有任何编译器依赖(除了可能的溢出行为)。是否一个好的风格是个人喜好的问题。我一般不会在条件限制中进行修改,但有时它可能有用甚至优雅。

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

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

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

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

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

答案 1 :(得分:2)

运算符优先级总是会导致在比较之前发生增量。如果你想明确这一点,你可以使用括号,但我不会称这种错误的编码风格。

答案 2 :(得分:0)

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

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

这样你就不需要考虑事情的顺序 - 没有混淆的余地。它对生成的代码没有任何影响,如果是这样,可读性和可维护性问题总是很重要。

答案 3 :(得分:0)

它是由语言标准定义的,它是否是一种不好的风格是个人偏好和背景的问题。我有一个使用与此类似的条件的函数,我认为它看起来非常好用,并且当增量将从条件中取出时,我认为它将不太可读。

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变量上的++完成消除为常量。