我今天看到了这段代码:
if(++counter == 10)
{
//Do Something
foo();
}
我认为这是一种糟糕的风格,但是,执行编译器依赖于它吗?比如在我们到达这一行之前计数器设置为8,它会增加它,然后比较10到8,之前的值,或比较10到9,计数器增加后的值?
你觉得怎么样?这是常见做法吗?坏风格?
答案 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变量上的++完成消除为常量。