C中的逻辑运算符与实际的逻辑运算有何不同?

C中的逻辑运算符与实际的逻辑运算有何不同?,c,logical-operators,C,Logical Operators,我有以下代码片段,根据我对逻辑运算符如何工作的了解,我对输出有点困惑。据我所知(基于电子学中的真值表) 对于逻辑和,真和真给出的值为真,真值表的所有其他组合给出的值为假 对于逻辑或,只有FALSE和FALSE给出了FALSE的值。而真值表的所有其他组合给出真值 基于这些知识,第一个代码片段- void main( ) { int i = -1, j = 1, k ,l ; k = i && j ; l = i || j ; printf ( "%d %d\n", i, j ) ;

我有以下代码片段,根据我对逻辑运算符如何工作的了解,我对输出有点困惑。据我所知(基于电子学中的真值表)

  • 对于逻辑
    给出的值为
    ,真值表的所有其他组合给出的值为
  • 对于逻辑
    ,只有
    FALSE
    FALSE
    给出了
    FALSE
    的值。而真值表的所有其他组合给出
    真值
    基于这些知识,第一个代码片段-

    void main( )
    {
    int i = -1, j = 1, k ,l ;
    k = i && j ;
    l = i || j ;
    printf ( "%d %d\n", i, j ) ;
    printf("%d %d", k,l);
    }
    
    给出输出-

    -1 1
    1 1
    
    我在这里感到困惑,因为根据逻辑AND和OR的真值表,k的值应该是-1。这是因为
    i
    的值是
    -1
    (即
    FALSE
    )和
    j
    的值是
    1
    (即
    TRUE
    ),因此
    TRUE
    FALSE
    应等于
    FALSE
    ,即
    -1

    然而,由于
    k和l的输出都是1,我认为C仅基于1和0处理逻辑
    ,其中
    1为真
    ,而
    0为假
    。根据这个逻辑,任何非零值都是真的,因此即使是
    -1
    也将是
    真的

    在这种情况下,
    k=i&&j
    意味着
    -1&&1
    。由于-1和1都为真,因此表达式
    k=i&&j
    的计算结果为
    TRUE
    ,即1。按照相同的逻辑,
    l=i | | j
    也计算为
    TRUE

    我认为第二种方法是逻辑运算符在C语言中工作的正确方式,对吗

    我的第二个问题是关于下一个代码片段-

    void main( )
    {
    int j = 4, k ;
    k = !5 && j ;
    printf ( "\nk = %d", k ) ;
    }
    
    这将产生输出
    k=0

    这真的让我很困惑,因为我无法理解逻辑
    NOT
    如何在逻辑
    AND
    运算符中工作。这里的
    j
    4
    ,但是
    k
    的值是多少,这与
    j
    相比如何?我在想,既然k是
    而不是5
    ,它可能是
    -5
    ?但是在这种情况下,
    -5
    4
    都计算为
    TRUE
    ,因此
    k
    的值应该是
    1

    请帮忙

    我认为第二种方法是逻辑运算符在C语言中工作的正确方式,对吗

    对。你走对了。
    请记住,在C中,非零值被视为
    true
    -1
    也是
    真的
    ,对于逻辑运算,它将被像
    1
    一样对待。


    是一个运算符<代码>!5
    false
    (C中有一个不同的运算符
    ~
    用于位求反)
    k
    将变为
    0

    关于第二个关于(逻辑)否定的问题:

    int j = 4, k ;
    k = !5 && j ;
    
    由于任何非零值都为真,NOT将对布尔值而不是int求反,因此接下来的步骤如下所示:

    k = !true && true
      = false && true
      = false
    

    你的假设是错误的。C中的任何非零值都是真的,零是假的,其中包括-1(视为真)与:相关,并且可以理解,非常感谢。但是,我仍然不清楚第二个代码段,其中逻辑AND中使用了逻辑NOT。你能帮忙吗?@DarkKnight;请参阅更新。短路仅对副作用(如在表达式的跳过部分调用UB)很重要<代码>~
    不是求反而是按位补码,一种位运算…@重复数据消除程序;我认为按位不,补码和否定是一回事@重复数据消除器;为什么不呢?
    k = !true && true
      = false && true
      = false