gpt4 book ai didi

c - 为什么 a = 6 在一大堆运算中不把 6 赋值给 a 呢? (C语言编程)

转载 作者:行者123 更新时间:2023-11-30 20:49:56 25 4
gpt4 key购买 nike

我目前正在学习 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 进行评估,即第一个 !one0,然后再次评估 !01true,接下来是逻辑 AND && 运算符,&& 属性是如果第一个操作数为 true,然后仅检查第二个操作数,这在我们的例子中是正确的。

 x = !!one && ((two = 0) != 0) || 3;
| | |
true --------------
(1) |
solve this now

&& 的第二个操作数是 ((two = 0) != 0),它首先使 two0 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=1two=0之后。

接下来,下面的表达式

y = !two || ((one = 6) != 0) && !3;

第一个 !two 首先解决,即 !01true 和逻辑 OR || 运算符属性是,如果第一个操作数为 true,则由于短路而不会计算第二个操作数。于是就变成了

y = 1;

所以在这个表达式之后x=1 two=0y=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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com