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

Precedence in C operators == and ( = )

提问人:AgusBFU 提问时间:12/4/2020 最后编辑:EugeneAgusBFU 更新时间:12/4/2020 访问量:59

问:

我必须分析 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 = 1,而操作是 .我很难弄清楚 1 的含义和操作的优先级。希望有人能帮助我!:)x == (y = z)

C 符 运 优先级赋 值运算符

评论

0赞 Lundin 12/4/2020
请不要写可怕的宏,比如 .谁教你这样做,就不应该是教书。#define PRINTX printf("%d\n", x)

答:

0赞 Bill Lynch 12/4/2020 #1

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

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

0赞 abhinav bandaru 12/4/2020 #2

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

评论

0赞 ikegami 12/4/2020
OP问为什么在最后一之后。你正在解释倒数第二行,他们似乎并不奇怪。x1
3赞 ikegami 12/4/2020 #3

最后一个语句中没有任何内容更改 的值,因此其值保持不变。x


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

运算符的操作数必须在运算符本身之前进行计算,因此我们知道以下几点:

  • y在 之前的某个时间点进行计算。=
  • z在 之前的某个时间点进行计算。=
  • x在 之前的某个时间点进行计算。==
  • =在之前的某个时间点进行评估。==

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

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

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

  1. =将 (current ) 的值赋值并返回它。z4y
  2. ==将 (current) 的值与 () 返回的值进行比较。由于它们是不同的,因此返回(没有被任何东西使用)。x1=4==0

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

0赞 chux - Reinstate Monica #4

放弃 with 的比较结果和赋值。最后一行可能会删除比较:。xy(y = z)y = z; PRINTX;

随后也没有使用该赋值,因此该行可能是 .PRINTX;