我不明白为什么它最后会打印1。
#include <stdio.h>
int main(){
printf("%d\n", -2&&2);
return 0;
}
答案 0 :(得分:4)
&&
是 Boolean 运算符,而不是 integer 运算符。在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)
这具有严格的类型一致性,因为!=
具有来自整数操作数的布尔结果,因此&&
仅具有布尔操作数而没有隐式转换。
答案 1 :(得分:0)
因为-2&&2
的取值为true
= 1(当您将两个数字与在一起时,除非一个或两个数字均为0,否则您将得出true)。
尝试将-2&&2
更改为true && false
;它将显示0。
答案 2 :(得分:0)
基于布尔算术运算的表达式-2&&2
恢复为1
或true
(true
始终为!= 0
,而false == 0
) 。
这是恢复到1
的方式:
&&
代表C中的逻辑AND
,而不是按位的AND
,它是&
。因此,您需要对-2
的值进行逻辑与运算2
。
让我们将以下句子视为逻辑AND(&&
)-运算的陈述之一:
如果两个操作数都不为零,则条件变为true。
-2
非零,等于1
。
2
也非零,等于1
。
所以结果也是1
(1
AND 1
= 1
)或true
代表1
。
答案 3 :(得分:0)
&&
运算符用于逻辑和,而不用于按位和。
程序中的表达式的计算结果为
printf("%d\n", (-2 != 0) && (2 != 0));
哪个是1
,因为在C语言中布尔表达式的值0
为假,1
为真。
相反,如果您编写了-2 & 2
,则程序将具有实现定义的行为,具体取决于用于目标系统的负整数的表示形式。在具有二进制补码表示形式的现代系统上,此按位与表达式的计算结果为2
。符号幅度表示的值相同,但在带有补码表示的稀有系统上,该值为0
。