演算子はプログラムを組む上で必ず使います。
ですから演算子についての知識というのは基本中の基本なのですが、まだ学習を始めたばかりの方にとっては結構忘れがちなものやあまり理解できていないものもあると思います。
そこで今回はこの演算子についておさらいも踏まえて解説していきます。
演算子とは
プログラムには沢山の演算子が使われています。計算はもとより、左辺と右辺を比較する場合や一定の条件に合致するか否か、また、変数への代入時などなど。
中でも一番理解し易く馴染みの深い演算子は恐らく計算につかう演算子でしょうか。
小学生の頃に習った算数にも演算子は沢山使われています。何のことかというと、足し算や引き算といった四則計算に使われている記号のことです。
プログラムではこれらの計算の他にも文字列の結合やデータの参照など色々な部分で演算子を使います。
演算子の種類
演算子にはいくつかの種類が存在します。
まずはどのような種類があるのかについて見てみましょう。
- 算術演算子
- 代入演算子
- 比較演算子
- 論理演算子
- ビット演算子
これらの詳細は後述しますが、こうやって見るだけでも色々な種類の演算子が使われていることがわかります。
ただこれらの中には、馴染みの深いものや説明を読めばすぐに理解できるものが多くありますので、学習を始めてあまり時間が経っていない方も身構える必要は全くありません。
こういった種類があるんだなという程度で覚えておいてください。
次からはこれらの演算子をコードも踏まえながら詳細に解説していきたいと思います。
算術演算子
これは基本中の基本であり、これを理解できていないというのであればプログラムは絶対に組めないと思った方が良いでしょう。
まずはこの部分のおさらいも踏まえてどのようなものがあり、どういった形で利用するのかについて解説します。
加算
足し算のことです。プラス記号(+)を使って数値を足すほかに、文字列と文字列を結合させる場合にも使います。
減算
引き算のことです。マイナス記号(-)を使って計算をします。
加算では文字列も扱えましたが、減算では文字列を扱えません。
もし文字列から1文字削除したいというのであれば、それ専用のメソッドを使うことになります。
乗算
掛け算のことです。パソコンでは一般的な掛け算の記号(×)は無いのでアスタリスク(*)が掛け算の記号に割り振られています。
除算
割り算のことです。こちらも一般的に使われている記号はありませんのでスラッシュ(/)が割り振られています。
注意すべき点としては、プログラミングの世界では単純に割り算をした場合、浮動小数点も余りも算出されません。
詳しくは後述しますが、例えばスラッシュ(除算に使う記号)を使って5割る3を計算すると返ってくる値は1となります。
剰余
割り算で割り切れない場合の余りのことです。プログラミングの世界ではパーセント(%)記号を使って計算します。
こちらも後述しますが、剰余計算をする場合の注意点としては、パーセント(剰余に使う記号)を使って計算する場合、剰余の部分しか返ってこないということです。
インクリメント・デクリメント
インクリメントとは数値を1ずつ足していくことで、デクリメントは逆に数値を1ずつ引いていくことを言います。
インクリメントはプラス(+)を二つ連続で記述し、デクリメントはマイナス(-)を二つ連続で記述することで作用します。
またこれら二つの演算子には前置形と後置形があり、前置形は1を加算または減算した後で変数に代入するのに対し、後置形は変数に代入した後で1を加算または減算します。
インクリメント及びデクリメントはループ処理で使われるケースが一般的です。
コードで記述
それでは今まで解説してきた記号を使って実際のコードで記述してみましょう。
public class Main { public static void main(String[] args) { int num1 = 5; int num2 = 3; int result; String str1 = "文字列"; String str2 = "結合"; String resultStr; // 加算 result = num1 + num2; System.out.println("加算:" + result); // 文字列の結合 resultStr = str1 + str2; System.out.println("結合:" + resultStr); // 減算 result = num1 - num2; System.out.println("減算:" + result); // 乗算 result = num1 * num2; System.out.println("乗算:" + result); // 除算 result = num1 / num2; System.out.println("除算:" + result); // 剰余 result = num1 % num2; System.out.println("剰余:" + result); // 前置インクリメント num1 = 5; result = ++num1; System.out.println("前置インクリメント:" + result); // 後置インクリメント num1 = 5; result = num1++; System.out.println("後置インクリメント:" + result); // 前置デクリメント num1 = 5; result = --num1; System.out.println("前置デクリメント:" + result); // 後置デクリメント num1 = 5; result = num1--; System.out.println("後置デクリメント:" + result); } }
実行結果
加算:8 加算:8 結合:文字列結合 減算:2 乗算:15 除算:1 剰余:2 前置インクリメント:6 後置インクリメント:5 前置デクリメント:4 後置デクリメント:5
インクリメント・デクリメントをループ処理で使う場合は以下のように記述します。
public class Main { public static void main(String[] args) { String arr[] = {"red", "green", "blue"}; for (int num = 0; num < arr.length; num++) { System.out.println("this color is " + arr[num]); } } }
実行結果
this color is red this color is green this color is blue
代入演算子
代入演算子は名前の通り、変数に文字や数値を代入する場合に使う演算子です。
イコール(=)はプログラミングでもよく出てくる代入演算子の一つです。
数学の世界でも意味は同じで、x = 3 + 5という式は3に5を足した数をxに代入するという意味で使われているはずです。
それでは代入演算子にはどのようなものがあるのか見てみましょう。
代入
イコール(=)を使って表します。
加算して代入
プラス記号(+)とイコール(=)を連続で記述します。
減算して代入
マイナス記号(-)とイコール(=)を連続で記述します。
乗算して代入
アスタリスク(*)とイコール(=)を連続で記述します。
除算して代入
スラッシュ(/)とイコール(=)を連続で記述します。
余りを代入
パーセント(%)とイコール(=)を連続で記述します。
コードで記述
それでは今まで解説してきた記号を使って実際のコードで記述してみましょう。
public class Main { public static void main(String[] args) { int num; int result; // ①代入 num = 3; result = 0; System.out.println("num = " + num); System.out.println("result = " + result); // 加算して代入 result += num; // ①でnumに3を代入しているため、resultの数値も変わる System.out.println("result = " + result); // 減算して代入 result -= num; // この段階でnumは3となっている System.out.println("result = " + result); // 乗算して代入 result = 5; // resultに5を代入 result *= num; // この段階でnumは3となっている System.out.println("result = " + result); // 除算して代入 result /= num; // この段階でresultは15、numは3となっている System.out.println("result = " + result); // 剰余して代入 result %= num; // この段階でresultは5、numは3となっている System.out.println("result = " + result); } }
実行結果
num = 3 result = 0 result = 3 result = 0 result = 15 result = 5 result = 2
比較演算子
比較演算子とは、左辺と右辺の数値が同じかどうか等の比較をする場合に使う演算子です。
左辺は右辺より大きい
左辺 > 右辺という形で記述します。
左辺は右辺より小さい
左辺 < 右辺という形で記述します。
左辺は右辺以上
左辺 >= 右辺という形で記述します。
左辺は右辺以下
左辺 <= 右辺という形で記述します。
左辺は右辺は等しい
左辺 == 右辺という形で記述します。
左辺は右辺は同じではない
左辺 != 右辺という形で記述します。
コードで記述
それでは今まで解説してきた記号を使って実際のコードで記述してみましょう。
public class Main { public static void main(String[] args) { int num_a = 5; int num_b = 3; String str_a = "Sample"; String str_b = "Sample"; // 左辺 > 右辺 System.out.println(num_a > num_b); // 左辺 < 右辺 System.out.println(num_a < num_b); num_a = 3; num_b = 3; // 左辺 >= 右辺 if(num_a >= num_b) { System.out.println("num_a は num_b 以上"); } // 左辺 <= 右辺 if(num_a <= num_b) { System.out.println("num_a は num_b 以下"); } // 左辺 == 右辺 if(num_a == num_b) { System.out.println("num_a は num_b は同じ"); } num_a = 4; // 左辺 != 右辺 if(num_a != num_b) { System.out.println("num_a は num_b は同じではない"); } // 文字列の比較にはequalsを使用しないと正確な比較が出来ないので注意! if(str_a.equals(str_b)) { System.out.println("str_a は str_b は同じ"); } str_b = "sample"; // Sample → sample と変更(先頭大文字 → 先頭小文字) if(str_a.equals(str_b)) { } else { System.out.println("str_a は str_b は同じではない"); } } }
実行結果
true false num_a は num_b 以上 num_a は num_b 以下 num_a は num_b は同じ num_a は num_b は同じではない str_a は str_b は同じ str_a は str_b は同じではない
if文を使わずそのままprintln()で表示させるとBoolean型として「true/false」で返ってきます。
また文字列の比較にはequalsメソッドを使わないと正しい比較が出来ないので注意してください。
論理演算子
真偽の比較のための演算子のことです。結果はtrue/falseで返ってきます。
aかつbがtrueの場合
アンパサンド(&)を続けて二つ記述します。aとbが両方真の場合にtrueを返します。
aまたはbがtrueの場合
バーティカルバー(|)を続けて二つ記述します。aまたはbが真の場合にtrueを返します。
xがtrueではない場合
エクステンション(!)とイコール(=)を続けて記述します。xが真ではない場合にfalseを返します。
xとyのどちらか片方がtrueの場合
キャレット(^)を記述します。xとyのどちらか片方だけが真の場合にtrueを返します。
コードで記述
それでは今まで解説してきた記号を使って実際のコードで記述してみましょう。
public class Main { public static void main(String[] args) { int num1 = 2; int num2 = 4; // num1,num2が両方真の場合true System.out.println((num1 < 3) && (num2 > 3)); // num1,num2どちらかが真の場合true System.out.println((num1 < 3) || (num2 > 3)); // num1が真ではない場合true System.out.println(!(num1 > 3)); // num1,num2どちらか一方だけが真の場合true System.out.println((num1 > 3) ^ (num2 > 3)); // num1は3より小さい為、trueが返ってくる } }
実行結果
true true true true
ビット演算子
ビット演算子は恐らくハードを直接触るようなプログラミングでしか使う場面が無いと思いますので、あまり見かけることはないと思います。
通信関係やバイナリファイルを扱うことがあるなら、この演算子に対する知識が必要というレベルで覚えておいてください。
abどちらにもセットされているビット
アンパサンド(&)を使って記述します。
aまたはbにセットされているビット
バーティカルバー(|)を使って記述します。
10進数のaをbビット左シフト
小なり(<)を二つ連続で記述します。
10進数のaをbビット右シフト
大なり(>)を二つ連続で記述します。
10進数のaをbビットを左右どちらかへシフト、シフトの逆側は0で埋める
大なりまたは小なりを3つ連続で記述します。シフトと違うところは、移動した桁数だけ0で埋めます。
10進数のaのビットを反転
チルダ(~)を使って記述します。
それでは今まで解説してきた記号を使って実際のコードで記述してみましょう。
public class Main { public static void main(String[] args) { byte b; byte x = 16; byte y = 32; byte z = 64; System.out.println(b = 0x55 & 0x0F); System.out.println(b = 0x55 | 0x0F); System.out.println("16を左に4ビットシフト:" + (x << 4)); System.out.println("32を右に4ビットシフト:" + (y >> 4)); System.out.println("64を右に4ビットシフトして0埋め:" + (z >>> 4)); System.out.println("64のビットを反転:" + (~z)); } }
実行結果
5 95 16を左に4ビットシフト:256 16を右に4ビットシフト:2 128を右に4ビットシフトして0埋め:4 128のビットを反転:-65
まとめ
今回は演算子について出来るだけ具体的に解説してみましたが、いかがでしたか?
演算子はプログラムにおいて他のどんなものよりも使う場面が多いものですので、この記事を読んでしっかり学習することを強くお勧めします。
極論にはなりますが、プログラムはクラス毎のメソッド・その特徴と使い方、そして演算子さえきちんと理解できていれば、どんなプログラムでも悩むことなく作ることが出来ると言ってもいいでしょう。
そのためにも、まずはこういった基本的部分の理解度を出来る限り高めておくことが重要だと思います。