Man*_*iri 0 c logical-operators
我有以下代码片段,并且基于我对逻辑运算符如何工作的了解,输出有点混淆.据我所知(基于电子学中的真值表),
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);
}
Run Code Online (Sandbox Code Playgroud)
给出输出 -
-1 1
1 1
Run Code Online (Sandbox Code Playgroud)
我在这里很困惑,因为根据逻辑AND和OR的真值表,k的值应该是-1.这来自以下事实的值i是-1(这是FALSE)并且j是1(这是TRUE),所以TRUE AND FALSE应等于FALSE,即,-1.
但是,由于两者的输出都是1 k and l,我认为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 ) ;
}
Run Code Online (Sandbox Code Playgroud)
产生输出 k=0
这真让我感到难过,因为我无法弄清楚NOT逻辑AND运算符中Logical的工作原理.这j是4,但它的价值是什么k,以及它与之相比如何j?我想是因为k not 5,它可能是-5?但是,在这种情况下,-5和4这两个计算结果为TRUE,所以价值k应该是1.
请帮忙.
我是否认为第二种方法是逻辑运算符在C中工作的正确方法?
是.你是对的.
请记住,在C中,非零值被视为true.-1也是true,它将被视为1逻辑操作.
在
k = !5 && j ;
Run Code Online (Sandbox Code Playgroud)
!是一个逻辑否定运算符.!5是false(~在C中有一个不同的运算符用于逐位否定).k将成为0.