2011-09-09 84 views
3

可能重复:
why "++x || ++y && ++z" calculate "++x" firstly ? however,Operator "&&" is higher than "||"运算符优先级

下面的程序似乎并不如预期的工作。 '& &'比'||'具有更高的优先权,所以实际的输出是令人困惑的。任何人都可以解释o/p吗?

#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    int x; 
    int y; 
    int z; 

    x = y = z = 1; 

    x++ || ++y && z++; 

    printf("%d %d %d\n", x, y, z); 

    return 0; 
} 

实际输出为:2 1 1

TIA。

+0

另一个http://stackoverflow.com/questions/7212482/problem-with-operator-precedence – AnT

回答

5

评价的优先顺序和顺序有没有任何关系。具有较高优先级比||

&&只是意味着表达被解释为

x++ || (++y && z++); 

因此,||左手操作数被第一评价(因为有一个序列点后它需要) ,并且由于它评估的结果不是零,因此从不评估右侧操作数(++y && z++)

1

运算符优先级规则意味着,如果它写的表达式处理:

x++ || (++y && z++); 

由于x++为真,则||表达的RHS不计算在所有 - 因此你看到的结果。

2

混乱的行被解析,好像它是:

x++ || (++y && z++); 

那么这是评估左到右。由于||是一个短路评估器,一旦评估了左侧,它就知道整个表达式将评估为真值,因此它会停止。因此,x会增加,并且不会触及yz