2009-12-16 113 views
7

我只是写了下面的代码行:正确使用

if (++(data_ptr->count) > threshold) { /*...*/ } // example 1 

我的意图是递增的数据结构中的count变量data_ptr点然后再与threshold进行比较,并且这一行代码有效。

如果我不是想在进行比较之前增加data_ptr,我会写这样的:

if ((++data_ptr)->count > threshold) { /*...*/ } // example 2 

出于好奇,我也试了这行代码:

if (++data_ptr->count > threshold) { /*...*/ } // example 3 

而且发现它的行为与第一个完全相同。

第一个问题:为什么没有示例#3的工作方式与示例#1相同?这是运营商优先的问题吗?标准中的东西?我不得不写一个快速测试程序,因为答案对我来说并不明显。

第二个问题:我应该用不同的方式写这个if陈述吗?我可以先在自己的行上执行增量,然后测试条件以避免任何可能的混淆。这是必要的,还是前两个例子自己显而易见?

回答

11

1)优先

2)优先

+3

1简洁。 '' –

3
  1. - >运算符绑定比++更紧密。
  2. 他们都很好定义,我认为他们很容易阅读。如果你在同一个表达式中增加了对data_ptr的引用,那么事情就会变得狡猾。
5

是的,这是一个运算符优先级的问题。箭头运算符has higher precedence比增量运算符。

要回答你的第二个问题,我想这种类型的构造出一般分成两个单独的语句:

++(data_ptr->count); 
if(data_ptr->count > threshold) { /*...*/ } 

这强调了是怎么回事,并消除可能的混淆。但是,这可能是一个偏好问题。

5
  1. 运算符优先级决定了你所观察到的行为。
  2. 如果你在这个例子中将增量与比较分开,但是有时候你想要在条件序列的中间有一个增量的条件,然后尝试将增量与测试分开可以通过引入否则将不必要的嵌套来伤害代码的可读性。

例如:

if (...1...) 
    ...2... 
else if (++data_ptr->count > threshold) 
    ...3... 
else 
    ...4... 

对战:

if (...1...) 
    ...2... 
else 
{ 
    ++data_ptr->count; 
    if (data_ptr->count > threshold) 
     ...3... 
    else 
     ...4... 
}