言語仕様

暇だし、仕事の都合で調べていたので記録。

  • 比較演算子。結果は,型booleanの値とする。
    • 数値比較演算子<,<=,>,及び >= (15.20.1)
    • 数値等価演算子== 及び != (15.21.1)
  • 数値演算子。結果は,型int又は型longの値とする。
    • 単項符号演算子 + 及び - (15.15.3,15.15.4)
    • 乗除演算子 *,/,及び % (15.17)
    • 加減演算子 + 及び - (15.18.2)
    • 増分演算子 ++,前置 (15.15.1) 及び後置 15.14.1) の両方
    • 減分演算子 --,前置 (15.15.2) 及び後置 (15.14.2) の両方
    • 符号付き及び符号無しシフト演算子 <<,>>,及び >>> (15.19)
    • ビット単位補数演算子~ (15.15.5)
    • 整数ビット単位演算子 &,|,及び ^ (15.22.1)
  • 条件演算子 ? : (15.25)
  • キャスト演算子。ある整数的な値を,任意の指定した数値型の値へ変換できる(5.5,15.16)
  • 文字列連結演算子+ (15.18.1)。String オペランド及び整数的なオペランドを与えた時,整数的なオペランドをその値を表す10進数表記の String に変換し,次にその二つの String を連結した新しい文字列を生成する。
シフト演算子以外整数演算子が少なくとも一つの型longのオペランドをもてば,演算を64ビット精度で実行し,その結果を型longとする。片方のオペランドがlongでなければ,最初に数値昇格 (5.6) によって型longに拡張する (5.1.4)。そうでなければ,演算は32ビット精度で実行し,その数値演算子の結果は型intとする。どちらかのオペランドがintでなければ,演算に先立って数値昇格によって型intに拡張する。

++や--は「シフト演算子以外の整数演算子」なのだけど、元の型のまま演算する。(15.15.x)を見ればそう書いてあるが。いや、結果が元の型になるだけで、演算自体は数値拡張してまた縮小変換するみたいな?
逆に単項演算子「+」や「-」がこの制限に引っかかるとは思わなかった。

short s1=1;
s1++; //ok
short s2=1;
s2=+s2; //エラー