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