【问题标题】:Precedence in C operators == and ( = )C 运算符 == 和 ( = ) 中的优先级
【发布时间】:2021-03-16 05:47:09
【问题描述】:

我必须分析 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
} 

这段代码 sn-p 打印结果数字:

10
40
1
1  // This result **

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

【问题讨论】:

  • 请不要写像#define PRINTX printf("%d\n", x)这样可怕的宏。教你这样做的人不应该在教。

标签: c logical-operators operator-precedence assignment-operator


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • OP 询问为什么x最后一行 之后是1。你在解释倒数第二行,他们似乎并不好奇。
    【解决方案3】:

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


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

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

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

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

    • zy=x==
    • yz=x==
    • xyz===

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

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

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

    【讨论】:

      【解决方案4】:

      x 的比较结果以及y(y = z) 的赋值被丢弃。最后一行可能会放弃比较:y = z; PRINTX;

      该分配随后也未使用,因此该行可能是PRINTX;

      【讨论】:

        猜你喜欢
        • 2021-03-29
        • 2013-07-31
        • 2014-11-09
        • 1970-01-01
        • 2013-02-24
        • 2017-06-02
        • 1970-01-01
        • 2013-02-09
        相关资源
        最近更新 更多