首页 文章

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

提问于
浏览
103

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

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

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

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

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

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

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

2 回答

  • 112

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

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

  • 85

    来自Java 6 JLS

    在运行时,首先计算条件表达式的第一个操作数表达式;如有必要,对结果执行拆箱转换;然后使用结果布尔值来选择第二个或第三个操作数表达式:如果第一个操作数的值为true,则选择第二个操作数表达式 . 如果第一个操作数的值为false,则选择第三个操作数表达式 . 然后评估所选择的操作数表达式,并将结果值转换为由上述规则确定的条件表达式的类型 . 此转换可能包括装箱(§5.1.7)或拆箱转换 . 未针对条件表达式的特定评估评估未选择的操作数表达式 .

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

相关问题