Javaには、多くの演算子が用意されています。Javaに限らず今日のプログラムの発展は、条件分岐、繰り返しループ処理、そしてこれから学習する演算子の組み合わせにより導き出された回答をもとに急速に発展したと言っても過言ではありません。
このページを最後まで読めば、コンピュータを使った計算が、自由にできるようになります!
Javaの演算子
Javaの「式」は、主に「演算子」と「オペランド」を組み合わせて作ります。
式の組み合わせ要素
- 演算子:演算するもの
- オペランド:演算の対象
例えば、下記の演算式を例にした場合、「1」及び「2」のオペランドを「+」演算子で組み合わせ、「3」の値を導き出しています。
1 (オペランド)+ (演算子)2(オペランド) = 3(値)
「+」演算子以外にも様々な処理を「計算」する演算子が用意されています。
四則演算子
四則演算子は、「加算(+)」「減産(-)」「乗算(*)」「除算(/)」「剰余算(%)」の計算を行う演算子です。
四則演算子 | 使用例 | 意味 |
+ | a + b | a に b を加える(加算) |
- | a - b | a から b を引く(減産) |
* | a * b | a に b をかける(乗算) |
/ | a / b | a を b で割る(除算) |
% | a % b | aの数値をbの数値で割った余りを返す(剰余算) |
ココに注意
「+」と「-」は分かりやすいですが、掛け算は「*(アスタリスク)」、割り算は「/(スラッシュ)」で表現することに注意しましょう。
では実際に計算してみましょう。ここでもSystem.out.println()を使って計算結果を出力します。
[Main.java (main method)]
1 2 3 4 5 6 7 |
public static void main(String[] args) { System.out.println("6 + 2の結果:" + (6 + 2)); //足し算 System.out.println("6 - 2の結果:" + (6 - 2)); //引き算 System.out.println("6 * 2の結果:" + (6 * 2)); //掛け算 System.out.println("6 / 2の結果:" + (6 / 2)); //割り算 System.out.println("6 % 2の結果:" + (6 % 2)); //剰余算 } |
コンソール
6 + 2の結果:8
6 - 2の結果:4
6 * 2の結果:12
6 / 2の結果:3
6 % 2の結果:0
コンソールに計算結果が出力されました。使用した算術演算子に合った結果が出力されているのが分かるかと思います。
この剰余算、ちょっと分かりずらいので補足します。主な使い道としては、表テーブル等の行の色を1段ごとに交互に変えたい場合などに、この剰余算を使用します。2で割ったあまりが0なら偶数、1なら奇数と言った具合です。ただ割るだけでなく、その余りを対象とします。
インクリメント・デクリメント
実際にプログラミングを進めて行くと、ある変数の値に別の値を「足していく」「引いていく」と言った連続の動作を行う機会が多々あります。
算術演算子 | 使用例 | 意味 |
++ | a++ or ++a | aの値を1増加する |
-- | a-- or --a | aの値を1減らす |
// 「加算」のインクリメント式
int result = 0;
result = result + 1;
System.out.println(result);
result = result + 1;
System.out.println(result);
result = result + 1;
System.out.println(result);
上記の結果は下記の通り。
コンソール
1
2
3
インクリメント演算子
上記の「result + 1」の式を「result ++」で置き換えることが出来ます。この「++」演算子を「インクリメント演算子」と呼びます。
先ほどの式を書き換えると下記の様になります。
int result = 0;
System.out.println(result++);
System.out.println(result++);
System.out.println(result++);
同じ結果になるか試してみます。
コンソール
0 👈 !!!
1
2
微妙に結果が異なります。これは、演算子の評価順序が原因で起きています。「result++」の場合、先に「result」の部分が出力され、「result」の値を出力した後に「++」演算子が評価されています。
インクリメント演算子の評価順を変更してみましょう。その方法は「result++」を「++result」の様に反対にして、評価の優先順位を逆に変えれば良いのです。
インクリメントとデクリメントの評価順は、「++」演算子や「--」演算子が計算対象の「前にあるか」、「後ろにあるか」で計算結果に差が出ます。つまづきやすいので注意してください!
int result = 0;
System.out.println(++result);
System.out.println(++result);
System.out.println(++result);
コンソール
1
2
3
これで、初めの結果と一致しました。
デクリメント演算子
同様に「減算(--)」してみましょう。
// 「減算」のデクリメント式
int result = 10;
System.out.println(result--);
System.out.println(result--);
System.out.println(result--);
System.out.println("------------------------------------------");
result = 10;
System.out.println(--result);
System.out.println(--result);
System.out.println(--result);
コンソール
10
9
8
------------------------------------------
9
8
7
上記の「--」演算子を「デクリメント演算子」と呼びます。
比較演算子
比較演算子は、右辺と左辺の値を比較する演算子です。主に「if」文や、「switch」文と組み合わせて使用されることの多い演算子です。
比較演算子 | 使用例 | 意味 |
== | a == b | aとbは等しい |
!= | a != b |
aとbは等しくない |
> | a > b | aはbより大きい |
>= | a >= b | aはb以上 |
< | a < b | aはbより小さい |
<= | a <= b | aはb未満 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public static void main(String[] args) { int a = 1; int b = 2; String str = ""; str = a == b ? "真" : "偽"; System.out.println("a == b は [ " + str + " ]"); str = a != b ? "真" : "偽"; System.out.println("a != b は [ " + str + " ]"); str = a > b ? "真" : "偽"; System.out.println("a > b は [ " + str + " ]"); str = a >= b ? "真" : "偽"; System.out.println("a >= b は [ " + str + " ]"); str = a < b ? "真" : "偽"; System.out.println("a < b は [ " + str + " ]"); str = a <= b ? "真" : "偽"; System.out.println("a <= b は [ " + str + " ]"); } |
コンソール
a == b は [ 偽 ]
a != b は [ 真 ]
a > b は [ 偽 ]
a >= b は [ 偽 ]
a < b は [ 真 ]
a <= b は [ 真 ]
論理演算子
論理演算子は、複数の条件を組み合わせることができる演算子です。と言っても何のことだかさっぱりですよね?
要は、「〇〇であり、かつ、△△だったら」演算子と演算子の条件の間に「かつ」 or 「または」を繋げる場合の演算子と考えてください。
論理演算子の例
例A:結婚相手は絶対に「容姿端麗」かつ「お金持ち」の令嬢がいい!
「容姿端麗」== true && 「お金持ち」= true
例B:結婚相手は絶対に「容姿端麗」または「お金持ち」の令嬢がいい!
「容姿端麗」== true || 「お金持ち」= true
例Aの場合は、「&&」演算子は、左辺と右辺がともに「真(true)」の場合に全体の値を「真(true)」とします。どちらか一方でも成立しない場合は、全体の条件は成立しないことになります。
例Bの場合は、「||」演算子は、左辺と右辺のどちらかが「真(true)」の場合に全体の値を「真(true)」とします。
論理演算子 | 使用例 | 意味 |
&& | a == b | aとbが両方とも「真」だったら「true」、それ以外は「false」 |
|| | a || b | aとbのいずれか、もしくは両方とも「真」だったら「true」、それ以外は「false」 |
! | ! a |
条件が「真」だったら「false」に、「偽」だったら「true」にする(「!」は条件が逆になる演算子) |
上記の「例A」及び「例B」を式にすると下記の様になります。
boolean looking = true,wealthy = false;
System.out.println(looking && wealthy);
System.out.println(looking || wealthy);
System.out.println(looking || !wealthy);
実行してみましょう。
コンソール
false
true
true
実際のプログラミングでは、条件分岐「if」文との組み合わせで用いられることが多いです。
boolean looking = true,wealthy = false;
if (looking && wealthy ) {
System.out.println("是非結婚してください!");
}
if (looking || wealthy ) {
System.out.println("まずはお友達から!");
}
if (!looking && wealthy ) {
System.out.println("結婚を前提に!");
}
if (!looking && !wealthy ) {
System.out.println("あっちいけ!");
}
代入演算子
代入演算子は、基本的に「=」という記号を指します。この「=」記号と目的の四則演算子「+=」「-=」等を組み合わせたバリエーション演算子になります。左辺の変数に右辺の値を代入する演算子です。
代入演算子 | 使用例 | 意味 |
+= | a += b |
変数aの値に変数bの値を加算し、変数aにその値を代入する |
-= | a -= b | 変数aの値に変数bの値を減算し、変数aにその値を代入する |
*= | a *= b | 変数aの値に変数bの値を乗算し、変数aにその値を代入する |
/= | a /= b | 変数aの値に変数bの値を除算し、変数aにその値を代入する |
%= | a %= b | 変数aの値に変数bの値を剰余算し、変数aにその値を代入する |
代入演算子(加算)
int a = 0,b = 1;
a = a + b;
System.out.println(a);
a = a + b;
System.out.println(a);
a += b;
System.out.println(a);
コンソール
1
2
3
代入演算子(減算)
int a = 10,b = 1;
a = a - b;
System.out.println(a);
a = a - b;
System.out.println(a);
a -= b;
System.out.println(a);
コンソール
9
8
7
代入演算子(乗算)
int a = 10,b = 100;
a = a * b;
System.out.println(a);
a = a * b;
System.out.println(a);
a *= b;
System.out.println(a);
コンソール
1000
100000
10000000
代入演算子(除算)
int a = 10000,b = 5;
a = a / b;
System.out.println(a);
a = a / b;
System.out.println(a);
a /= b;
System.out.println(a);
コンソール
2000
400
80
代入演算子(剰余算)
int a = 10,b = 2;
a++;
a = a % b;
System.out.println(a);
a++;
a = a % b;
System.out.println(a);
a++;
a %= b;
System.out.println(a);
コンソール
1
0
1
シフト演算子
シフト演算子は、数値を2進数であらわした場合のケタを、右または左に指定数だけずらします。
代入演算子 | 使用例 | 意味 |
<<= | a <<= b | aの値をbで指定した桁数分左へずらし、右端から0で埋める |
>>= | a >>= b | 👆の逆 |
>>>= | a >>>= b | 正負にかかわらず左端から0を入れる右シフト演算を行う |
左シフト演算子(<<=)
int decimal = 5 , shift = 2;
System.out.println("10進数の" + decimal + "を2進数で表すと" + Integer.toBinaryString(decimal));
System.out.print(decimal + "を" + shift + "、左シフトすると");
decimal <<= shift;
System.out.println(decimal + "になります。");
System.out.println("10進数の" + decimal + "を2進数で表すと" + Integer.toBinaryString(decimal) + "になります。");
コンソール
10進数の5を2進数で表すと101
5を2、左シフトすると20になります。
10進数の20を2進数で表すと10100になります。
右シフト演算子(>>=)
int decimal = 5 , shift = 2;
System.out.println("10進数の" + decimal + "を2進数で表すと" + Integer.toBinaryString(decimal));
System.out.print(decimal + "を" + shift + "、右シフトすると");
decimal >>= shift;
System.out.println(decimal + "になります。");
System.out.println("10進数の" + decimal + "を2進数で表すと" + Integer.toBinaryString(decimal) + "になります。");
コンソール
10進数の5を2進数で表すと101
5を2、右シフトすると1になります。
10進数の1を2進数で表すと1になります。
「こんなの覚えて何の役に立つの?」思いますよね・・ 無理して覚える必要はありません。その時が来たらで十分です。ここでは「左シフト1回で数値が倍になる」、逆に「右シフト1回で1/2になる」と頭の片隅に置いておきましょう。