我不明白为什么它在最后打印 1。
#include <stdio.h>
int main(){
printf("%dn", -2&&2);
return 0;
}
&&
是一个布尔运算符,而不是整数运算符。 在 C 中,任何非零值在应用于布尔运算时都会被解释为true
,而零是应用于布尔运算时被视为false
的唯一整数值。
所以:
(<non-zero> && <non-zero>) == true
相反,当true
结果被视为整数时(在这种情况下,%d
格式说明符指示(,true
用 1 表示,而false
为零。 所以在这种情况下,true
变成 1。
如果要打印布尔结果,则:
printf( "%sn", (-2 && 2) == 0 ? "false" : "true" ) ;
严格表达式:
-2 && 2
相当于:
(-2 != 0) && (2 != 0)
它具有严格的类型一致性,因为!=
具有整数操作数的布尔结果,因此&&
仅使用布尔操作数呈现,没有隐式转换。
>因为-2&&2
的计算结果是true
= 1(当你和两个数字在一起时,除非其中一个或两个数字都是0,否则你会得到true(。 尝试将-2&&2
更改为true && false
;它将打印 0。
表达式-2&&2
恢复为1
或true
(true
总是!= 0
,而false == 0
(基于布尔算术运算。
以下是它如何恢复1
:
&&
表示逻辑AND
,而不是按位AND
,后者在C中&
。所以你正在逻辑地和-2
和2
的值.
让我们将以下句子视为逻辑 AND (&&
( 操作的语句之一:
如果两个操作数都不为零,则条件变为 true。
-2
不为零,等于1
。
2
也是非零的,等于1
。
所以结果也是1
(1
和1
=1
(或true
表示1
。
&&
运算符用于逻辑和,而不是按位和。
程序中的表达式计算结果为
printf("%dn", (-2 != 0) && (2 != 0));
这很1
,因为在 C 中,布尔表达式的值0
for false,1
true 的值。
相反,如果您编写了-2 & 2
,则程序将具有实现定义的行为,具体取决于用于目标系统的负整数的表示形式。在具有 2 补码表示的现代系统上,此按位和表达式的计算结果为2
。符号量级表示的值相同,但在具有补码表示的稀有系统上,该值将是0
。