#include <stdio.h>
int main()
{
int x, y, z;
x=y=z=1;
z = ++x || ++y && ++z;
printf("%d, %d, %d", x, y,z);
return 0;
}
我得到输出 2, 1, 1。我需要解释为什么输出中 Y 为 1?
最佳答案
||
运算符是短路;如果左操作数求值,则不会计算右操作数(并且永远不会执行副作用,即变量永远不会递增)到!= 0。
(请记住,“乘法先于加法”,或者在 bool 逻辑中 AND 位于 OR 之前。由于运算符优先,表达式变成完全括起来的 (++x) || ((++y) && (++z))
;换句话说,||
右侧的所有内容都是 OR 被忽略的右侧。)
左操作数++x
的计算将x
增加到2。z
被赋予结果的 bool 值>||
一直都是 1。
If a side effect on a scalar object is unsequenced relative to [...] a value computation using the value of the same scalar object, the behavior is undefined.
标准为此给出了i =++i + 1;
的示例。在您的右侧表达式 z
中扮演这个角色。副作用是增量,值计算是 &&
子表达式。
++x
永远不为 0 并省略测试。复杂 bool 表达式的生成代码将归结为 x 的增量。
关于c - 具有整数增量的 bool 表达式给出意想不到的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40747843/