Java中的三元运算符只从Java 7开始评估一个expression式 – 在Java 1.6和更低版本中是不同的?

准备Oracleauthentication助理Java SE 8 Programmer 1考试,我在以下段落中看到官方学习指南中的三元expression:

三元expression评估
从Java 7开始,只有一个三元运算符的右边expression式将在运行时被评估。 以类似于短路运算符的方式,如果三元运算符中的两个右手expression式中的一个performance出副作用,那么它可能不会在运行时被应用。 我们用下面的例子来说明这个原理:[…]

它说只有两个expression式中的一个被评估,用下面的例子来演示:

int y = 1; int z = 1; int a = y < 10 ? y++ : z++; 

在这里,只有y增量,但是z并不如你所期望的那样。

我所踌躇的是这个段落的开头(用黄色标出),它表示“从Java 7开始……”。 我用Java 1.6testing了相同的代码,并且在行为上找不到差别。 我期望Java 1.6只是根据段落中给出的信息来评估这两个expression式。 有没有人有一个想法,他们想说“从Java 7,…”?

编辑:为了避免混淆:它归结为这样一个问题:自从他们编写“从Java 7开始”,从Java 6切换到Java 7时,是否有任何关于三元运算符的变化?

我是这本书的作者之一。 虽然我没有写这个句子,但我同意这个意思是“这是在Java 7上testing的”。 如果我们写另一个版本,我会做一个注释来删除它。

要清楚的是,三元运算符在Java 8,7,6等中performance得相同。如果将来发生变化,我会感到非常惊讶。

从Java 6 JLS :

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

  • 如果第一个操作数的值为真,则select第二个操作数expression式。
  • 如果第一个操作数的值为假,则select第三个操作数expression式。

然后评估选定的操作数expression式,并将结果值转换为由上述规则确定的条件expression式的types。 这种转换可能包括装箱(§5.1.7)或拆箱转换。 未select的操作数expression式不针对条件expression式的特定评估进行评估。

在JLS版本中也会出现类似的措辞,回到1.0 。 Java 7中的行为没有改变; 学习指南只是措辞不佳。