假设x = 2,y = 1,z = 0,下面的语句会显示什么?
printf("answer = %d\n", (x || !y && z));
这是在一个测验中,我弄错了,我不记得我的教授覆盖了这个,请有人开导我...我知道我得到的答案是1,但为什么?
答案 0 :(得分:3)
表达式被解释为x || (!y &&z)
(查看运算符||
,!
和&&
的优先级。
||
是short-circuiting运营商。如果左操作数为真(在||
的情况下),则不需要评估右侧操作数。
在你的情况下x
为真,所以作为一个布尔表达式,结果将是1。
修改强>
&&
和||
的评估顺序保证从左到右。
答案 1 :(得分:1)
如果我没弄错,它会打印1.(假设短路已关闭)
(x || !y && z)
或(true || !true && false)
将首先评估!运营商给予(true || false && false)
然后是&&amp ;: (true || false)
然后|| :true
Printf会将十进制的真值解释为1.因此它会打印answer = 1\n
答案 2 :(得分:0)
假设x = 2,y = 1,z = 0, 以下是什么声明 显示?
printf(“answer =%d \ n”,(x ||!y&& z));
好的 - 感觉有点内疚,因为这个问题严厉的措辞不好,所以我会尝试以不同的方式帮助你解决其他问题...: - )
当您遇到这样的问题时,将其分解为可管理的块。
尝试:
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 ++如何将真实的布尔表达式转换为printf的整数值1,而不考虑布尔表达式中出现的值false == 0
揭示了C / C ++如何将虚假表达式转换为“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 ++计算答案的方式!通过这种方式,我们得出了运算符优先级 - ||的求值顺序和&&运算符,从编译器显示的结果,并看到,当且仅当&&在||之前评估然后我们可以对结果有所了解。
答案 3 :(得分:-1)
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
。我不会自信地声明所有编译器都会这样做,但我相信所有编译器都会返回非零值。
答案 4 :(得分:-2)
我不打算给你直接答案,因为你可以编译并运行它,但问题只是测试你是否知道运算符优先级。