假设x=2,y=1,z=0,下面的语句会显示什么?
printf("answer = %d\n", (x || !y && z));
这是一道测验题,我答错了,我不记得我的教授讲过这个问题,请有人给我解释一下...我知道答案是1,但为什么呢?
假设x=2,y=1,z=0,下面的语句会显示什么?
printf("answer = %d\n", (x || !y && z));
这是一道测验题,我答错了,我不记得我的教授讲过这个问题,请有人给我解释一下...我知道答案是1,但为什么呢?
x || (!y &&z)
(查看运算符||
,!
和&&
的优先级)。
||
是一种短路运算符。如果左操作数为true(在||
的情况下),则无需评估右侧操作数。x
为true,因此作为布尔表达式的结果将为1。&&
和||
的顺序。&&
比||
具有更高的优先级(即绑定更紧密)。 - R.. GitHub STOP HELPING ICEbool b = ++x || (++n);
cout << n;
}' 的输出应该是什么? - Chubsdad如果我没有弄错的话,它将打印1。(假设短路是关闭的)
(x || !y && z)
或 (true || !true && false)
将先计算 ! 运算符,得到 (true || false && false)
然后是 &&: (true || false)
然后是 || :true
Printf 将十进制中的 true 解释为 1。所以它将打印 answer = 1\n
int x = 2, y = 1, z = 0;
printf("true == %d\n", 10 > 2); // prints "1"
printf("false == %d\n", 1 == 2); // prints "0"
printf("!y == %d\n", !y); // prints "0"
printf("(x || !y) == %d\n", x || !y); // "1" - SEE COMMENTS BELOW
printf("(!y || z) == %d\n", !y || z); // "0"
printf("(x || !y && z) == %d\n", x || !y && z); // "1"
true == 1
揭示了 C/C++ 如何将真实的布尔表达式转换为整数值 1,以便在 printf 中使用,而不考虑布尔表达式中出现的值。false == 0
揭示了 C/C++ 如何将 false 表达式转换为“0”。(!y) == 0
因为 ! 是逻辑非运算符,C/C++ 认为 0 是唯一对应 false 的整数值,而所有其他值都是 true,所以 !1 == !true == false == 0
。(x || !y) == 1
,你知道 !y
是 0,所以替换已知值并简化:(2 || 0) == 1
等价于 (true or false) == true
...这是一个可理解的逻辑规则。(!y || z) == 0
- 替换已知值:(0 || 0) == (false or false) == false == 0
。(x || !y && z) == 1
:这里是关键!从上面我们知道:
x || !y
是 1/true,如果相关,则意味着 1/true && z/0/false == 1/true <- 这显然没有任何意义,因此它不是 C/C++ 计算答案的方式!answer = 1
或者也许:
answer = -27
2 || !1 && 0
2 || 0 && 0
2 || 0
true
true = non-zero value
printf("answer = %d",*true*); -> who knows
大多数编译器将输出answer = 1
。虽然我不敢确信所有编译器都会这样做,但我确信所有编译器都会返回非零值。
我不会直接给你答案,因为你可以编译并运行它,但这个问题只是在测试你是否了解运算符优先级。