C运算符优先级:递增和逻辑运算符

时间:2015-02-16 14:48:22

标签: c logical-operators operator-precedence pre-increment

这是我的代码。

#include <stdio.h>

#define PRINT3(x,y,z) printf("x=%d\ty=%d\tz=%d\n",x,y,z)

int main()
{
    int x,y,z;

    x = y = z = 1;
    ++x || ++y && ++z; PRINT3(x,y,z);

    return 0;
}

输出是,

x=2     y=1     z=1

我不明白这是怎么发生的。我期望的是,由于++的优先级高于&&||,因此这里的前缀操作将首先得到评估。也就是说,++x++y++z将首先得到评估。所以我预期的输出是,

x=2     y=2     z=2

有人可以帮我理解吗?提前谢谢。

我查看了this问题,但我仍然不明白为什么编译器在评估所有||之前决定评估++s。这个编译器是依赖的​​,还是在标准中定义的,每当||的操作数为1时,应该在评估另一个操作数中的其他更高优先级操作之前对其进行评估。

3 个答案:

答案 0 :(得分:2)

如果是||的第一个操作数是真的。在运行时,不评估其余表达式。因为不管剩余部分的结果如何,答案都是正确的。因此,您获得了预期的结果。

答案 1 :(得分:1)

运算符的高优先级并不能保证它将首先被计算,但它保证操作数将首先绑定(括号)。

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

将括号为

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

由于||运算符保证从左到右评估其操作数,因此将首先评估(++x)。由于在成为左操作数true时出现短路行为,因此不会评估右操作数。

答案 2 :(得分:1)

这里,编译器进行了一些优化。

与“1”进行“或”的任何操作将始终为1。 同样,任何与“1”相关的东西都是0。

编译器将根据这些评估跳过代码块。

在你的情况下,

  

++ x || ++ y&amp;&amp; ++ž

这里x&gt;所以不管你是什么,结果 都是真的。

因此,编译器只是跳过评估其余部分。

有关详细信息,请参阅Google进行“短路评估”。