演算子とは
演算子とは代入(=)や四則演算(+-*/)などの何らかの演算を行うために記述する識別子のことです。
オペランドを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 | ! ~ + – ++ — | 論理否定 補数 プラス マイナス プリインクリメント プリデクリメント |
| 3 | new () | オブジェクト生成 型変換(キャスト) |
| 4 | * / % | 乗算 除算 剰余 |
| 5 | + – | 加算(文字列連結) 減算 |
| 6 | << >> >>> | 算術左シフト 算術右シフト 論理右シフト |
| 7 | > < >= <= instanceof | より大きい より小さい 以上 以下 型比較 |
| 8 | == != | 等価 非等価 |
| 9 | & | ビット論理積 |
| 10 | ^ | ビット排他的論理和 |
| 11 | | | ビット論理和 |
| 12 | && | 論理積 |
| 13 | || | 論理和 |
| 14 | ? : | 3項演算子(条件:代入) |
| 15(低) | = | 代入、複合代入 |



コメント