算術演算子について
算術演算子とは、皆さんも学校で習ったことのある、算数の足し算、引き算、掛け算、割り算(余り)のことです。
それをプログラムで一般的な計算する場合、「+(足す)」「-(引く)」「*(掛ける)」「/(割る)」「%(余り)」を使用して行います。
【補足】
上記の他に「**(べき乗)」もありますが、あまり使われないので、今回は省きます。
算術演算子について、まずは下の表を見てみましょう。
| 演算子 | 名前 | 優先順位 | 例 | 使用例の説明 |
|---|---|---|---|---|
| + | 加算 | 2 | a + b | a および b の和 |
| – | 減算 | 2 | a – b | a と b の差 |
| * | 乗算 | 1 | a * b | a および b の積 |
| / | 除算 | 1 | a / b | a および b の商 |
| % | 剰余 | 1 | a % b | a を b で割った余り |
やってみよう!
「src」フォルダに「com.cmps.operator」パッケージを作成し、「Operator」クラスを作成して下さい。
mainメソッド内に以下のコードを記述し、出力結果を確認してみてください。
public static void main(String[] args) {
System.out.println(3 + 2);
System.out.println(10 - 3);
}
保存し、実行をクリックすると、コンソール上に「5」と「7」が表示されたかと思います。
同じ要領で以下の問題にも挑戦してみましょう。
- マイナス3とマイナス5を加算してみましょう。
- 100に対して93.5を減算してみましょう。
- マイナス5に対して5を乗算してみましょう。
- 9に対して2で除算してみましょう。
- 8に対して3で剰余してみましょう。
回答(クリックで開きます)
-8
6.5
-25
4
2
除算の結果が「4」、剰余の結果が「2」になっていると思われます。
Javaの特徴の一つで、整数で計算した時には、整数の結果を返す、という性質があります。
今回の割り算の場合は、9から2を割った結果、割ることができる4は出力され、余りは無視されます。
また、余りの場合は、8から3を割った結果、割ることができる2は無視されて、余りの2が出力されます。
少数の取り扱いについて
先程、整数で計算した時には整数の結果を返す性質があるとお話ししました。
では、少数はどのように取り扱えばいいのでしょうか。
以下のソースをそれぞれ入力してみてください。
System.out.println(5.0 + 2);
System.out.println(5.0 / 2);
それぞれ、「7.0」「2.5」と出力されます。
実行時にあらかじめ小数点を配置することで、整数とは別の扱いすることができます。
この小数点がついた数のことを実数と呼びます。
Javaでは、計算した結果、どちらか一方が実数であれば、最終的な出力は実数となります。
優先順位について
まずは下記のように書いて出力してみましょう。
- 問1: 5 + 10 -7
- 問2: 10 * 8 / 2 % 6
- 問3: 2 + 10 * 8
- 問4: 5 * 5 + 10 / 5 – 2
上から順に結果はこのようになるかと思います。
「8、4、82、25」
問1と問2は優先順位が同じ演算子のため、結合順に従い計算が行われます。
一方、問3は乗算の優先順位が加算より高いので乗算を先に行い計算が行われます。
(10 * 8 で 80 となり 80 + 2 で 82 となります。)
問4ですが乗算と除算の方が加算と減算よりも優先順位が高い為、乗算と除算を左から先に行い、加算と減算を左から後で行います。
(5 * 5 で 25 、10 / 5 で 2 となり、25 + 2 で 27 となり、27 – 2 で 25 となります。)
「()」の使用について
まずは下記のように書いて出力してみましょう。
- 問1: 10 * 8 / (2 % 6)
- 問2: (2 + 10) * 8
- 問3: 5 * (5 + 10 / 5) – 2
- 問4: 5 * ((5 + 10) / 5) – 2
結果はどうでしたか?先ほど解いた問題と似ていますが「()」を使用したことにより結果は違ったかと思います。
上から順に結果はこのようになるかと思います。
「40、96、33、13」
問1は優先順位が同じ演算子のため、本来は結合順に従い計算が行われますが、「()」が使用されている為、先に「()」部分を計算してから左から順に計算されます。
(2 % 6で2となり、10 * 8で80となり、80 / 2で40となります。)
そのあとの問い2、問3も同様で「()」が使用されている為、先に「()」部分を計算してから左から順に計算されます。
(2 + 10で12となり、12 * 8で96となります。)
問3については「()」内で加算と除算が行われている為、先に除算してから加算しています。
(10 / 5 で 2 となり 5 + 2 で 7 となり 5 * 7 で 35 となり 35 – 2 で 33 となります。)
ただ問4は「()」が二つ使用されている為、内側にあるものから計算されていきます。
(5 + 10 で 15 となり 15 / 5 で 3 となり 5 * 3 で 15 となり 15 – 2 で 13 となります。)
このように「()」内が優先して計算されますが、「()」内でも演算子が複数あれば優先順位通りに計算されます。
複合演算子について
代入演算子「=」とは、変数に対して値を代入するときに使用するもの、
そして代入演算子と他の演算子を組み合わせたものを複合演算子といいます。
複合演算子には次のようなものがあります。
| 複合演算子 | 例 | 使用例の説明 |
|---|---|---|
| += | a += b | a = a + b と同じ |
| -= | a -= b | a = a – b と同じ |
| *= | a *= b | a = a * b と同じ |
| /= | a /= b | a = a / b と同じ |
| %= | a %= b | a = a % b と同じ |
イメージとしては、先ほど学んだ算術演算子を簡略化したものです。
ただし、「=」がありますので代入しているため、必ず変数に対して行う必要があります。
〇:int num = 5;//変数numに格納する
num += 3;
×:5 += 3;//エラーが発生し、プログラムが作動しない
それではやってみましょう。変数numと変数figを用意します。
変数numに5、変数figに3を設定します。
変数numに対して変数figを各複合演算子を使用して出力して結果を確認してください。
インクリメント演算子とデクリメント演算子ついて
インクリメント(加算)演算子は、変数の数値を1つ増やす、
デクリメント(減算)演算子は、変数の数値を1つ減らすときに使用します。
インクリメント演算子とデクリメント演算子には次のようなものがあります。
| 複合演算子 | 名前 | 例 | 使用例の説明 |
|---|---|---|---|
| ++ | インクリメント演算子 | a++ または ++a | aの値を1増やす |
| −− | デクリメント演算子 | a−− または −−a | aの値を1減らす |
以下のコードを出力してみましょう。
int figure = 5;
figure++;
System.out.println(figure);
figure--;
System.out.println(figure);
「figure++」はfigureの値に対して1増やし、逆に「figure−−」はfigureの値に対して1減らしてくれています。
インクリメント演算子とデクリメント演算子には、それぞれ2種類の書き方があり、
++変数(−−変数)を前置、変数++(変数−−)を後置といいます。
前置と後置では演算のタイミングが異なります。
前置は、インクリメント(デクリメント)した後で新しい値を返し、
後置は、インクリメント(デクリメント)する前の値を返します。
以下のソースを出力してみましょう
figure = 5;
System.out.println(++figure); // 足された後に表示
System.out.println(figure); // 前置インクリメント後の値
インクリメントした後で新しい値を返すので、1回目の出力でも「6」が出力されます。
figure = 5;
System.out.println(figure++); // 表示した後に足される
System.out.println(figure); // 後置インクリメント後の値
インクリメントする前に元の値を返すので、1回目には「5」が出力されます。
このように前置と後置では演算のタイミングが異なりますので、気を付けましょう。
また、インクリメント、デクリメント演算子については、原則、処理の途中では用いないようにしましょう。
上記の System.out.println(figure++); は前置後置の違いを知るために処理の中に記述していますが、
「figure++」自体が「figure = figure + 1」に等しい処理だからであり、誤読や想定しない処理を招く可能性もあります。
今後使用するときは 「figure++;」のみで1行を取るようにしましょう。
文字列の取り扱いについて
System.out.println("Hello world");
このプログラムをよく見てみると、Hello world、という文字に対して「”(ダブルクォーテーション)」でくくられていることが分かります。
「”」を使って文字を囲むことで、その文字は「文字列」として扱うことができます。
「+」演算子は算術演算だけでなく、文字列と文字列を結合する際にも演算子として利用することができます。(文字列連結)
以下のソースを出力してみましょう
String str = "Hello";
String word = "World";
System.out.println(str + word);
上記の例では、「”Hello”」という文字列と「”World”」という文字列に対して、「+」を使って文字同士を繋げ合わせているように見えます。
なお、文字列の結合にはStringBuilderというクラスを使用する場合もあります。
それは「Stringの操作」にて取り扱います。
文字列と数字の併用
以下のソースを出力してみましょう。
// 例1
System.out.println("ABC" + 123);
// 例2
System.out.println("ABC" + 12 + 3);
どちらも「ABC123」と出力されたはずです。
例1を見てみると、「123」という数字は整数として扱われていますが、”ABC”という文字列と重ねることで文字列としての扱いが優先されて「123」という数字は文字列として取り扱われ、結果として「ABC123」という文字列が出力されます。
例2も例1と同じく「ABC123」と出力されました。
Java上での計算の扱いには左から順番に計算される、という特徴があります。
順を追って解説をすると、
1.「ABC」という文字列と、12という整数の計算が行われる。文字列が優先されるので、12も文字列として取り扱われ、”ABC12″という結果になる。
2.”ABC12″という文字列と、3という整数の計算が行われる。1と同じく文字列が優先されるので、3も文字列として取り扱われ、”ABC123″という結果になる。
では整数として取り扱っている数字を整数として取り扱うためにはどうすればよいでしょう?
答えは、整数の計算箇所に()をつけて計算を優先させてあげることです。
以下のソースを試しに記載してみてください。
System.out.println("ABC" + (12 + 3));
()内の計算が優先され、「ABC15」という出力結果になったかと思います。
