#include<stdio.h>
main()
{
int big,x=3,y=2,z=1,q=4;
big=( x>y ? (x<z ? 20:10 && y>x ? 50:10 ) : (y>z ? 40:10 || x<q ? 30:10));
printf("big =%d",big);
return 0;
}
&安培;&安培;是一个关系运算符,所以它应该返回一个真值或假值,即0或1,但在这种情况下,它不是。请解释一下输出背后的逻辑是什么?
Output: big =10
答案 0 :(得分:1)
通过添加parethesis来显示优先级,让我们的表达更加明确:
((x>y) ?
((x<z) ?
20 : ((10 && (y>x)) ? 50 : 10)
) : (
(y>z)?40:((10 || (x<q))?30:10)
)
)
x
大于y
,所以让我们考虑一下
((x<z) ?
20 : ((10 && (y>x)) ? 50 : 10)
)
且x
不小于z
,所以
((10 && (y>x)) ? 50 : 10)
y
不大于x
,所以
10
您可以看到结果实际上并不是您的逻辑运算符。由于涉及复杂性,您几乎肯定会使用if
语句来表达这样的评估,以便以清晰的方式打破逻辑。
答案 1 :(得分:1)
所有关于运算符优先级(以及令人痛苦的缺少括号)。
我运行程序时得到的输出是nbig =10
(没有换行符;您应该在格式字符串中添加\n
)。
分配给big
的值不是&&
或||
运算符的结果。让我们一步一步地减少过于复杂的表达。 (我已在每一步确认结果未改变。)
big=(x>y?(x<z?20:10 && y>x?50:10) : (y>z?40:10 || x<q?30:10));
我们知道x>y
为真,因此我们可以删除相应?:
运算符的测试和第三个操作数:
big=(x<z?20:10 && y>x?50:10);
让我们删除无关的外括号,在外?:
运算符的第三个操作数周围添加一些新的,并稍微更改一下间距:
big = x<z ? 20 : (10 && y>x?50:10);
我们知道x<z
是假的,所以我们可以删除它和外部?:
的第二个操作数:
big = (10 && y>x?50:10);
显然10
是真的,所以:
big = (y > x ? 50 : 10);
并且y > x
为false,因此结果为10
- 这是我运行程序时获得的结果。
你可能认为这是:
a ? b : c && d ? e : f
相当于:
(a ? b : c) && (d ? e : f)
但实际上它相当于:
a ? b : ((c && d) ? e : f)
因为&&
运算符比?:
运算符绑定得更紧。
在任何情况下,如果这是真正的代码,你肯定应该添加足够的括号,以便一个知识渊博的读者可以理解代码,而无需查阅运算符优先级表。混合&&
,||
和?:
可能会特别令人困惑。将表达式分解为子表达式,并将每个表达式分配给临时变量(因此它具有有意义的名称)也会有所帮助。
如果您尝试编写复杂表达式,则上述情况适用。如果您正在尝试理解别人写的东西,那么您几乎必须自己解析它。尝试做我做的事情:逐步简化表达(通过删除部分或添加括号)以不改变含义的方式,在每一步确认您得到相同的结果。如果它是生产代码(而不是测验,这似乎是),请考虑痛苦地抱怨,鼓励作者写出更清晰的代码。