Javaの3項演算子はJava 7以降、1つの式しか評価しません-Java 1.6以下ではそれと違いましたか


109

Oracle Certified Associate Java SE 8 Programmer 1試験に備えて、公式の学習ガイドの3項式に関する次の段落に出くわしました。

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

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

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

ここでは、yインクリメントのみzですが、そうではありません。

私がつまづいているのは、「Java 7以降...」と書かれている段落(黄色でマークされている)の始まりです。同じコードをJava 1.6でテストしましたが、動作の違いを見つけることができません。私は、Java 1.6が両方の式を段落で与えられた情報からのみ評価することを期待していました。誰かが「Java 7の時点で...」で何を言いたかったのか考えがありますか?

編集:混乱を避けるために:それは質問に要約されます、「Java 7の時点で」と書いているため、Java 6からJava 7に切り替えるときに、3項演算子に関して変更されたものはありましたか?


4
なぜzも増加すると予想しますか?これは私には意味がありません。
イジー・カンター

15
不十分に書かれた本のように聞こえます、三項演算子はjava、afaikの開始以来変更されていません
NimChimpsky

23
これまでに投稿された回答のほとんどを読むと、人々は質問を誤って解釈するようです。それは「なぜ両方の式が評価されないのか」ではなく、「なぜこの本は以前は異なった振る舞いをしたことを意味しているように見えるのですか?」ではありません。
BambooleanLogic 2015

23
実際、「日付/バージョンXの時点で」が「日付/バージョンXでこれが正しいことを確認したが、以前のバージョンについては何も言っていない」という意味で使用されているのを見たことがあります。それがここでの意味かもしれないと思います。(以前のバージョンのJavaを確認するのは簡単だと思いますが。)とにかく、それはプログラミングの問題というよりは、英語の問題です。
David Z

14
@DavidZ:英語の問題は、仕事の遂行を妨げるプログラミング上の問題です。この不適切な言葉のコメントにより、OPは彼がやっていたことを止め、何も変わっていないことを発見するのに時間を浪費しました。プログラミングは、コンパイラー/インタープリターと、コードを保守するために後で一緒に来る人とのコミュニケーションです。私がコードを読んでいる時間を数えることはできません。また、/ might /が問題に関係していると思われる奇妙なことをやめなければならなくなりました。
jmoreno 2015

回答:


92

私はこの本の著者の一人です。その特定の文は書きませんでしたが、「これはJava 7でテストされました」という意図に同意します。別の版を書く場合は削除するようにメモしておきます。

明確にするために、3項演算子はJava 8、7、6などでも同じように動作しました。また、将来的に変更されたとしたら、私はかなり驚かれるでしょう。


116

以下からのJava 6 JLS

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

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

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

同様の表現は、1.0にさかのぼるJLSエディションにも表示されます。Java 7では動作は変わりませんでした。学習ガイドの言葉遣いが不十分です。


2
答えは「3項演算子に関しては、Java 7以前では違いはない」ということです。
Mathias Bader 2015

5
スジは通ってるようだ。私は著者にメモを書きました-彼らの答えを楽しみにしています
Mathias Bader '10

また、バージョン間で演算子のコードを比較するURLを見つけることもできます。あなたが偏執狂/好奇心が強いなら。
Steve Clay

7
これらのOracle認定でひどく書かれた(または単にフラットアウト間違った)質問の番号が...再びたびに驚くべきことである
VOO
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.