- - PR -
簡略記法演算子での演算時のキャストについて
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2005-08-23 09:40
はじめまして。
Javaの勉強をしてて少し分からない個所が出てきました。 <質問> 簡略記法演算子(+=、-=、*=等)ですが、 記述が省略されているということを本やネットの説明で見ました。 が、演算時にキャストが起こる場合についての動きが理解できません。 以下のようなソースを書くと違いが出ます。 int x = 5; x = x * 0.5F; → コンパイルエラー x *= 0.5F; → 自動的にキャストされている? この違いが分かる方がおられましたら、是非ご教授ください。 |
|
投稿日時: 2005-08-23 11:57
Java の言語仕様(http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.26.2)をご覧いただくとわかりますが、かいつまんで説明いたします。
挙げた言語仕様(15.26.2 節 Compound Assignment Operators(複合代入演算子))によると、x *= 0.5F は x = x * 0.5F ではなく、x = (int) (x * 0.5F) と等価な式と評価されます。 ということで、言語仕様上、Java コンパイラは複合代入演算子を解釈する際、演算結果を左辺型にキャストして左辺への代入可能性を保証するため、複合代入演算子は右辺の型が左辺より大きい型であってもキャストなしで代入が成功します。 対して x = x * 0.5F では左辺が int、右辺が float で、float→int は原始型の縮小型変換(5.1.3 節 Narrowing Primitive Conversions)であるため、明示的にキャストしないとコンパイルエラーとなります。 |
|
投稿日時: 2005-08-24 11:38
Gio様
返答ありがとうございます。 確かに言語仕様にキャストして左辺へ代入されると記述されてますね。 調査しきれていませんでした。。。 英語は苦手なので、日本語訳サイトで確認しました。 http://www.y-adagio.com/public/standards/tr_javalang/15.doc.htm#5304 謎が解けてスッとしました。 ありがとうございました!! |
1