繁体   English   中英

为什么最后打印1?

[英]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恢复为1truetrue总是!= 0 ,而false == 0 )。

这是它恢复到1

&&表示逻辑AND ,而不是按位AND ,即 C 中的& 。所以您对-22的值进行逻辑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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM