C语言中的运算符优先级?

Sta*_*eon 1 c operator-precedence

int x=12;
int y=7;
int z=19;
int sum;

sum = ++x >= y * 2 || y % 2 && z++ % 2;
Run Code Online (Sandbox Code Playgroud)

我对运算符优先级有点困惑?编译器在上面的代码中读取的第一个条件是什么?它是否会首先评估,y % 2 && z++ % 2因为&&优先级高于||,或者编译器仍然会从左到右并短路(如果最左边++x >= y * 2为真)?即编译器将按以下方式读取代码?

sum = (++x >= y * 2 || y % 2 )&& z++ % 2;
Run Code Online (Sandbox Code Playgroud)

Bat*_*eba 6

您的表达被分组为

(++x >= (y * 2)) || ((y % 2) && (z++ % 2))
Run Code Online (Sandbox Code Playgroud)

并且这被分配给sum. 这是由C语法指定的。

另请注意,如果左侧为 : ,则不会评估 的右侧||1意味着z在这种情况下 不会递增。

  1. 为避免疑问,++x是 的xz++是 的z

  2. 另请注意,因为||是一个排序点x++,所以即使您将 写在右侧,该表达式也会得到很好的定义,而不是z++

  3. 调用此结果sum是一种混淆练习。


sep*_*p2k 5

求值顺序与优先级(或与此相关的关联性)无关。&&优先级高于的事实||告诉您a || b && c相当于a || (b && c)。这并不告诉您是否a首先b && c进行评估。

||在和 的情况下&&,标准指定首先计算左操作数(如果左操作数分别计算为 true(在 的情况下||)或 false(在 的情况下&&),则根本不计算右操作数)。所以在 中a || (b && c),我们知道顺序是a, b, then c(假设所有三个最终都被评估)。

对于大多数其他运算符,标准没有指定评估顺序,因此,例如, in a + b * c,我们知道它相当于a + (b * c),但我们不知道是否a在之前评估b * c,也不知道是否b在之前评估c