2011-08-31 110 views
1

我看到这个代码今天:你认为这种糟糕的编码风格?

if(++counter == 10) 
{ 

//Do Something 
foo(); 

} 

我觉得这是不好的风格,但是,是执行编译器相关的藏汉?说我们到达这条线之前计数器设置为8,它将增加它,然后比较10到8,之前的值,或比较10到9之后计数器的值增加后的值?

你觉得呢?这是常见的做法吗?不好的风格?

+0

这是不寻常的和坏的风格,但其含义是精确的,不依赖于编译器。 –

回答

12

在这段代码的行为中,除了可能的溢出行为外,没有任何编译器依赖。这是否是一种好风格是个人喜好的问题。我通常避免在条件中进行修改,但有时它可能是有用的,甚至是优雅的。

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

换句话说,的++counter == 10评价可以进行如下

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

或作为

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

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

+1

+1你基本上已经涵盖了OP的问题的所有方面。 –

2

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

+0

我不知道这是不是一种错误的编码风格,但它有点令人困惑。我的意思是,当你第一次看到它时,你会在心理上问自己,如果'++'是一个问题。 –

0

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

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

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

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变量消除为常量。