这一切都是关于运算符优先级(以及令人不安的括号)。
当我运行你的程序时,我得到的输出是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
是假的,所以结果是10
- 这是我运行程序时得到的结果。
你可能认为这样的:
a ? b : c && d ? e : f
等同于:
(a ? b : c) && (d ? e : f)
但实际上它是等价的:比更紧密
a ? b : ((c && d) ? e : f)
因为&&
运营商绑定运营商?:
。
在任何情况下,如果这是真实代码,您应该添加足够的括号,以便合理的知识渊博的读者可以理解代码,而不必咨询运算符优先级表。混合&&
,||
和?:
可能会特别混淆。将表达式分解为子表达式,并将每个表达式分配给一个临时变量(因此它有一个有意义的名称)也可能有所帮助。
以上情况适用于您尝试写复杂表情。如果你想了解别人写过的东西,你几乎必须自己解析它。试着做我所做的事:通过不改变含义的方式逐步简化表达式(通过删除部分或添加括号),在每一步中确认您获得相同的结果。如果是生产代码(而不是测验,看起来好像是这样),请考虑
怨恨
鼓励作者写出更清晰的代码。
请更新问题以向我们展示输出结果。 – 2014-09-19 18:29:10
谁写这样的代码? – 2014-09-19 19:40:59
这是从一个门户网站,其中一个必须预测下面的代码片段的输出..因为我无法弄清楚我发布在这里! – 2014-09-24 19:38:27