Java 演算子

コンピュータの最も基本的な用途の1つは数学演算を実行することです。コンピュータ言語であるJavaも、変数を操作するための豊富な演算子を提供しています。演算子は次のグループに分類できます:

  • 算術演算子
  • 関係演算子
  • ビット演算子
  • 論理演算子
  • 代入演算子
  • その他の演算子

算術演算子

算術演算子は数式の中で使用され、その役割は数学における役割と同じです。次の表にすべての算術演算子を示します。

表の例では、整数変数Aの値が10、変数Bの値が20であると仮定します:

演算子 説明 例
+ 加算 - 演算子の両側の値を加算します A + B は 30 です
- 減算 - 左オペランドから右オペランドを引きます A - B は -10 です
* 乗算 - 演算子の両側の値を掛けます A * B は 200 です
/ 除算 - 左オペランドを右オペランドで割ります B / A は 2 です
% 剰余 - 左オペランドを右オペランドで割った余り B % A は 0 です
++ インクリメント: オペランドの値を1増やします B++ または ++B は 21 です(違いは後述)
-- デクリメント: オペランドの値を1減らします B-- または --B は 19 です(違いは後述)

例

以下の簡単なサンプルプログラムは算術演算子を示しています。次のJavaプログラムをコピーして貼り付け、Test.javaファイルとして保存し、コンパイルして実行してください:

例

public class Test { public static void main(String[] args) { int a = 10; int b = 20; int c = 25; int d = 25; System.out.println("a + b = " + (a + b) ); System.out.println("a - b = " + (a - b) ); System.out.println("a * b = " + (a * b) ); System.out.println("b / a = " + (b / a) ); System.out.println("b % a = " + (b % a) ); System.out.println("c % a = " + (c % a) ); System.out.println("a++ = " + (a++) ); System.out.println("a-- = " + (a--) ); //d++ と ++d の違いを確認 System.out.println("d++ = " + (d++) ); System.out.println("++d = " + (++d) ); } }

サンプルを実行 »

上記の例をコンパイルして実行した結果は次のとおりです:

a + b = 30
a - b = -10
a * b = 200
b / a = 2
b % a = 0
c % a = 5
a++   = 10
a--   = 11
d++   = 25
++d   = 27

インクリメント/デクリメント演算子

1. インクリメント(++)およびデクリメント(--)演算子これは特別な算術演算子です。算術演算子では演算に2つのオペランドが必要ですが、インクリメント/デクリメント演算子は1つのオペランドで演算します。

例

public class selfAddMinus{ public static void main(String[] args){ int a = 3;//変数を定義します; int b = ++a;//インクリメント演算 int c = 3; int d = --c;//デクリメント演算 System.out.println("インクリメント演算を行った後の値は次と等しくなります:"+b); System.out.println("デクリメント演算を行った後の値は次と等しくなります:"+d); } }

実行結果は次のとおりです:

进行自增运算后的值等于4
进行自减运算后的值等于2

解説:

  • int b = ++a; 演算過程を分解すると、a=a+1=4; b=a=4、最終結果はb=4、a=4です。

