演算子と基本型のキャストについて、以下に分けて解説を進めます。
加算、減算、乗算、除算、それから剰余を求める演算子は次の通りです。剰余はあまり耳慣れないですが、実際のプログラム作成では、しばしば使われることがあります。
+
…加算-
…減算*
…乗算/
…除算%
…剰余(左側の数を右側の数で割った余り)演算の優先順序は実際の計算同様に、乗算や除算が、加算や減算より優先して行われます。また、必要に応じてカッコ「( )」を用いることで、演算順序を変えることができます。サンプルプログラムを以下に示します。
D201/D201.java
/** * 加減乗除と剰余の計算をします。 */ public class D201 { /** * メインメソッド * @param args 引数 */ public static void main(String[] args) { int x = 13; int y = 5; int a = x + y; int b = x - y; int c = x * y; int d = x / y; int e = x % y; System.out.println( x + "+" + y + "=" + a); System.out.println( x + "-" + y + "=" + b); System.out.println( x + "*" + y + "=" + c); System.out.println( x + "/" + y + "=" + d); System.out.println( x + "%" + y + "=" + e); // double型のときは、定数に「.0」をつけないと計算結果が狂うことがあります double p = 3.0 + 4.0 * 2.0; double q = (3.0 + 4.0) / 2.0; // 計算結果が狂った例 double r = (3 + 4) / 2; System.out.println("p=" + p); System.out.println("q=" + q); System.out.println("r=" + r); } }
実行結果は以下の通り。
13+5=18 13-5=8 13*5=65 13/5=2 13%5=3 p=11.0 q=3.5 r=3.0
注目すべき点は、変数 dの値。式の右辺では、整数÷整数の除算が実行されています。現実の世界では除算の結果は小数点数になることもありますが、Javaでは整数÷整数の除算は常に整数となります。同様の問題は変数 rの演算において顕著になります。それだと困る場合のために、後の項で基本型のキャストについて説明します。
算術演算子では、数値と数値を演算し、その結果は数値となります。比較演算子では、数値と数値を比較し、その結果がboolean型(つまり trueまたは false)で返ってくることが特徴です。比較演算子には次の 6つがあります。
==
…左側と右側が一致する場合に true、そうでない場合は false!=
…左側と右側が一致しない場合に true、そうでない場合は false>
…左側が右側より大きい場合に true、そうでない場合は false<
…左側が右側より小さい場合に true、そうでない場合は false>=
…左側が右側以上の場合に true、そうでない場合は false<=
…左側が右側以下の場合に true、そうでない場合は falseさっそくサンプルプログラムを載せてみます。
D202/D202.java
/** * 比較演算子を確認します。 */ public class D202 { /** * メインメソッド * @param args 引数 */ public static void main(String[] args) { int x = 35; boolean a = x == 30; boolean b = x != 30; boolean c = x > 30; boolean d = x < 30; boolean e = x >= 35; boolean f = x <= 35; System.out.println("xは 30と一致する " + a); System.out.println("xは 30と一致しない " + b); System.out.println("xは 30より大きい " + c); System.out.println("xは 30より小さい " + d); System.out.println("xは 35以上である " + e); System.out.println("xは 35以下である " + f); } }
実行結果は以下の通り。
xは 30と一致する false xは 30と一致しない true xは 30より大きい true xは 30より小さい false xは 35以上である true xは 35以下である true
boolean型の値と boolean型の値を演算し、その結果を返します。論理演算子は 2つあります。
&&
…論理積(いわゆるアンド、かつ)
||
…論理和(いわゆるオア、または)
論理演算子を用いたサンプルと、比較演算子と論理演算子を絡めたサンプルを以下に載せます。
D203/D203.java
(13行目に黄線が生じますが問題ありません)
/** * 論理演算子を確認します。 */ public class D203 { /** * メインメソッド。 * @param args 引数 */ public static void main(String[] args) { // 論理演算子単体のサンプル boolean a = true && false; boolean b = true || false; System.out.println("変数 aの値は " + a); System.out.println("変数 bの値は " + b); // 論理演算子と比較演算子の複合サンプル int x = 50; boolean p = x >= 30 && x <= 60; boolean q = x <= 20 || x >= 70; System.out.println("xは 30以上かつ 60以下である " + p); System.out.println("xは 20以下または 70以上である " + q); } }
実行結果は以下の通り。
変数 aの値は false 変数 bの値は true xは 30以上かつ 60以下である true xは 20以下または 70以上である false
12行目、13行目は、それぞれもうひとつ用意されている論理積演算子&
および論理和演算子|
を使うほうが良いのですが(そうすれば黄線も消えます)、&
および|
は使用機会がほとんどなく、&&
および||
との使い分けなどについて説明するのも手間がかかるため、省略します。
その他にも幾つかあるのですが、利用頻度が少ないということで本ウェブサイトでは省略します。
三項演算子はこの「条件式」しか存在しないので、条件式はしばしば三項演算子とも呼ばれます。書式は次の通り。
?
B :
C
Aは boolean型の値でなければなりません。Bと Cは同じ型とします。もし表計算ソフトを利用したことがあるのなら、IF関数(IF(A, B, C)
)と同じようなものと思っていただければ良いです。
他の演算子と組み合わせたサンプルは以下。
D204/D204.java
/** * 条件式(三項演算子)を確認します。 */ public class D204 { /** * メインメソッド。 * @param args 引数 */ public static void main(String[] args) { int x; int y; x = 30; y = (x > 10) ? 100 : 200; System.out.print("変数 xが " + x + "のとき、"); System.out.println("変数 yは " + y); x = -5; y = (x > 10) ? 100 : 200; System.out.print("変数 xが " + x + "のとき、"); System.out.println("変数 yは " + y); } }
実行結果は以下の通り。
変数 xが 30のとき、変数 yは 100 変数 xが -5のとき、変数 yは 200
代入演算子は、これまでに見てきたとおり=
です。演算子右側を演算結果を、左側の変数に代入します。あと、雑学的に覚えておきたいものが 2つだけあります。
これらの結果、(実際に使うかはともかくとして)まとめ代入ができます。あと、その他に少し注意点があるので、以下のサンプルプログラムにまとめます。
D205/D205.java
/** * 代入演算子を確認します。 */ public class D205 { /** * メインメソッド。 * @param args 引数 */ public static void main(String[] args) { int a, b, c, d; // まとめ代入 a = b = c = d = 5; System.out.println("変数 aの値は " + a); System.out.println("変数 bの値は " + b); System.out.println("変数 cの値は " + c); // インクリメント d = d + 1; System.out.println("変数 dの値は " + d); } }
実行結果は以下の通り。
変数 aの値は 5 変数 bの値は 5 変数 cの値は 5 変数 dの値は 6
14行目の代入によって、変数 a, b, c, dに 5が代入されます。
20行目の d = d + 1
に注意してください。Javaでは「=」は代入演算子、右側の演算結果を左側の変数に代入します。つまり、「5 + 1」の演算結果である 6が変数 dに代入されます。代入演算子には、数学でいうところの「等しい」の意味はありませんので、ご注意ください。
既存の変数に対して加算、減算、乗算、除算、剰余をしたいときに、複合代入演算子を使用できる場合があります。複合代入演算子は、以下の 5つがあります。
+=
…加算-=
…減算*=
…乗算/=
…除算%=
…剰余サンプルプログラムは以下の通り。
D206/D206.java
/** * 複合代入演算子を確認します。 */ public class D206 { /** * メインメソッド。 * @param args 引数 */ public static void main(String[] args) { int a = 20; a += 8; System.out.println("値は " + a); a -= 4; System.out.println("値は " + a); a *= 2; System.out.println("値は " + a); a /= 3; System.out.println("値は " + a); a %= 5; System.out.println("値は " + a); } }
実行結果は以下の通り。
値は 28 値は 24 値は 48 値は 16 値は 1
booleanに対して使用する前置きの単項演算子です。Javaでは「!
」で表現します。否定演算子をつけることで、true
は false
に、false
は true
に変わります。
サンプルプログラムは以下の通り。
D207/D207.java
/** * 否定演算子を確認します。 */ public class D207 { /** * メインメソッド。 * @param args 引数 */ public static void main(String[] args) { boolean a; a = ! true; System.out.println("変数 aの値は " + a); int b = 30; boolean c = !(b > 50); System.out.println("変数 cの値は " + c); } }
実行結果は以下の通り。
変数 aの値は false 変数 cの値は true
インクリメント・デクリメントは単項の演算子す。前置きすることも後置きすることも可能で、前置きと後置きでは少し意味が異なるのですが、本ウェブサイトでは後置きに統一して記述します。
++
…インクリメント(1加算)--
…デクリメント(1減算)サンプルプログラムは以下の通り。
D208/D208.java
/** * インクリメント・デクリメントを確認します。 */ public class D208 { /** * メインメソッド。 * @param args 引数 */ public static void main(String[] args) { int a = 20; int b = 50; a ++; System.out.println("変数 aの値は " + a); b --; System.out.println("変数 bの値は " + b); } }
実行結果は以下の通り。
変数 aの値は 21 変数 bの値は 49
ある基本型の値を、別の基本型に変換したいときがあります。その際にはキャストという仕組みを利用します。
キャストは、基本型を表す予約語をカッコ「( )」でくくって表現します。
基本型のキャストの利用方法は大きく 2つに分類できます。
以下では、それぞれについて解説します。
より大きい型への変換は、基本的に、その先頭にキャストをつける。
サンプルプログラムとして、int
→double
への型変換を挙げます。
D209/D209.java
/** * 大きい型へのキャストを確認します。 */ public class D209 { /** * メインメソッド。 * @param args 引数 */ public static void main(String[] args) { int a = 50; int b = 20; // 右辺は整数型のため小数点以下の演算が無視される double p = a / b; System.out.println("変数 pの値は" + p); // 全体をくくってキャストしても意味が無い double q = (double)(a / b); System.out.println("変数 qの値は" + q); // 先頭にキャストをつければOK double r = (double)a / b; System.out.println("変数 rの値は" + r); // 各項目にキャストをつけてもOK double s = (double)a / (double)b; System.out.println("変数 sの値は" + s); } }
実行結果は以下の通り。
変数 pの値は2.0 変数 qの値は2.0 変数 rの値は2.5 変数 sの値は2.5
より小さい型への変換は、基本的に、全体を括弧でくくってキャストをつける。
サンプルプログラムとして、double
→int
への型変換を挙げます。
D210/D210.java
/** * 小さい型へのキャストを確認します。 */ public class D210 { /** * メインメソッド。 * @param args 引数 */ public static void main(String[] args) { double a = 30.0; double b = 10.5; // キャストをしない場合はビルドエラー // int p = a / b; // System.out.println("変数 pの値は " + p); // 全体をくくってキャストすればOK(小数点以下、切捨てになります) int q = (int)(a / b); System.out.println("変数 qの値は " + q); // 先頭にキャストをつけてもビルドエラー // int r = (int)a / b; // System.out.println("変数 rの値は " + r); // 各項目にキャストをつけた場合は計算が正常に行われない場合がある int s = (int)a / (int)b; System.out.println("変数 sの値は " + s); } }
実行結果は以下の通り。
変数 qの値は 2 変数 sの値は 3