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

时间:2014-07-21 18:13:10

标签: c logical-operators

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

  1. 对于逻辑ANDTRUETRUE的值为TRUE,真值表的所有其他组合均为FALSE
  2. 对于逻辑OR,只有FALSEFALSE的值为FALSE。虽然真值表的所有其他组合都给出了TRUE
  3. 基于这些知识,这是第一个代码片段 -

    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的值为-1FALSE}且j1TRUE),因此TRUE AND FALSE应该等于FALSE,即-1

    但是,由于两个k and l的输出都是1,我认为C只处理逻辑ANDOR仅基于1和0 1 would be TRUE0 would be false。根据这个逻辑,任何非零值都是TRUE,所以即使-1也是TRUE

    在这种情况下,k=i&&j意味着-1&&1。由于-1和1都为TRUE,因此表达式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

    这真让我感到难过,因为我无法弄清楚Logical NOT如何在逻辑AND运算符中运行。此处j4,但k的价值是多少,这与j相比如何?我在想,因为k是not 5,它可能是-5?但在这种情况下,-54都评估为TRUE,因此k的值应为1

    请帮忙。

2 个答案:

答案 0 :(得分:5)

  

我认为第二种方法是逻辑运算符在C中工作的正确方法吗?

是。你是对的。
请记住,在C中,非零值被视为true-1也是true,对于逻辑操作,它将被视为1

k = !5 && j ;

!logical negation运营商。 !5false(C中有一个不同的运算符~用于逐位否定)。 k将成为0

答案 1 :(得分:4)

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

int j = 4, k ;
k = !5 && j ;

由于任何非零值都为真,因此NOT取消了布尔值,而不是int,因此接下来的步骤如下:

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