c 在这两种情况下如何工作以及有什么区别

how c work in this two cases and what diff

为什么结果是x=1 y=3 res=1

    int x = 7, y = 3;
    int res;
    res = (x = y < 2 ||  x != 1);
    printf("x = %d    y = %d    res = %d\n", x, y, res);

使用此代码,结果是 y<2 所以 False 是 0 所以左值 x = 0 所以 res=0

    res= (x = y < 2);  //||  x != 1);
    printf("x = %d    y = %d    res= %d\n", x, y, res);

< 的优先级高于 =,因此 x = y < 2 等同于 x = (y < 2)

由于 y 大于 2,因此 y < 2 将给出 0,并且此值将分配给 x。现在 x 等于 0 因此 x != 1 将被计算为 true 并且整个表达式 x = y < 2 || x != 的值将是 1 并且这个值分配给 res

 res = (x = y < 2 ||  x != 1);

在上面的语句中 y < 2 || x != 1 是一个条件表达式,其结果是 true (1) 被加载到 x.

现在,(x = y < 2 || x != 1) 评估为 x = 1,因此 res = x = 1

你得到 resx 等于 1y 不变。

res = (x = y < 2 ||  x != 1);

...被评估为...

res = (x = ((y < 2) || (x != 1)));

您可以找到 C++ 的运算符优先级 here - C 与您使用的运算符相似。

所以 x = 7, y = 3...

res = (x = ((3 < 2) || (7 != 1)));

res = (x = (false || true));  // || is "logical-OR", tests if either true

res = (x = true);

res = (x = 1);   // standard conversion from bool to int

res = 1;

第二个更简单的陈述:

 res = (x = y < 2);
 res = (x = (y < 2));
 res = (x = (3 < 2));
 res = (x = false);
 res = (x = 0);  // standard conversion from bool false to int 0
 res = 0;

在 C 中,即使您 #include <stdbool.h> <!=|| 运算符也会立即为 "true" 测试产生 1 , 0 代表 "false",并且没有像 C++ 中那样单独的 "standard conversion"。 Allan 的回答很好地描述了 C 评估步骤。

在这种情况下,运算符优先级将起作用。

res = (x = y < 2 ||  x != 1);

在此表达式中,首先计算 y < 2。

然后 or(||) 会起作用,因为第一个条件不成立,所以现在 x 不等于 1。所以条件将变为真,所以真值 1 存储在 x 和 res 变量中。

(y < 2 || x != 1 ). // expression is true. So the value 1 is stored in the variable x and ret.

第二种情况,

y < 2; // this condition will become false. So the zero is stored in both the variable.

您似乎遇到的问题是 operator precedence。 link 是一个运算符优先级图表,应该有助于解决问题。

首先,您应该知道比较结果要么是 1,要么是 0。例如,(5 < 10) returns 1 因为它为真,而 (5 > 10) returns 0 因为它是假的。

在你的例子中,如果我们通过添加括号来说明事情发生的顺序来澄清它会更容易。

res = (x = **(y < 2)** ||  **(x != 1)**)

这是发生的第一组操作。在这些解决之后,我们剩下:

res = (x = **(0)** ||  **(1)**)

下一个要进行的操作是 OR:

res = (x = **(0 || 1)** )

结果为 1:

res = (x = **1** )

然后赋值操作发生:

res = (**x = 1**)

然后下一个赋值发生:

 **res = x**

由于前面赋值的x等于1,res也被设置为1。

不确定你在第二位问什么,所以如果你想澄清我会为你回答。