输出:关系和三元运算符?

时间:2014-09-19 18:27:02

标签: c output ternary-operator

#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

2 个答案:

答案 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)

因为&&运算符比?:运算符绑定得更紧。

在任何情况下,如果这是真正的代码,你肯定应该添加足够的括号,以便一个知识渊博的读者可以理解代码,而无需查阅运算符优先级表。混合&&||?:可能会特别令人困惑。将表达式分解为子表达式,并将每个表达式分配给临时变量(因此它具有有意义的名称)也会有所帮助。

如果您尝试编写复杂表达式,则上述情况适用。如果您正在尝试理解别人写的东西,那么您几乎必须自己解析它。尝试做我做的事情:逐步简化表达(通过删除部分或添加括号)以不改变含义的方式,在每一步确认您得到相同的结果。如果它是生产代码(而不是测验,这似乎是),请考虑痛苦地抱怨,鼓励作者写出更清晰的代码。