[Java入門] 演算子

※本ブログでは、商品・サービスのリンク先にプロモーションを含みます。

スポンサーリンク
スポンサーリンク

演算子とは

演算子とは代入(=)や四則演算(+-*/)などの何らかの演算を行うために記述する識別子のことです。
オペランドを1つとるものは単項演算子、2つとるものは2項演算子と呼ぶなどいくつかの種類があります。

単項演算子

オペランドを1つとる演算子で、下表のような種類があります。

演算子意味
+プラス
マイナス
~補数
++インクリメント
デクリメント
!論理否定
(型名)型変換(キャスト)

記述例:

public class CL1{
	public static void main(String args[])
	{
		int     data1 = 10;
		int     data2;
		float   data3;
		boolean flg = false;
		
		data2 = +data1;	// +
		System.out.println("+data1(10) = " + data2);
		
		data2 = -data1;	// -
		System.out.println("-data1(10) = " + data2);
		
		data1 = 0x12345678;
		data2 = ~data1;	// ~
		System.out.println("~data1(0x12345678) = 0x" + Integer.toHexString(data2));
		
		data2 = 10;
		++data2;		// ++
		System.out.println("++data2(10) = " + data2);
		
		--data2;		// --
		System.out.println("--data2(11) = " + data2);
		
		if(!flg){		// !
			System.out.println("flgはfalseです");
		}else{
			System.out.println("flgはtrueです");
		}
		
		data3 = (float)data2;	// Cast
		System.out.println("data3 = " + data3);
	}

}

実行結果:

+data1(10) = 10

-data1(10) = -10

~data1(0x12345678) = 0xedcba987

++data2(10) = 11

–data2(11) = 10

flgはfalseです

data3 = 10.0

2項演算子

演算子意味
+加算・文字列連結
減算
*乗算
/除算
%剰余
&ビット論理積(AND)
|ビット論理和(OR)
^ビット排他的論理和(XOR)
<<算術左シフト
>>算術シフト
>>>論理右シフト
>より大きい
<より小さい
>=以上
<=以下
==等価
!=非等価
instanceof型比較
&&論理積(AND)
||論理和(OR)

記述例:

public class CL2{
	public static void main(String args[])
	{
		int data1 = 10;
		int data2 = 3;
		int data3;
		
		data3 = data1 + data2;	// 加算
		System.out.println("data1+data2 = " + data3);
		
		data3 = data1 - data2;	// 減算
		System.out.println("data1-data2 = " + data3);
		
		data3 = data1 * data2;	// 乗算
		System.out.println("data1*data2 = " + data3);
		
		data3 = data1 / data2;	// 除算
		System.out.println("data1/data2 = " + data3);
		
		data3 = data1 % data2;	// 剰余
		System.out.println("data1%data2 = " + data3);
		
		data3 = 0xFFFFFFFF & 0x12345678;	// ビット論理積
		System.out.println("0xFFFFFFFF&0x12345678 = 0x" + String.format("%08x", data3));
		
		data3 = 0xFFFFFFFF | 0x12345678;	// ビット論理和
		System.out.println("0xFFFFFFFF|0x12345678 = 0x" + String.format("%08x", data3));
		
		data3 = 0xFFFFFFFF ^ 0x12345678;	// ビット排他的論理和
		System.out.println("0xFFFFFFFF^0x12345678 = 0x" + String.format("%08x", data3));
		
		data3 = 0xFFFFFFFF << 4;	// 算術左シフト
		System.out.println("0xFFFFFFFF<<4 = 0x" + String.format("%08x", data3));
		
		data3 = 0xFFFFFFF0 >> 4;	// 算術右シフト
		System.out.println("0xFFFFFFF0>>4 = 0x" + String.format("%08x", data3));
		
		data3 = 0xFFFFFFF0 >>> 4;	// 論理右シフト
		System.out.println("0xFFFFFFF0>>>4 = 0x" + String.format("%08x", data3));
		
		if(data1 > data2){	// より大きい
			System.out.println("data1はdata2より大きい");
		}else{
			System.out.println("data1はdata2より小さい");
		}
		
		if(data1 == data2){	// 等価
			System.out.println("data1とdata2は等しい");
		}else{
			System.out.println("data1とdata2は等しくない");
		}
		
		boolean flg1 = true, flg2 = false;
		if(flg1 && flg2){		// 論理積
			System.out.println("flg1とflg2はどちらもtrue");
		}else if(flg1 || flg2){	// 論理和
			System.out.println("flg1とflg2のどちらかがtrue");
		}
	}
}

実行結果:

data1+data2 = 13

data1-data2 = 7

