c 在这两种情况下如何工作以及有啥区别
Posted
技术标签:
【中文标题】c 在这两种情况下如何工作以及有啥区别【英文标题】:how c work in this two cases and what diffc 在这两种情况下如何工作以及有什么区别 【发布时间】:2015-02-12 09:08:16 【问题描述】:为什么结果是 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
res= (x = y < 2); //|| x != 1);
printf("x = %d y = %d res= %d\n", x, y, res);
【问题讨论】:
请向我们说明并澄清您的问题。我们无法推断您在问什么。 第一个代码是如何工作的?为什么 x 是 1 而 res 是 1 ||是一个逻辑或运算符,这意味着 res 只有在其中的两个语句都返回 false 时才等于 false。 y ! 【参考方案1】: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>
<
、!=
和 ||
运算符将立即产生 1
用于“真”测试,0
用于“假”,并且没有单独的C++ 中的“标准转换”。 Allan 的回答很好地描述了 C 评估步骤。
【讨论】:
这个怎么样: res = ( x != 2 || x = y @aseed Ah yes... 对于res = ( x != 2 || x = y < 2 );
,运算符优先级规则意味着语句被解析为res = (((x != 2) || x) = (y < 2))
- 你实际上是在要求编译器为((x != 2) || x)
赋值,就好像它是一个变量,但它是一个仅在表达式求值期间存在的 true
或 false
临时值;因此编译器错误。【参考方案2】:
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 != 2 || x = y 【参考方案3】:您似乎遇到的问题是operator precedence。该链接指向一个运算符优先级图表,它应该有助于理清问题。
首先你应该知道比较结果要么是 1,要么是 0。例如,(5 10) 返回 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。
不知道你在第二点问什么,所以如果你想澄清,我会为你回答。
【讨论】:
【参考方案4】:<
的优先级高于=
,因此x = y < 2
等价于x = (y < 2)
。
由于y
大于2
,因此y < 2
将给出0
,并且此值将分配给x
。现在x
等于0
,因此x != 1
将被评估为true
,整个表达式x = y < 2 || x !=
的值将是1
,并且这个值被分配给res
。
【讨论】:
【参考方案5】:在这种情况下,运算符优先级将起作用。
res = (x = y < 2 || x != 1);
在这个表达式中,首先计算 y
然后 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.
【讨论】:
“所以 x 的值为零。然后 or(||) 将起作用” - 我想你会发现||
运算符在 之前分配给x
....以上是关于c 在这两种情况下如何工作以及有啥区别的主要内容,如果未能解决你的问题,请参考以下文章