Java中的三元运算符自Java 7以来只计算一个表达式-在Java 1.6和更低版本中有什么不同?

Java中的三元运算符自Java 7以来只计算一个表达式-在Java 1.6和更低版本中有什么不同?,java,ternary-operator,java-6,short-circuiting,Java,Ternary Operator,Java 6,Short Circuiting,在准备Oracle认证助理Java SE 8程序员1考试时,我在官方学习指南中遇到了关于三元表达式的以下段落: 三元表达式求值 从Java7开始,在运行时只对三元运算符的一个右表达式求值。以类似于短路运算符的方式,如果三元运算符中的两个右侧表达式之一产生副作用,则可能无法在运行时应用。让我们用下面的例子来说明这一原则:[……] 它表示只对两个表达式中的一个进行求值,并用以下示例演示: int y = 1; int z = 1; int a = y < 10 ? y++ : z++; i

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

三元表达式求值
从Java7开始,在运行时只对三元运算符的一个右表达式求值。以类似于短路运算符的方式,如果三元运算符中的两个右侧表达式之一产生副作用,则可能无法在运行时应用。让我们用下面的例子来说明这一原则:[……]

它表示只对两个表达式中的一个进行求值,并用以下示例演示:

int y = 1;
int z = 1;
int a = y < 10 ? y++ : z++;
inty=1;
intz=1;
int a=y<10?y++:z++;
这里,只有
y
增加,但是
z
没有增加,正如您所期望的那样

我碰到的是段落的开头(用黄色标记),上面写着“从Java7开始,…”。我用Java1.6测试了相同的代码,但没有发现行为上的差异。我希望Java1.6仅根据段落中给出的信息计算这两个表达式。有人知道他们想用“从Java7开始,…”说什么吗

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

在运行时,条件表达式的第一个操作数表达式 首先计算表达式;如有必要,可以取消装箱转换 对结果进行分析;生成的布尔值然后用于 选择第二个或第三个操作数表达式:

  • 如果第一个操作数的值为真,则选择第二个操作数表达式
  • 如果第一个操作数的值为false,则选择第三个操作数表达式
然后对所选操作数表达式求值,并生成 值转换为条件表达式的类型,如下所示 根据上述规则确定。这种转换可能包括 装箱(§5.1.7)或拆箱转换操作数表达式不正确 所选内容不会针对特定的 条件表达式。


类似的措辞也出现在JLS版本中,可追溯到。Java7中的行为没有改变;学习指南的措词很糟糕。

我是这本书的作者之一。虽然我没有写那句话,但我同意其意图是“这是在Java7上测试的”。如果我们再写一个版本,我会记下删除它


要明确的是,三元运算符在Java 8、7、6等中的行为与此相同,如果它在将来发生变化,我会感到非常惊讶。

为什么您希望z也会增加?这对我来说没有任何意义。听起来像是一本写得很糟糕的书,三元运算符自java诞生以来一直没有改变,在阅读到目前为止发布的大多数答案后,人们似乎误解了这个问题。这不是“为什么两个表达式都没有被评估?”,而是“为什么这本书似乎暗示它过去的行为不同?”事实上,我看到“截至日期/版本X”的意思是“我们在日期/版本X中检查了这一点,但我们没有说任何关于早期版本的内容。”我猜这可能就是这里的意思。(尽管你认为检查Java的早期版本很容易。)无论如何,这更像是一个英语问题,而不是编程问题。@DavidZ:英语问题是编程问题,当它们阻止你完成工作时。这句措辞拙劣的评论让OP停止了他正在做的事情,浪费时间发现什么都没有改变。编程就是与编译器/解释器以及后来维护代码的人的通信。我数不清我读了多少次代码,不得不停下来,因为有些奇怪的事情/可能/与这个问题有关,结果发现它只是“措辞”很糟糕。所以答案是“在Java 7和之前,关于三元运算符没有什么不同”,对吧?似乎是正确的。我给作者写了一份备忘录——期待他们的回答。你可能还会找到一个URL,比较不同版本的操作员代码。如果你是偏执狂/好奇的话,这些Oracle认证中糟糕的(或完全错误的)问题的数量再次令人震惊。。