Java中的三元运算符仅评估自Java 7以来的一个表达式 - 在Java 1.6和更低版本中是不同的?

Mat*_*der 106 java ternary-operator short-circuiting java-6

为了准备Oracle认证助理Java SE 8程序员1考试,我在官方学习指南中看到了关于三元表达的以下段落:

三元表达式评估
从Java 7开始,将仅在运行时评估三元运算符的右侧表达式之一.以类似于短路运算符的方式,如果三元运算符中的两个右手表达式之一执行副作用,则可能不会在运行时应用它.让我们用以下例子来说明这个原则:[...]

它表示只评估两个表达式中的一个,演示如下:

int y = 1;
int z = 1;
int a = y < 10 ? y++ : z++;
Run Code Online (Sandbox Code Playgroud)

在这里,只有y增量,但z没有,正如您所期望的那样.

我绊倒的是段落的开头(标记为黄色),其中显示"从Java 7开始,......".我用Java 1.6测试了相同的代码,但是我找不到行为上的差异.我希望Java 1.6只根据段落中给出的信息来评估这两个表达式.有没有人知道他们想用"从Java 7开始......"这么说?

编辑:为了避免混淆:归结为这个问题,因为他们编写了"从Java 7开始",从Java 6切换到Java 7时,三元运算符有什么变化吗?

use*_*ica 116

来自Java 6 JLS:

在运行时,首先计算条件表达式的第一个操作数表达式; 如有必要,对结果执行拆箱转换; 然后使用结果布尔值来选择第二个或第三个操作数表达式:

  • 如果第一个操作数的值为true,则选择第二个操作数表达式.
  • 如果第一个操作数的值为false,则选择第三个操作数表达式.

然后评估所选择的操作数表达式,并将结果值转换为由上述规则确定的条件表达式的类型.此转换可能包括装箱(§5.1.7)或拆箱转换.未针对条件表达式的特定评估评估未选择的操作数表达式.

类似的措辞也出现在JLS版本中,回到1.0.Java 7中的行为没有改变; 学习指南的措辞很差.

  • 这些Oracle认证中错误编写的(或者只是错误的)问题的数量每次都令人惊讶. (7认同)
  • 似乎是合法的.我给作者写了一份备忘录 - 期待他们的回答 (5认同)
  • 因此答案是“与Java 7相比,与三元运算符没有任何区别”,对吗? (2认同)
  • @mbader:是的。它总是以这种方式工作。 (2认同)

Jea*_*sky 88

我是这本书的作者之一.虽然我没有写那个特定的句子,但我同意其意图是"这是在Java 7上测试的".如果我们写另一个版本,我会记下去除.

为了清楚起见,三元运算符在Java 8,7,6等中表现相同.如果将来发生变化,我会感到非常惊讶.