data1*data2 = 30

data1/data2 = 3

data1%data2 = 1

0xFFFFFFFF&0x12345678 = 0x12345678

0xFFFFFFFF|0x12345678 = 0xffffffff

0xFFFFFFFF^0x12345678 = 0xedcba987

0xFFFFFFFF<<4 = 0xfffffff0

0xFFFFFFF0>>4 = 0xffffffff

0xFFFFFFF0>>>4 = 0x0fffffff

data1はdata2より大きい

data1とdata2は等しくない

flg1とflg2のどちらかがtrue

※instanceof演算子については別のページで解説します。

プリインクリメントとポストデクリメント

++(インクリメント)は値に1を足しますが、変数の前に書くか後ろに書くかで動作が変わります。
前に書く方をプリインクリメント、後ろに書く方をポストインクリメントと言います。
動作の違いを見てみましょう。

public class CL3{
	public static void main(String args[])
	{
		int data1 = 10;
		int data2;
		
		data2 = data1++;
		System.out.println("data2 = "+data2);
		
		data1 = 10;
		data2 = ++data1;
		System.out.println("data2 = "+data2);

	}
}

実行結果:

data2 = 10

data2 = 11

同じインクリメントですが結果が異なることが分かりますね。
ポストインクリメントは代入後にインクリメントされ、プリインクリメントは代入前にインクリメントされます。
これはデクリメントも同様です。

実行順序に不安がある場合は、1行に書かずに式を分けてしまいましょう。

複合代入演算子

2項演算子と代入を1度に書くことができます。
次の演算子が使用できます。

演算子意味
+=加算代入
-=減算代入
*=乗算代入
/=除算代入
%=剰余代入
&=ビット論理積代入
|=ビット論理和代入
^=ビット排他的論理和代入
<<=算術左シフト代入
>>=算術右シフト代入
>>>=倫理右シフト代入

記述例:

public class CL4{
	public static void main(String args[])
	{
		int data1 = 10;
		int data2 = 5;
		
		data1 += data2;	// data1 = data1 + data2 と同義
		System.out.println("data1 = "+data1);
	}
}

実行結果:

data1 = 15

3項演算子

3項演算子を使用すると、単純なif-else文を1行で書くことができます。
形式は以下の通りです。

(条件式)? 真の場合に返す値 : 偽の場合に返す値

記述例:

public class CL5{
	public static void main(String args[])
	{
		int data1 = 10;
		int data2 = 5;
		int data3;
		
		data3 = (data1 == 0)? data1 : data2;
		/*
		次の処理と同義
		if(data1 == 0){
			data3 = data1;
		}else{
			data3 = data2;
		}
		*/
		System.out.println("data3 = "+data3);
	}
}

実行結果:

data3 = 5

new演算子

new演算子は配列やクラスのオブジェクト(実体)を生成するときに使用します。

記述例:

public class CL6{
	public static void main(String args[])
	{
		int data[];	// int型の配列を扱う変数を宣言
		data = new int[3];	// int型の配列(要素数=3)のオブジェクトを生成
		
		data[0] = 1;
		data[1] = 2;
		data[2] = 3;
		
		System.out.println("data[0] = "+data[0]);
		System.out.println("data[1] = "+data[1]);
		System.out.println("data[2] = "+data[2]);
	}
}

実行結果:

data[0] = 1

data[1] = 2

data[2] = 3

演算子の優先順位

小学校の算数で、足し算や引き算より、掛け算や割り算を先に計算すると習いましたね。
例:1 + 2 × 3 = 7
そして、足し算を先に計算したい場合はカッコ()を付けていましたね。
例:(1 + 2) × 3 = 9
Javaでも同じように演算子に優先順位があり、()で括ることで優先度を上げることができます。
演算子の優先順位は下表の通りです。

優先度演算子・記号名前
1(高)()
[]
.
++
引数
配列アクセス
メンバアクセス
ポストインクリメント
ポストデクリメント
2!
~
+

++
論理否定
補数
プラス
マイナス
プリインクリメント
プリデクリメント
3new
()
オブジェクト生成
型変換(キャスト)
4*
/
%
乗算
除算
剰余
5+
加算(文字列連結)
減算
6<<
>>
>>>
算術左シフト
算術右シフト
論理右シフト
7>
<
>=
<=
instanceof
より大きい
より小さい
以上
以下
型比較
8==
!=
等価
非等価
9&ビット論理積
10^ビット排他的論理和
11|ビット論理和
12&&論理積
13||論理和
14? :3項演算子(条件:代入)
15(低)=代入、複合代入

スポンサーリンク
java

コメント