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
你得到 res
和 x
等于 1
而 y
不变。
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。
不确定你在第二位问什么,所以如果你想澄清我会为你回答。
为什么结果是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
你得到 res
和 x
等于 1
而 y
不变。
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。
不确定你在第二位问什么,所以如果你想澄清我会为你回答。