- PR -

簡略記法演算子での演算時のキャストについて

1
投稿者投稿内容
エド
会議室デビュー日: 2002/06/01
投稿数: 2
投稿日時: 2005-08-23 09:40
はじめまして。
Javaの勉強をしてて少し分からない個所が出てきました。

<質問>
簡略記法演算子(+=、-=、*=等)ですが、
記述が省略されているということを本やネットの説明で見ました。
が、演算時にキャストが起こる場合についての動きが理解できません。
以下のようなソースを書くと違いが出ます。

int x = 5;
x = x * 0.5F; → コンパイルエラー
x *= 0.5F;   → 自動的にキャストされている?

この違いが分かる方がおられましたら、是非ご教授ください。
Gio
ぬし
会議室デビュー日: 2003/11/28
投稿数: 350
お住まい・勤務地: 都内から横浜の間に少量発生中
投稿日時: 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)であるため、明示的にキャストしないとコンパイルエラーとなります。
エド
会議室デビュー日: 2002/06/01
投稿数: 2
投稿日時: 2005-08-24 11:38
Gio様

返答ありがとうございます。
確かに言語仕様にキャストして左辺へ代入されると記述されてますね。
調査しきれていませんでした。。。

英語は苦手なので、日本語訳サイトで確認しました。
http://www.y-adagio.com/public/standards/tr_javalang/15.doc.htm#5304

謎が解けてスッとしました。
ありがとうございました!!
1

スキルアップ/キャリアアップ(JOB@IT)