![](/img/trans.png)
[英]Can't understand the output of the following Java expression. It should be just an exercise of operator precedence and associativity
[英]Differences between Java order of expression, operator precedence and associativity
我在考试中遇到了这个问题。
考试题:以下代码片段的结果是什么?
3: var tiger = "Tiger";
4: var lion = "Lion";
5: final var statement = 250 > 338 ? lion : tiger = " is Bigger";
6: System.out.println(statement);
正确答案是
F. 由于第 5 行,代码将无法编译
解释是:
- 代码无法编译,因为赋值运算符在此表达式中具有最高优先级。
- 三元运算符的两边必须具有相同的类型。 这个表达式无效,因为第二个赋值运算符的左边不是变量,所以答案是选项 F。
- 请注意,如果问题在表达式周围添加了显式括号(Tiger = " is Bigger"),则选项 E 将具有正确的 output。
当我自己运行代码时,出现编译错误:
test.java:11: error: unexpected type
final var statement = 250 > 338 ? lion : tiger = " is Bigger";
^
required: variable
found: value
1 error
error: compilation failed
在征求第二意见后,阅读 JLS 第15节,以及这些其他 SO 问题:
我提出了几个理论:
有了新知识,我现在将尝试解释为什么第 5 行无法编译:
250 > 338? lion: tiger
250 > 338? lion: tiger
,这是一个有效的表达式,但这个表达式的计算结果是一个值。 现在我会尝试应用同样的理论来解释这段代码的正确场景: final var statement = 250 > 338? lion: (tiger = " is Bigger");
final var statement = 250 > 338? lion: (tiger = " is Bigger");
考试提供的解释是否落空了,还是我仍然不明白这段代码是如何编译的?
你是对的,他们说错了,赋值运算符的优先级最低。
你是不正确的,他们从来没有在任何地方提到“评估顺序”(无论如何你已经展示过)。 显示的代码在评估顺序很重要的地方没有做任何事情。 作业与评估顺序无关。
- 代码无法编译,因为赋值运算符在此表达式中具有最高优先级。
运算符优先级显示:
9 > relational
2 ?: ternary
1 = assignment
这意味着要使用括号显式显示优先级,语句变为:
statement = ((250 > 338) ? lion : tiger) = " is Bigger";
- 三元运算符的两边必须具有相同的类型。 这个表达式无效,因为第二个赋值运算符的左边不是变量,所以答案是选项 F。
三元运算符是((250 > 338)? lion: tiger)
,“双方”指的是两个赋值运算符。
正如它所说,“这个表达式无效,因为第二个赋值运算符的左侧不是变量”。
- 请注意,如果问题在表达式周围添加了显式括号(Tiger = " is Bigger"),则选项 E 将具有正确的 output。
你自己已经确认过了。
要使用括号显式显示优先级,语句变为:
statement = ( (250 > 338) ? lion : (tiger = " is Bigger") );
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.