6

次のコードの出力が 9 ではなく 9.0 になるのはなぜですか? 三項演算子が if-else 分岐の短縮形に過ぎない場合、Java コンパイラが int を double に昇格させるのはなぜですか?

public class Ternary
  {
public static void main(String args[])
     {
    int a = 5;
    System.out.println("Value is - " + ((a < 5) ? 9.9 : 9));
     }
  }
4

5 に答える 5

9

三項演算子が if-else 分岐の短縮形に過ぎない場合、Java コンパイラが int を double に昇格させるのはなぜですか?

条件式には単一の型があり、必要に応じて 2 番目と 3 番目のオペランドの両方が変換されます。JLS は式の型を決定するルールを提供しますが、これは自動アンボックス化のために少し複雑です。

条件演算子は/構造の省略形のようなものですが、期待したような省略形ではありません。したがって、あなたのコードはこれと同等です:ifelse

double value;
if (a < 5) {
    value = 9.9;
} else {
    value = 9;
}
System.out.println("Value is - " + value);

次の略語ではありません:

if (a < 5) {
    System.out.println("Value is - " + 9.9);
} else {
    System.out.println("Value is - " + 9);
}

詳細については、Java 言語仕様のセクション 15.25 を参照してください。

于 2013-02-10T10:02:52.767 に答える
2

2番目と3番目のオペランドは同じタイプではないため、この場合のconditional operator(はい、条件演算子であり、三項演算子ではありません)のタイプは、3番目のオペランドの昇格されたタイプになるためです。

これはJLS セクションに明確にリストされています - 15.25 : -

それ以外の場合、2 番目と 3 番目のオペランドが数値型に変換可能な型 (§5.1.8) を持っている場合、いくつかのケースがあります。

  • オペランドの 1 つが byte または Byte 型で、もう 1 つは short または Short 型の場合、> 条件式の型は short です。

  • オペランドの 1 つが T 型であり、T が byte、short、または char であり、もう 1 つのオペランドが int 型の定数式 (§15.28) であり、値が T 型で表現可能である場合、条件式の型は次のようになります。 T.

  • オペランドの 1 つが T 型であり、T が Byte、Short、または Character であり、もう 1 つのオペランドが int 型の定数式 (§15.28) であり、その値が unboxing を適用した結果である U 型で表現可能である場合T に変換すると、条件式の型は U になります。

  • それ以外の場合、2 進数値昇格 (§5.6.2) がオペランドの型に適用され、条件式の型は 2 番目と 3 番目のオペランドの昇格された型になります。

ここで役立つ最後のポイントを参照してください。したがって、この場合、ルールとしてbinary numeric promotion- JLS セクション 5.6.2を参照してください: -

  • いずれかのオペランドが double 型の場合、もう一方は double に変換されます。
于 2013-02-10T10:03:39.197 に答える
1

double演算子のオペランドの 1 つが であるため、式全体の型はdoubleです。三項を含む式の型は、同じ型でなければならないオペランドによって決定されます。あなたの式の場合、はと同じ型にするため9に a に強制されます。double9.9

于 2013-02-10T10:02:19.447 に答える
0

実際、三項演算子は、必要に応じて型変換を実行するため、厳密には if/else の短縮形ではありません。特に、あなたの場合、JLS 15.25では次のことが必要です。

バイナリ数値昇格 (§5.6.2) がオペランドの型に適用され、条件式の型は 2 番目と 3 番目のオペランドの昇格された型になります。

§5.6.2へのリンクをたどると:

いずれかのオペランドが double 型の場合、もう一方は double に変換されます。

于 2013-02-10T10:02:30.930 に答える
0

Java はコンパイル時に結果の型を知る必要があります。したがって、この三項演算子は int または double になる可能性があるため、コンパイラは double を結果の型として選択します。

于 2013-02-10T10:03:12.037 に答える