我目前正在学习 C 编程语言的基础知识,但我似乎无法弄清楚 C 如何理解以下运算符代码。下面是程序,它打印“1,1,3,0”,而我认为它应该打印“1,1,6,0”。
我尝试调整关于 y 的行,假设 C 语言从头开始读取,一旦它看到 !two,即 1,以及 ||运算符,它对自己说:“啊,|| 之后的任何内容都不重要”,并且没有将 6 分配给 1。
#include <stdio.h>
int main(void){
int one = 3, two = 1, x, y;
x = !!one && ((two = 0) != 0) || 3;
y = !two || ((one = 6) != 0) && !3;
printf("%d, %d, %d, %d", x, y, one, two);
}
所以,我尝试删除!在 !two 中,交换了 || 的顺序,这证明了我的假设。然而,当我切换 ((one = 6) != 0) 和 !3 时,1 被打印为 6。现在,我对这是如何发生的没有什么好主意。
最佳答案
这里
x = !!one && ((two = 0) != 0) || 3;
第一个 !!one
进行评估,即第一个 !one
为 0
,然后再次评估 !0
为1
即 true
,接下来是逻辑 AND &&
运算符,&&
属性是如果第一个操作数为 true
,然后仅检查第二个操作数,这在我们的例子中是正确的。
x = !!one && ((two = 0) != 0) || 3;
| | |
true --------------
(1) |
solve this now
&&
的第二个操作数是 ((two = 0) != 0)
,它首先使 two
为 0
code>(零) 然后是 0!=0
这是错误的。现在看起来像
x = true && false || 3
| |
--------
|
false || 3 <= logical OR property is if 1st operand is false then need to check second operand.
x = false || true
x = 1
所以在这个表达式x=1
和two=0
之后。
接下来,下面的表达式
y = !two || ((one = 6) != 0) && !3;
第一个 !two
首先解决,即 !0
即 1
为 true
和逻辑 OR ||
运算符属性是,如果第一个操作数为 true,则由于短路而不会计算第二个操作数。于是就变成了
y = 1;
所以在这个表达式之后
x=1
two=0
和 y=1
其余部分均保持不变,即 one
将为其初始值,即3
。所以这个
printf("%d, %d, %d, %d", x, y, one, two);
打印 1, 1, 3, 0
旁注,逻辑或||
运算符的真值表
A B A||B
------------
0 0 0
0 1 1 => If 1st operand is zero, need to evaluate 2nd operand because 2nd operand may be 0 or 1
1 0 1 => if first operand is 1(true), result is always going to true, hence don't evaluate second operand
1 1 1
逻辑与&&
运算符的真值表为
A B A&&B
------------
0 0 0
0 1 0 => If 1st operand is zero, result is always going to false, so need not to evaluate 2nd operand.
1 0 0 => if first operand is 1(true), Need to evaluate 2nd operand because 2nd operand may be 0 or 1.
1 1 1
关于c - 为什么 a = 6 在一大堆运算中不把 6 赋值给 a 呢? (C语言编程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55788664/