C 运算符中的优先级 == 和 ( = )

Precedence in C operators == and ( = )

我要分析C中的一些代码做了什么,我对某行发生了什么有疑问。密码是

#define PRINTX printf("%d\n", x)

void problem() { 
    int x = 2, y, z;
    x *= 3 + 2; PRINTX;
    x *= y = z = 4; PRINTX;
    x = y == z; PRINTX;
    x == (y = z); PRINTX; // This line is the problem
} 

此代码片段打印结果数字:

10
40
1
1  // This result **

问题是我仍在尝试弄清楚为什么在操作为 x == (y = z) 时最后一行打印出 x = 1。我无法找出 1 的含义和操作的优先级。希望可以有人帮帮我! :)

在最后一条语句中,没有任何内容改变 x 的值。我们正在测试 x 是否等于某个值,但我们不会更改它的值。

因此它继续具有与前一个语句中相同的值,特别是值 1。

原因是因为 == 运算符检查 2 个数字是否相等,returns 如果相等则为 1,如果不相等则为 0,这就是为什么它 returns 可以检查的原因x= 1 和 y=2 并在它们之间使用 == 运算符

最后一条语句没有改变 x 的值,所以它的值保持不变。


Parens 用于覆盖优先级,强制 = 成为 == 的操作数。

运算符的操作数必须先于运算符本身求值,因此我们知道以下内容:

  • y=.
  • 之前的某个时间点求值
  • z=.
  • 之前的某个时间点求值
  • x==.
  • 之前的某个时间点求值
  • ===.
  • 之前的某个时间点求值

就是这样。所有这些都是有效的订单:

  • z y = x ==
  • y z = x ==
  • x y z = ==
  • 等等

但是每当 xyz 被评估时,我们可以指望发生以下情况:

  1. =z 的值(当前为 4)分配给 y 和 returns 它。
  2. ==x 的值(当前为 1)与 = 返回的值(4)进行比较。由于它们不同,== returns 0(没有被任何东西使用)。

如您所见,没有任何变化 x,因此它仍然具有之前的值 (1)。

x的比较结果和y(y = z)的赋值被丢弃。最后一行可能会删除比较:y = z; PRINTX;.

后来也没有使用赋值,所以该行可能是 PRINTX;