演算子とは
演算子とは代入(=)や四則演算(+-*/)などの何らかの演算を行うために記述する識別子のことです。
オペランドを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(低) | = | 代入、複合代入 |
コメント