-5

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

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

4 回答 4

4

&&布尔运算符,而不是整数运算符。在 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)

它具有严格的类型一致性,因为!=它具有来自整数操作数的布尔结果,因此&&仅显示布尔操作数而没有隐式转换。

于 2019-12-08T09:18:50.100 回答
0

因为-2&&2被评估为true= 1(当您将两个数字加在一起时,除非其中一个或两个数字为0,否则您将得到真)。尝试更改-2&&2true && false; 它将打印 0。

于 2019-12-08T09:08:21.213 回答
0

基于布尔算术运算,表达式-2&&2恢复为1or true(true总是!= 0, while )。false == 0

这是它恢复到的方式1

&&表示逻辑的AND,而不是按位AND的,即在 C 中。因此,您对and&的值进行逻辑与运算。-22

让我们将以下句子视为逻辑与 ( &&) 运算的语句之一:

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

-2非零,等于1

2也是非零的,等于1

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

于 2019-12-08T09:32:45.883 回答
0

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

程序中的表达式计算为

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

这是1因为布尔表达式在 C 中具有0false 和1true 的值。

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

于 2019-12-08T10:41:49.317 回答