11

int と float を使用した代入ステートメントと自己代入ステートメントに関して、Java コンパイルが予期しない動作をすることがわかりました。

次のコード ブロックは、エラーを示しています。

    int i = 3;
    float f = 0.1f;

    i += f;              // no compile error, but i = 3
    i = i + f;           // COMPILE ERROR
  • 自己代入i += fでは、コンパイルはエラーを発行しませんが、評価の結果は value を持つ int で3あり、変数iは value を維持します3

  • i = i + f式では、コンパイラは「エラー: 精度が失われる可能性があります」というメッセージとともにエラーを発行します

誰かがこの動作を説明できますか?

編集: このコード ブロックをhttps://compilr.com/cguedes/java-autoassignment-error/Program.javaに投稿しました。

4

2 に答える 2

11

http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.26.2

Java 言語仕様には次のように書かれています。

の形式の複合代入式は、E1 op= E2E1 = (T) ((E1) op (E2))T型ですがE1E1は 1 回だけ評価されます。

Soi += fは と同等i = (int) (i + f)です。

于 2012-12-08T19:37:07.367 に答える
0

プリミティブ変換を狭めるために、明示的にi+f失敗すると思います。最初のケースでは、右側の変換は複合割り当て規則に従って行われるため、パスします。

于 2012-12-08T19:40:25.180 に答える