超初心者です。
byte a=1;
byte b=2;
で,
a++;
a+=; はokなのに,
1) a=a+1; は何故コンパイルエラーになるのですか?
2) 逆に,a++,a+=;は何故okなのですか?
a++;は内部的にはa=a+1;をやっていると思ったのですけど。
超初心者です。
(質問に誤りがありました。)
byte a=1;
で,
a++;
a+=1; はokなのに,
1) a=a+1; は何故コンパイルエラーになるのですか?
2) 逆に,a++,a+=1;は何故okなのですか?
a++;やはa+=1;内部的にはa=a+1;をやっていると思ったのですけど。
二項演算子のオペランドに対しては「二項数値昇格」という規則が適用されるためです。
「Java言語既定」
5.6.2 二項数値昇格
http://www.y-adagio.com/public/standards/tr_javalang2/conversions.doc.html#170983
この規則によると、a+bという式でaとbがdouble,float,long以外の型の場合
a、bともにintに拡大変換されます。
そして、int+intはintとなり、intよりもサイズの小さいbyte型の変数に
代入することはできないため、エラーとなります。
a++ や a+=1 で同様の問題が起こらないのは、演算を行った後で
値を代入する変数の型に縮小変換することが定められているためです。
「Java言語既定」
15.14.1 後置増分演算子
http://www.y-adagio.com/public/standards/tr_javalang2/expressions.doc.html#39438
15.26.2 複合代入演算子
http://www.y-adagio.com/public/standards/tr_javalang2/expressions.doc.html#5304
これらの規則によると、上記のa++やa+=1は、
a = (byte)((a)+(1)) と等価となります。
ありがとうございました。