web-dev-qa-db-ja.com

Java 1つだけの式を評価するJava 7-Java 1.6以前で違いましたか?

Oracle Certified Associate Java SE 8 Programmer 1試験の準備をしているときに、公式の学習ガイドの三項表現に関する次の段落に出会いました。

進表現の評価
Java 7の時点で、3項演算子の右辺式の1つだけが実行時に評価されます。1つであれば、短絡演算子と同様の方法で三項演算子の2つの右辺式の2つは副作用を実行するため、実行時に適用されない可能性があります。この原理を次の例で説明しましょう:[...]

次の例で示すように、2つの式のうち1つだけが評価されると書かれています。

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

ここでは、yのみが増加しますが、zは増加しません。期待どおりです。

私が偶然見つけたのは、段落の先頭(黄色でマーク)で、「As of Java 7、...」と書かれています。同じコードをJava 1.6であり、動作に違いはありません。Java 1.6は、段落で与えられた情報から両方の式を評価することを期待しました。彼らは「Java 7、...」の時点で」と言いたかったのですか?

編集:混乱を避けるため:要約すると、「Java 7」のように書いているので、三項演算子に関して何か変更がありましたか? Java 6からJava 7?

104
Mathias Bader

私はこの本の著者の一人です。私はその特定の文を書いていませんでしたが、その意図は「これはJava 7でテストされました。」でした。

明確にするために、三項演算子はJava 8、7、6などで同じように動作しました。将来的に変更された場合、私は非常に驚くでしょう。

86
Jeanne Boyarsky

Java 6 JLS から:

実行時に、条件式の最初のオペランド式が最初に評価されます。必要に応じて、結果に対してボックス化解除変換が実行されます。次に、結果のブール値を使用して、2番目または3番目のオペランド式を選択します。

  • 最初のオペランドの値がtrueの場合、2番目のオペランド式が選択されます。
  • 第1オペランドの値がfalseの場合、第3オペランド式が選択されます。

次に、選択されたオペランド式が評価され、結果の値が上記の規則によって決定された条件式の型に変換されます。この変換には、ボクシング(§5.1.7)またはボックス化解除の変換が含まれる場合があります。 選択されていないオペランド式は、条件式の特定の評価では評価されません。

同様の言い回しは、JLSエディションでも 1. にまで遡ります。動作はJava 7で変化しませんでした;学習ガイドの言葉遣いは不十分です。

114
user2357112