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

标签 c

我目前正在学习 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/

相关文章:

c - C 中 _int8 数据类型的格式说明符

在for循环中创建线程: all threads passed same "i" value

c - 无法使用 fgets 函数读取字符串

c - gdb如何检测pthread?

iphone - Objective-C 的内置 rand() 函数的确切算法是什么?

c - 在并行环境中使用 fork、exec 和管道时出现死锁

c - 我们如何使用靶心覆盖工具执行行/语句覆盖?

c - C中的三元运算符

c - 结果错误

c - Linux内核有main函数吗?