为什么在最后打印1?

时间:2019-12-08 08:58:57

标签: c

我不明白为什么它最后会打印1。

#include <stdio.h>
int main(){
    printf("%d\n", -2&&2);
    return 0;
}

4 个答案:

答案 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恢复为1truetrue始终为!= 0,而false == 0) 。

这是恢复到1的方式:

&&代表C中的逻辑AND,而不是按位的AND,它是&。因此,您需要对-2的值进行逻辑与运算2

让我们将以下句子视为逻辑AND(&&)-运算的陈述之一:

  

如果两个操作数都不为零,则条件变为true。

-2非零,等于1

2也非零,等于1

所以结果也是11 AND 1 = 1)或true代表1

答案 3 :(得分:0)

&&运算符用于逻辑和,而不用于按位和

程序中的表达式的计算结果为

printf("%d\n", (-2 != 0) && (2 != 0));

哪个是1,因为在C语言中布尔表达式的值0为假,1为真。

相反,如果您编写了-2 & 2,则程序将具有实现定义的行为,具体取决于用于目标系统的负整数的表示形式。在具有二进制补码表示形式的现代系统上,此按位与表达式的计算结果为2。符号幅度表示的值相同,但在带有补码表示的稀有系统上,该值为0