question2024
@question2024 (step1engineer)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

java 三項演算子

分からないこと

三項演算子を使ったコードについてです。
私は102が出力されると考えていました。
テキストの解答は「false」でした。
実際にコードを実行してみると「false」と表示されました。

コード
int a = 100;
int b = ++a;
int c = b++;
int d = ++c;
System.out.println((a < b) ? (b < c) : (c < d) ? b : c);

上記コードの実行結果は「false」です。

102が表示されるのでは?と考えた理由

4行目までを処理した結果
a=101
b=102
c=102
d=102
となる。
まずは(a < b)をみて、結果は真となる。
つぎに(b < c)をみて、結果は偽となる。
つぎに(c < d)をみて、結果は偽となる。
よって「c」の値である「102」が出力されると理解していた。

なぜfalseが出力されるのでしょうか。
教えてほしいです。
「java 三項演算子 false true」等で調べても、
falseの場合は式1をみたいな形の解説は多くあるのですが、
「false」「true」とbooleanの値が出力されることについて
解説されている記事が見つからず、こちらに質問させていただきました。

0

2Answer

「まずは(a < b)をみて、結果は偽となる。」

ここが間違いではないでしょうか。
a=101, b=102ならば、(a < b)をみて、結果は真となって、(b < c)の値が出力されます。

b < c はfalseなので、falseが出力されるということです。

1Like

Comments

  1. @question2024

    Questioner

    takasan1234 様
    コメントありがとうございます。
    midoribi様よりご指摘をいただいて、
    先ほど、(a < b)をみて、結果は真に訂正しました。
    (b < c)の結果がfalse、この時点で 処理が終了されるということでしょうか。

  2. はい。そうなります。
    以下で、詳しく説明します

    三項演算子の概要

    三項演算子の基本的な形は以下です。
    条件式がtrueなら値1が選択され、falseなら値2が出力されます

    条件式 ? 値1 : 値2

    解説

    今回の問題は、三項演算子が2つ使われています。よくわからなければ、「?」の数を数えてみてください。2つありますよね。では、2つの三項演算子をそれぞれ見ていきます。

    コード
    System.out.println((a < b) ? (b < c) : (c < d) ? b : c);

    最初に、太字で示してある「?」を含む三項演算子を考えます。
    System.out.println( (a < b)   ?   (b < c)   :   (c < d) ? b : c )

    上を見てわかるように、値1は(b < c)、値2は(c < d) ? b : cです。
    先ほど触れましたが、a < b はtrueです。なので、値1を選択、つまり(b < c)を選択します。プログラムが(b < c)に到達してそれを実行すると、falseが返ってきます。このfalseが出力されているんですね。

    これらを見てわかるように、2つ目の三項演算子(太字じゃない方を含む三項演算子)は全く使われてません!!!これにて解説終了!でもいいですが、せっかくなので、2つ目も見てみます。

    補足

    二つ目は
    (c < d)   ?   b    :   c

    条件式はc < dで、値1はb、値2はc

  3. @question2024

    Questioner

    おはようございます!
    詳しい説明をいただけて本当に助かります。
    三項演算子、わかっていたつもりですが、全然理解できていなかったようです。。
    値1は(b < c)、値2は(c < d) ? b : c
    ↑この部分を理解できていませんでした。。。

    同じ問題がでてきたら解けそうです。
    ありがとうございます。m(T T)m

Comments

  1. @question2024

    Questioner

    ご指摘ありがとうございますm( _ _)m
    打ち間違いをしていました。
    (a < b)は真です。m( _ _)m

  2. @question2024

    Questioner

    今、訂正しました。
    偽→真
    ありがとうございます。

  3. @question2024

    Questioner

    あれ、、、すみません。
    私、理解の部分いろいろと書き間違えています。
    いまから訂正、更新させていただきます。
    コメントを作っていただいている最中でしたら申し訳ありません。m(_ _)m

  4. @question2024

    Questioner

    再度、更新いたしました。

    もしまた可能でしたら、教えていただけると嬉しいですm( _ _)m

  5. 他の方の回答にある通り、(a < b)はtrueなので、 (b < c)が評価されてその値がprintされています。
    後半の (c < d) ? b : c は全く評価されませんので、惑わすだけのコードです。

    正直なところ、この問題はかなり悪問だと思います。
    変数宣言のところで意味なく前置演算子と後置演算子を混ぜているのも意味がわからないですし、三項演算子を連ねるのは非常に可読性が低くアンチパターンとしてよく紹介されます。
    仮に業務でこのようなコードを提出された際にはifを使用したコードへ書き直してもらいます。

  6. 以下のほうが個人的には読みやすいです。
    (javaの文法忘れちゃったので動かないかもしれませんが、イメージだけ伝わればと)

    if (a < b) {
      System.out.println((b < c))
    } else if (c < d){
      System.out.println(b)
    } else {
      System.out.println(c)
    }
    
  7. @question2024

    Questioner

    おはようございます!
    丁寧な解説をいただきありがとうございますm(_ _)m
    takasan1234様とmidoribi様の解説で、
    三項演算子を正しく理解することができたと思います。
    アンチパターンとして紹介されていることは知りませんでした。
    if文で書くほうが断然わかりやすいですね。。。。
    いつかjavaの案件につきたいと思っているので、
    とても参考になります。
    ありがとうございます > _ <

Your answer might help someone💌