Javaには普段よく使われている四則演算の他、さまざまな演算子があります。
演算子 | 構文 | 説明 |
+ | x + y | xにyを加えます。 |
- | x - y | xからyを引きます。 |
* | x * y | xにyを掛けます。 |
/ | x / y | xをyで割ります。 |
% | x % y | xをyで割った余りです。 |
演算子 | 構文 | 説明 |
++ | ++x | xに+1してxを評価します。(前置演算) |
x++ | xを評価したあとxに+1します。(後置演算) | |
-- | --x | xに-1してxを評価します。(前置演算) |
x-- | xを評価したあとxに-1します。(後置演算) |
前置演算と後置演算の違いは代入演算時やクラスの引数に利用した場合など多くの場合に見られます。
例として代入演算時に使用した場合の動作を確認します。
・サンプルソース(Sample0301.java)
public class Sample0301 { public static void main(String[] args) { int x = 1; int y; // 代入演算での評価の違い y = ++x; System.out.println("前置演算( y = ++x; )"); System.out.println("x = " + x); System.out.println("y = " + y); x = 1; y = x++; System.out.println("後置演算( y = x++; )"); System.out.println("x = " + x); System.out.println("y = " + y); } }
・出力結果
C:\dev\java>javac Sample0301.java [Enter] C:\dev\java>java Sample0301 [Enter] 前置演算( y = ++x; ) x = 2 y = 2 後置演算( y = x++; ) x = 2 y = 1 ← インクリメントされる前に代入されている
演算子 | 構文 | 説明 |
& | x & y | 論理積(AND)を行います。 |
| | x | y | 論理和(OR)を行います。 |
^ | x ^ y | 排他的論理和(XOR)を行います。 |
~ | ~x | 否定(NOT)を行います。 |
|
|
|
|
シフト演算子とはビットをずらしていく演算子です。但し、float型、double型、ポインタ型には使用することができません。
2進数において桁が上がっていくことになるので、元の値に対して2倍していくことと同じになります。
数値xに対して左にnビットシフトさせる場合の書式は次のようになります。
x << n
左シフトによるビット変化のイメージは下図のようになりす。
2進数において桁が下がっていくことになるので、元の値に対して1/2倍していくことと同じになります。右シフトの場合はさらに対象となる変数の型が「符号付」の場合と「符号なし」の場合で処理が変わります。
・符号付のとき
数値xに対して右にnビットシフトさせる場合の書式は次のようになります。
x >> n
符号付のときは左端のビットが符号の意味を持つため、シフトにより符号が変化しないよう元の値と同じ値で補充されます。
このようなシフトは「算術シフト」と呼ばれ、処理イメージは下図のようになります。
・符号なしのとき
数値xに対して右にnビットシフトさせる場合の書式は次のようになります。
x >>> n
符号なしのときの右シフトは左シフトと同じ処理になります。これらを「論理シフト」と呼び、処理イメージは次のようになります。
演算子 | 構文 | 説明 |
= | x = y | yをxに代入します。 |
+= | x += y | xに(x + y)を代入します。 |
-= | x -= y | xに(x - y)を代入します。 |
*= | x *= y | xに(x * y)を代入します。 |
/= | x /= y | xに(x / y)を代入します。 |
%= | x %= y | xに(x % y)を代入します。 |
&= | x &= y | xに(x & y)を代入します。 |
|= | x |= y | xに(x | y)を代入します。 |
^= | x ^= y | xに(x ^ y)を代入します。 |
<<= | x <<= y | xに(x << y)を代入します。 |
>>= | x >>= y | xに(x >> y)を代入します。 |
演算子 | 構文 | 説明 |
&& | x && y | 論理積(AND)を行います。 |
|| | x || y | 論理和(OR)を行います。 |
! | !x | 排他的論理和(XOR)を行います。 |
|
|
|
論理演算子とビット演算子の違いは、論理演算子の場合その結果がTrue(0以外はすべて1とみなす)またはFalse(0)のどちらかになるという事です。ですから各オペランドの演算結果を値として取得する場合はビット演算子、真か偽かの判別を行いたい場合は論理演算を使用します。
演算子 | 構文 | 説明 |
== | x == y | xとyは等価である。 |
!= | x != y | xとyは等価ではない。 |
< | x < y | xはyより小さい(未満)。 |
<= | x <= y | xはy以下である。 |
> | x > y | xはyより大きい。 |
>= | x >= y | xはy以上である。 |
「,」(カンマ)で区切られた式や値は左から順に評価されていきます。このときの「,」(カンマ)が順次演算子です。
・サンプルソース(Sample0302.java)
public class Sample0302 { public static void main(String[] args) { int x, y; // 宣言での順次演算子の例 for (x = 0, y = 0; x < 3; x++, y++) { // for制御内での順次演算子の例 x = x * 1; y = y * 2; /* ちなみにC言語では式に対しても次のように順次演算子が使用できます。 x = x * 1, y = y * 2; */ System.out.println("x=" + x + ", y=" + y); } } }
・出力結果
C:\dev\java>javac Sample0302.java [Enter] C:\dev\java>java Sample0302 [Enter] x=0, y=0 x=1, y=2 x=2, y=6
条件演算子(三項演算子)は「if~else~」文と同じ処理を1行で記述する事が出来る演算子です。
・サンプルソース(Sample0303.java)
public class Sample0303 {
public static void main(String[] args) {
int i, x = 3, y = 5;
String str;
for (i = 1; i < 3; i++) {
x = x * i;
System.out.println("X=" + x + ", Y=" + y);
System.out.println(x > y ? "XはYより大きい" : "XはYより小さい");
}
}
}
・出力結果
C:\dev\java>javac Sample0303.java [Enter] C:\dev\java>java Sample0303 [Enter] X=3, Y=5 XはYより小さい X=6, Y=5 XはYより大きい
優先順位 | 結合方向 | 演算子 | 種類 |
1 | 左から | 「()」,「.」,「[]」,「++」,「--」 |
後置演算子 (引数,メンバ呼出し,配列添字,後置増分,後置減分) |
2 | 右から | 「++」,「--」,「~」,「!」,「+」,「-」 |
単項演算子 (前置増分,前置減分,補数,論理否定,プラス, マイナス) |
3 | 右から | 「new」, 「(型)」 | オブジェクト生成, キャスト |
4 | 左から | 「*」,「/」,「%」 | 二項演算子(乗算,除算,剰余) |
5 | 左から | 「+」,「-」 | 二項演算子(加算,減算) |
6 | 左から | 「<<」,「>>」,「>>>」 | シフト演算子 (左シフト, 右シフト, 符号無しの右シフト) |
7 | 左から | 「<」,「<=」,「>」,「>=」,「instanceof」 | 関係演算子 (より小さい, 以下, より大きい, 以上, 型比較) |
8 | 左から | 「==」,「!=」 | 等値演算子(等価, 非等価) |
9 | 左から | 「&」 | ビット積演算子(AND) |
10 | 左から | 「^」 | ビット排他的論理和演算子(XOR) |
11 | 左から | 「|」 | ビット和演算子(OR) |
12 | 左から | 「&&」 | 論理積演算子(AND) |
13 | 左から | 「||」 | 論理和演算子(OR) |
14 | 右から | 「?:」 | 条件演算子 |
15 | 右から | 「=」,「*=」,「/=」,「%=」,「+=」,「-=」,「<<=」,「>>=」,「>>>=」,「&=」,「|=」,「^=」 | 代入演算子 (代入, 乗算代入, 除算代入, 剰余代入, 加算代入, 減算代入, 左シフト代入, 右シフト代入, 符号なし右シフト代入, 論理積代入, 論理和代入, 排他的論理和代入) |
16 | 左から | 「,」 | 順次演算子 |