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