我有以下代码片段,并且基于我对逻辑运算符如何工作的了解,输出有点混淆。据我所知(基于电子学中的真值表),
AND
,TRUE
和TRUE
的值为TRUE
,真值表的所有其他组合均为FALSE
。OR
,只有FALSE
和FALSE
的值为FALSE
。虽然真值表的所有其他组合都给出了TRUE
。 基于这些知识,这是第一个代码片段 -
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
AND
FALSE
应该等于FALSE
,即-1
。
但是,由于两个k and l
的输出都是1,我认为C只处理逻辑AND
和OR
仅基于1和0 1 would be TRUE
和0 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
运算符中运行。此处j
为4
,但k
的价值是多少,这与j
相比如何?我在想,因为k是not 5
,它可能是-5
?但在这种情况下,-5
和4
都评估为TRUE
,因此k
的值应为1
。
请帮忙。
答案 0 :(得分:5)
我认为第二种方法是逻辑运算符在C中工作的正确方法吗?
是。你是对的。
请记住,在C中,非零值被视为true
。 -1
也是true
,对于逻辑操作,它将被视为1
在
k = !5 && j ;
!
是logical negation运营商。 !5
是false
(C中有一个不同的运算符~
用于逐位否定)。 k
将成为0
。
答案 1 :(得分:4)
关于你关于(逻辑)否定的第二个问题:
int j = 4, k ;
k = !5 && j ;
由于任何非零值都为真,因此NOT取消了布尔值,而不是int,因此接下来的步骤如下:
k = !true && true
= false && true
= false