在 C 语言中,给定“short x = 0xFFF0”,“x && (~x)”的输出是什么。 这个问题是在一次测验中向我提出的,答案是 0。尽管编译时返回 1(true)。这是为什么?
int main()
{
short x = 0xFFF0;
printf("%X\n", x && (~x));
return 0;
}
我所知道的是“x = 0xFFF0”和“~x = 0x000F”。 当我们执行“逻辑与”时,它的 1 && 1 返回 1(真)。然而,教授却不这么认为,他说应该先进行“按位与” 0xFFF0 & 0x000F = 0x0000,即 0(假)。这是过时的编译器的问题还是无法解释的问题?
C17 §6.5.13 ¶3:
如果
运算符的两个操作数比较不等于 0,则其结果为 1;否则,结果为 0。结果类型为&&
。int
x
是非零(真值),并且~x
是非零(真值),所以x && (~x)
返回 1
(真值)。让我们一点一点地看
x && (~x)
。
x
本身不为零,因此在使用逻辑 true
(AND) 时,在布尔上下文中将计为 &&
。~x
本身也不为零。true && true
是 true
:#include <stdbool.h>
#include <stdio.h>
int main() {
short x = 0xFFF0;
printf("%s\n", x != 0 ? "true" : "false"); // true
printf("%s\n", ~x != 0 ? "true" : "false"); // true
printf("%s\n", true && true ? "true" : "false"); // true
}