  • int d = --c; 演算過程を分解すると、c=c-1=2; d=c=2、最終結果はd=2、c=2です。

2. 前置インクリメント/デクリメント(++a, --a):最初にインクリメントまたはデクリメント演算を行い、その後に式の演算を行います。

3. 後置インクリメント/デクリメント(a++, a--):最初に式の演算を行い、その後にインクリメントまたはデクリメント演算を行います。例:

例

public class selfAddMinus{ public static void main(String[] args){ int a = 5;//変数を定義します; int b = 5; int x = 2*++a; int y = 2*b++; System.out.println("インクリメント演算子の前置演算後のa="+a+",x="+x); System.out.println("インクリメント演算子の後置演算後のb="+b+",y="+y); } }

実行結果は次のとおりです:

自增运算符前缀运算后a=6,x=12
自增运算符后缀运算后b=6,y=10

関係演算子

次の表はJavaでサポートされている関係演算子です。

表の例では、整数変数Aの値は10、変数Bの値は20です:

演算子 説明 例
== 2つのオペランドの値が等しいかどうかを調べ、等しい場合に条件はtrueになります。 (A == B)はfalseです。
!= 2つのオペランドの値が等しいかどうかを調べ、値が等しくない場合に条件はtrueになります。 (A != B) はtrueです。
>  左オペランドの値が右オペランドの値より大きいかどうかを調べ、その場合に条件はtrueになります。 (A > B)はfalseです。
<  左オペランドの値が右オペランドの値より小さいかどうかを調べ、その場合に条件はtrueになります。 (A < B)はtrueです。
>= 左オペランドの値が右オペランドの値以上であるかどうかを調べ、その場合に条件はtrueになります。 (A >= B)はfalseです。
<= 左オペランドの値が右オペランドの値以下であるかどうかを調べ、その場合に条件はtrueになります。 (A <= B)はtrueです。

例

以下の簡単なサンプルプログラムは関係演算子を示しています。次のJavaプログラムをコピーして貼り付け、Test.javaファイルとして保存し、コンパイルして実行してください:

Test.java ファイルのコード:

public class Test { public static void main(String[] args) { int a = 10; int b = 20; System.out.println("a == b = " + (a == b) ); System.out.println("a != b = " + (a != b) ); System.out.println("a > b = " + (a > b) ); System.out.println("a < b = " + (a < b) ); System.out.println("b >= a = " + (b >= a) ); System.out.println("b <= a = " + (b <= a) ); } }

上記の例をコンパイルして実行した結果は次のとおりです:

a == b = false
a != b = true
a > b = false
a < b = true
b >= a = true
b <= a = false

ビット演算子

Javaはビット演算子を定義しており、整数型(int)、長整数型(long)、短整数型(short)、文字型(char)、バイト型(byte)などの型に適用されます。

ビット演算子はすべてのビットに作用し、ビット単位で演算します。a = 60、b = 13とすると、それらの2進数形式での表現は次のようになります:

A = 0011 1100
B = 0000 1101
-----------------
A&B = 0000 1100
A | B = 0011 1101
A ^ B = 0011 0001
~A= 1100 0011

次の表はビット演算子の基本演算を示しています。整数変数Aの値が60、変数Bの値が13であるとします:

演算子 説明 例
& 対応するビットが両方とも1の場合、結果は1、それ以外の場合は0です。 (A & B)は12、すなわち0000 1100になります。
| 対応するビットが両方とも0の場合、結果は0、それ以外の場合は1です。 (A | B)は61、すなわち0011 1101になります。
^ 対応するビットの値が同じ場合、結果は0、それ以外の場合は1です。 (A ^ B)は49、すなわち0011 0001になります。
〜 ビット反転演算子はオペランドの各ビットを反転させます。つまり0は1に、1は0になります。 (~A)は-61、すなわち1100 0011になります。
<<  ビット左シフト演算子。左オペランドを右オペランドで指定されたビット数だけ左にシフトします。 A << 2 は240、すなわち1111 0000になります。
>>  ビット右シフト演算子。左オペランドを右オペランドで指定されたビット数だけ右にシフトします。 A >> 2 は15、すなわち1111になります。
>>>  ゼロ埋め右シフト演算子。左オペランドの値を右オペランドで指定されたビット数だけ右にシフトし、移動によって生じた空きビットは0で埋められます。 A>>>2 は15、すなわち0000 1111になります。

例

以下の簡単なサンプルプログラムはビット演算子を示しています。次のJavaプログラムをコピーして貼り付け、Test.javaファイルとして保存し、コンパイルして実行してください:

Test.java ファイルのコード:

public class Test {   public static void main(String[] args) {     int a = 60; /* 60 = 0011 1100 */       int b = 13; /* 13 = 0000 1101 */      int c = 0;      c = a & b;       /* 12 = 0000 1100 */      System.out.println("a & b = " + c );      c = a | b;       /* 61 = 0011 1101 */      System.out.println("a | b = " + c );      c = a ^ b;       /* 49 = 0011 0001 */      System.out.println("a ^ b = " + c );      c = ~a;          /*-61 = 1100 0011 */      System.out.println("~a = " + c );      c = a << 2;     /* 240 = 1111 0000 */      System.out.println("a << 2 = " + c );      c = a >> 2;     /* 15 = 1111 */      System.out.println("a >> 2  = " + c );       c = a >>> 2;     /* 15 = 0000 1111 */      System.out.println("a >>> 2 = " + c );   } } 

上記の例をコンパイルして実行した結果は次のとおりです:

a & b = 12
a | b = 61
a ^ b = 49
~a = -61
a << 2 = 240
a >> 2  = 15
a >>> 2 = 15

論理演算子

次の表は論理演算子の基本演算を示しています。ブール変数Aはtrue、変数Bはfalseとします。

演算子 説明 例
&& 論理AND演算子と呼ばれます。2つのオペランドが両方ともtrueの場合にのみ、条件はtrueになります。 (A && B)はfalseです。
| | 論理OR演算子と呼ばれます。2つのオペランドのいずれかがtrueの場合、条件はtrueになります。 (A || B)はtrueです。
! 論理否定演算子と呼ばれます。オペランドの論理状態を反転させるために使用します。条件がtrueの場合、論理否定演算子はfalseになります。 !(A && B)はtrueです。

例

以下の簡単なサンプルプログラムは論理演算子を示しています。次のJavaプログラムをコピーして貼り付け、Test.javaファイルとして保存し、コンパイルして実行してください:

例

public class Test { public static void main(String[] args) { boolean a = true; boolean b = false; System.out.println("a && b = " + (a&&b)); System.out.println("a || b = " + (a||b) ); System.out.println("!(a && b) = " + !(a && b)); } }

上記の例をコンパイルして実行した結果は次のとおりです:

a && b = false
a || b = true
!(a && b) = true

短絡論理演算子

論理AND演算子を使用する場合、両方のオペランドがtrueのときにのみ結果がtrueになりますが、最初のオペランドがfalseと判定された時点で結果は必ずfalseになるため、2番目のオペランドは評価されません。

例

public class LuoJi{ public static void main(String[] args){ int a = 5;//変数を定義します。 boolean b = (a<4)&&(a++<10); System.out.println("短絡論理演算子を使用した結果は次のとおりです。"+b); System.out.println("aの結果は"+a); } }

実行結果は次のとおりです。

使用短路逻辑运算符的结果为false
a的结果为5

解説:このプログラムは短絡論理演算子(&&)を使用しています。まず a<4 の結果が false と判断されるため、b の結果は必ず false になります。したがって、2番目のオペランド a++<10 の判定は実行されないため、a の値は 5 のままです。


代入演算子

以下はJava言語がサポートする代入演算子です。

演算子 説明 例
= 単純な代入演算子。右オペランドの値を左オペランドに代入します。 C = A + B は A + B で得られた値を C に代入します。
+ = 加算代入演算子。左オペランドと右オペランドを加算し、その結果を左オペランドに代入します。 C += A は C = C + A と同等です。
- = 減算代入演算子。左オペランドから右オペランドを減算し、その結果を左オペランドに代入します。 C -= A は C = C - A と同等です。
* = 乗算代入演算子。左オペランドと右オペランドを乗算し、その結果を左オペランドに代入します。 C *= A は C = C * A と同等です。
/ = 除算代入演算子。左オペランドを右オペランドで除算し、その結果を左オペランドに代入します。 C /= A は、C と A が同じ型の場合、C = C / A と同等です。
(%)= 剰余代入演算子。左オペランドを右オペランドで除算した余りを左オペランドに代入します。 C %= A は C = C % A と同等です。
<< = 左シフト代入演算子 C <<= 2 は C = C << 2 と同等です。
>> = 右シフト代入演算子 C >>= 2 は C = C >> 2 と同等です。
&= ビットAND代入演算子 C &= 2 は C = C & 2 と同等です。
^ = ビットXOR代入演算子 C ^= 2 は C = C ^ 2 と同等です。
| = ビットOR代入演算子 C |= 2 は C = C | 2 と同等です。

例

次の簡単なサンプルプログラムは代入演算子を示しています。以下のJavaプログラムをコピーして Test.java ファイルとして保存し、コンパイルして実行してください。

Test.java ファイルのコード:

public class Test { public static void main(String[] args) { int a = 10; int b = 20; int c = 0; c = a + b; System.out.println("c = a + b = " + c ); c += a ; System.out.println("c += a  = " + c ); c -= a ; System.out.println("c -= a = " + c ); c *= a ; System.out.println("c *= a = " + c ); a = 10; c = 15; c /= a ; System.out.println("c /= a = " + c ); a = 10; c = 15; c %= a ; System.out.println("c %= a  = " + c ); c <<= 2 ; System.out.println("c <<= 2 = " + c ); c >>= 2 ; System.out.println("c >>= 2 = " + c ); c >>= 2 ; System.out.println("c >>= 2 = " + c ); c &= a ; System.out.println("c &= a  = " + c ); c ^= a ; System.out.println("c ^= a   = " + c ); c |= a ; System.out.println("c |= a   = " + c ); } }

上記の例をコンパイルして実行した結果は次のとおりです。

c = a + b = 30
c += a  = 40
c -= a = 30
c *= a = 300
c /= a = 1
c %= a  = 5
c <<= 2 = 20
c >>= 2 = 5
c >>= 2 = 1
c &= a  = 0
c ^= a   = 10
c |= a   = 10

条件演算子(?:)

条件演算子は三項演算子とも呼ばれます。この演算子は3つのオペランドを持ち、ブール式の値を判定する必要があります。この演算子の主な目的は、どの値を変数に代入するかを決定することです。

variable x = (expression) ? value if true : value if false

例

Test.java ファイルのコード:

public class Test { public static void main(String[] args){ int a , b; a = 10; //a が 1 に等しい場合は true となり、b を 20 に設定します。それ以外の場合は 30 に設定します。 b = (a == 1) ? 20 : 30; System.out.println( "Value of b is : " + b ); //a が 10 に等しい場合は true となり、b を 20 に設定します。それ以外の場合は 30 に設定します。 b = (a == 10) ? 20 : 30; System.out.println( "Value of b is : " + b ); } }

上記の例をコンパイルして実行した結果は次のとおりです。

Value of b is : 30
Value of b is : 20

instanceof 演算子

この演算子はオブジェクトインスタンスを操作するために使用され、そのオブジェクトが特定の型(クラス型またはインターフェイス型)であるかどうかをチェックします。

instanceof 演算子の使用形式は次のとおりです。

( Object reference variable ) instanceof  (class/interface type)

演算子の左側の変数が指すオブジェクトが、演算子の右側のクラスまたはインターフェイス(class/interface)のオブジェクトである場合、結果は true になります。

次に例を示します。

String name = "James";
boolean result = name instanceof String; // 由于 name 是 String 类型,所以返回真

比較されるオブジェクトが右側の型と互換性がある場合、この演算子は引き続き true を返します。

次の例を見てください。

class Vehicle {} public class Car extends Vehicle { public static void main(String[] args){ Vehicle a = new Car(); boolean result = a instanceof Car; System.out.println( result); } }

上記の例をコンパイルして実行した結果は次のとおりです。

true

Java 演算子の優先順位

複数の演算子が1つの式に含まれる場合、どれが先に評価されるのでしょうか。これは演算子の優先順位の問題に関わります。複数の演算子を含む式では、演算子の優先順位が異なると、最終的な結果が大きく異なることがあります。

例えば、(1+3)+(3+2)*2 という式では、加算を最優先で計算すると答えは 18 になりますが、乗算を最優先で計算すると答えは 14 になります。

もう1つの例として、x = 7 + 3 * 2; の場合、x は 20 ではなく 13 になります。これは、乗算演算子が加算演算子よりも優先順位が高いため、最初に 3 * 2 を計算して 6 を得て、それから 7 を加算するからです。

次の表では、最も優先順位が高い演算子が表の最上部にあり、最も低い優先順位のものが表の下部にあります。

カテゴリ 演算子 結合性
後置 () [] . (ドット演算子) 左から右
単項 expr++ expr-- 左から右
単項 ++expr --expr + - ~ ! 右から左
乗法 * /% 左から右
加法 + - 左から右
シフト >> >>>  <<  左から右
関係 > >= < <=  左から右
等価 ==  != 左から右
ビットAND & 左から右
ビットXOR ^ 左から右
ビットOR | 左から右
論理AND && 左から右
論理OR | | 左から右
条件 ?: 右から左
代入 = + = - = * = / =%= >> = << =&= ^ = | = 右から左
カンマ , 左から右
その他の拡張