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

Man*_*iri 0 c logical-operators

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

  1. 对于逻辑AND,TRUETRUE给出TRUE真值表给出的值和所有其他组合FALSE.
  2. 对于逻辑OR,只有FALSEFALSE给出的值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)并且j1(这是TRUE),所以TRUE AND FALSE应等于FALSE,即,-1.

但是,由于两者的输出都是1 k and l,我认为C处理逻辑AND并且OR仅基于1和0,其中1 would be TRUE0 would be false.根据这个逻辑,任何非零值都是TRUE,所以即使-1TRUE.

在那种情况下,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的工作原理.这j4,但它的价值是什么k,以及它与之相比如何j?我想是因为k not 5,它可能是-5?但是,在这种情况下,-54这两个计算结果为TRUE,所以价值k应该是1.

请帮忙.

hac*_*cks 5

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

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

k = !5 && j ;
Run Code Online (Sandbox Code Playgroud)

!是一个逻辑否定运算符.!5false(~在C中有一个不同的运算符用于逐位否定).k将成为0.