[英]Why does it print 1 at the end?
我不明白为什么它最后会打印 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(当您将两个数字 AND 在一起时,除非其中一个或两个数字为 0,否则您将得到 true)。 尝试将-2&&2
更改为true && false
; 它会打印 0。
基于布尔算术运算,表达式-2&&2
恢复为1
或true
( true
总是!= 0
,而false == 0
)。
这是它恢复到1
:
&&
表示逻辑AND
,而不是按位AND
,即 C 中的&
。所以您对-2
和2
的值进行逻辑AND
运算。
让我们将以下句子视为逻辑与 ( &&
) 运算的语句之一:
如果两个操作数都不为零,则条件为真。
-2
非零,等于1
。
2
也是非零的,等于1
。
所以结果也是1
( 1
AND 1
= 1
) 或true
代表1
。
&&
运算符用于逻辑与,而不是按位与。
程序中的表达式计算为
printf("%d\n", (-2 != 0) && (2 != 0));
这是1
因为布尔表达式在 C 中的值为0
表示假,值为1
表示真。
相反,如果您编写了-2 & 2
,则您的程序将具有实现定义的行为,具体取决于用于目标系统的负整数的表示。 在具有二进制补码表示的现代系统上,此按位和表达式的计算结果为2
。 符号幅度表示的相同值,但在具有补码表示的罕见系统上,该值将为0
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.