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中的行为没有改变; 学习指南的措辞很差.
Jea*_*sky 88
我是这本书的作者之一.虽然我没有写那个特定的句子,但我同意其意图是"这是在Java 7上测试的".如果我们写另一个版本,我会记下去除.
为了清楚起见,三元运算符在Java 8,7,6等中表现相同.如果将来发生变化,我会感到非常惊讶.