概要
算術演算子はbyte型~long型などの整数や実数(float型double型)を対象とした演算子で、文字型のcharも演算対象になる。
<単項演算子>
+a |
正符号、意味はない |
-a |
負符号、正負反転 |
++a |
参照前インクリメント |
a++ |
参照後インクリメント |
--a |
参照前デクリメント |
a-- |
参照後デクリメント |
<二項演算子>
a + b |
加算 |
a - b |
減算 |
a * b |
乗算 |
a / b |
除算 |
a % b |
剰余 |
単項演算子
+:正符号
数値リテラルや数値型変数の前に置く。正数・負数とも符号は変わらず、実質意味を持たない。
|
int posInt = 2; double posDbl = 3.0; int negInt = -2; double negDbl = -3.0; System.out.println(+posInt); // 2 System.out.println(+negInt); // -2 System.out.println(+posDbl); // 3.0 System.out.println(+negDbl); // -3.0 |
-:負符号
数値リテラルや数値型変数の前に置き、符号を反転させる。
符号演算子の連続
単項演算子は交互に連続して書くことができて、その結果は負符号’-
‘が偶数回なら’+
‘と同じ、奇数回なら’-
‘と同じ結果になる。
ただしその中に--
や++
のように連続した符号があると、インクリメント/デクリメント演算子と解釈されてエラーになる。
|
System.out.println(-+-+-5); // -5 System.out.println(-+--5); // コンパイルエラー:演算 ++/-- の引数が無効ですいいんく |
++/–:インクリメント/デクリメント
++
を変数の直前に書くと「変数が評価される前に」変数の内容が1増加する
++
を変数の後に書くと「変数が評価された後に」変数の内容が1減少する
- 演算子と変数の間に空白が入ってもよい。
整数の例
以下の例では、演算子が前置された場合は表示前にインクリメント/デクリメントされ、後置された場合は表示後にインクリメント/デクリメントされる。
|
int n = 0; System.out.println(++n); // 1 System.out.println(n++); // 1 System.out.println(++ n); // 3 System.out.println(n ++); // 3 System.out.println(n); // 4 n=0; System.out.println(--n); // -1 System.out.println(n--); // -1 System.out.println(-- n); // -3 System.out.println(n --); // -3 System.out.println(n); // -4 |
また、以下の例では二項演算子の項にインクリメント/デクリメント演算子を使った例。
|
n = 3; int result = n++ + ++n - n--; System.out.println(result+ ", " + n); // 3, 4 |
上記の例をnの変化で表すと以下の様になる。
3(→4) + →5 – 5(→4) = 3(4)
実数の例
実数の場合も++
で1.0増加、--
で1.0減少になるが、計算誤差が出る。
|
double d = 1.3; System.out.println(++d); // 2.3 System.out.println(--d); // 1.2999999999999998 System.out.println(--d); // 0.2999999999999998 |
char型の例
char
型にも適用可能で、インクリメントで1文字進み、デクリメントで1文字戻る。
|
char c = 'ぁ'; System.out.print(++c); System.out.print(++c); System.out.print(++c); System.out.print(--c); System.out.println(); // あぃいぃ |
二項演算子
四則演算
四則演算は多言語と同じ記号で、整数・実数の関係も同じ。整数同士の演算は整数で桁数が多い方に自動的にキャストされ、2項のうちいずれかでも実数なら結果も実数になる。
+:加算
|
System.out.println(7 + 2); // 9 System.out.println(7.0 + 2); // 9.0 System.out.println(7 + 2.0); // 9.0 |
-:減算
|
System.out.println(7 - 2); // 5 System.out.println(7.0 - 2); // 5.0 System.out.println(7 - 2.0); // 5.0 |
*:乗算
|
System.out.println(7 * 2); // 14 System.out.println(7.0 * 2); // 14.0 System.out.println(7 * 2.0); // 14.0 |
/:除算
|
System.out.println(7 / 2); // 3 System.out.println(7.0 / 2); // 3.5 System.out.println(7 / 2.0); // 3.5 |
%:剰余
aをbで割った時の剰余(余り)をa % b
で与える。実数表現でも整数商に対する剰余が計算される。
|
System.out.println(7 % 2); // 1 System.out.println(7.0 % 2); // 1.0 System.out.println(7 % 2.0); // 1.0 |
除数・被除数が小数部を持つ場合、整数商に対する剰余が実数で計算される。
|
System.out.println(5 % 2.5); // 0.0 System.out.println(5 % 1.5); // 0.5 System.out.println(5.5 % 1.5); // 1.0 |
除数・被除数が負数の場合は、商と剰余の以下の式から考える。
(1)
たとえば以下のように。
(2)
|
System.out.println(-7 % 2); // -1 System.out.println(7 % (-2)); // 1 System.out.println(-7 % (-2)); // -1 |
ゼロによる除算
整数除算でゼロで割ると実行時例外となる。剰余も除算を行っているので同じ。
|
System.out.println(7 % 0); // Exception in thread "main" java.lang.ArithmeticException: / by zero System.out.println(7 % 0); // Exception in thread "main" java.lang.ArithmeticException: / by zero |
浮動小数点演算の場合にゼロで割ると例外にならず、結果はInfinity
となる。剰余計算の場合は結果はNaN
|
System.out.println(1.0 / 0); // Infinity System.out.println(7.0 % 0); // NaN |
べき乗
べき乗の演算子はなく、必要ならMathpow()
メソッドを使う。
|
System.out.println(Math.pow(2, 3)); // 8.0 System.out.println(Math.pow(-2, 3)); // -8.0 System.out.println(Math.pow(2, -3)); // 8.0 |