目次
2. 演算子と代入
2.1. 演算子の種類と説明
演算子とはプログラミングにおいて、演算方法を指示する記号のことです。演算の対象となる値や変数はオペランドといい、「x + 100
」の場合「+
」が演算子で、「x
」、「100
」がオペランドです。
(1) 代入演算子
変数に値の代入を行うには代入演算子=
を使用します。
X
にY
の値を代入する場合
X = Y;[例]
X
に10
を代入する場合
X = 10;
次に代入演算子を利用したサンプルプログラムを示します。
[DainyuEnzanshi.java]public class DainyuEnzanshi { public static void main(String[] args) { // int型の変数xを宣言 int x; // int型の変数yを宣言 int y; // 変数yに10を代入 y = 10; // 変数xに変数yの値を代入 x = y; // 結果を表示 System.out.println("変数xの値は " + x + " です。"); System.out.println("変数yの値は " + y + " です。"); } }
実行例は次のようになります。
C:¥java>java DainyuEnzanshi 変数xの値は 10 です。 変数yの値は 10 です。
(2) 算術演算子
Javaでは加算、減算、乗算、除算にはそれぞれ普通の+
、-
、*
、/
が使用できます。このようなデータの算術を行う演算子を算術演算子と呼びます。以下が使用できる算術演算子の一覧です。
算術演算子 | 使用例 | 説明 |
+ |
x+ y |
x とy を足し合わせます(加算) |
- |
x- y |
x からy を引きます(減算) |
* |
x* y |
x とy を掛け合わせます(乗算) |
/ |
x/ y |
x をy で割ります(除算) |
% |
x% y |
x をy で割った余りを求めます(剰余) |
次に算術演算子を利用したサンプルプログラムを示します。
[SanjyutsuEnzanshi.java]public class SanjyutsuEnzanshi { public static void main(String[] args) { int x = 20; int y = 10; // 加算 int a = x + y; // 減算 int b = x - y; // 乗算 int c = x * y; // 除算 int d = x / y; // 剰余 int e = x % y; // 結果を表示 System.out.println("変数aの値は " + a + " です。"); System.out.println("変数bの値は " + b + " です。"); System.out.println("変数cの値は " + c + " です。"); System.out.println("変数dの値は " + d + " です。"); System.out.println("変数eの値は " + e + " です。"); } }
実行例は次のようになります。
C:¥java>java SanjyutsuEnzanshi 変数aの値は 30 です。 変数bの値は 10 です。 変数cの値は 200 です。 変数dの値は 2 です。 変数eの値は 0 です。
(3) 演算子の簡略化
代入演算子と算術演算子を組み合わせて式を簡略化することができます。
簡略化された算術演算子 | 使用例 | 使用例と同じ意味の式 |
+= |
x+= y |
x = x + y |
-= |
x-= y |
x = x - y |
*= |
x*= y |
x = x * y |
/= |
x/= y |
x = x / y |
%= |
x%= y |
x = x % y |
次に簡略化した演算子を利用したサンプルプログラムを示します。
[KanryakuEnzanshi.java]public class KanryakuEnzanshi { public static void main(String args[]) { int x = 20; int y = 10; // x = x + y;と同様 x += y; System.out.println("変数xの値は " + x + " です。"); } }
実行例は次のようになります。
C:¥java>java KanryakuEnzanshi 変数xの値は 30 です。
(4) インクリメント演算子、デクリメント演算子
1を足したり、引いたりする演算はよく使用されるので専用の演算子が用意されています。1を足すことをインクリメント、1を引くことをデクリメントと呼びます。インクリメントを行うには変数の前か後に++
演算子を付けます。これをインクリメント演算子と呼びます。デクリメントを行うには変数の前か後に--
演算子を付けます。これをデクリメント演算子と呼びます。変数の前に演算子を付けた場合と変数の後に演算子をつけた場合とでは意味が違うので注意しなければなりません。
算術演算子 | 使用例 | 説明 |
++ |
++x |
x に1 を足した後に式を評価します |
++ |
x++ |
式を評価した後に1 を足します |
-- |
--x |
x から1 引いた後に式を評価します |
-- |
x-- |
式を評価した後に1 を引きます。 |
演算子を変数の前につけた場合と後につけた場合の違いを簡単な例で説明します。
[例] 前につけた場合int x = 10; int y = ++x;
x
は11
、y
は11
になります。x
に1
を足した後にその値をy
に代入する動作になります。
int x = 10; int y = x++;
x
は11
、y
は10
になります。x
の値をy
に代入した後にx
に1
を足す動作になります。
次にインクリメント演算子を利用したサンプルプログラムを示します。
[InkurimentoEnzanshi.java]public class InkurimentoEnzanshi { public static void main(String[] args) { int x; int y; x = 10; // 前に付けた場合 y = ++x; System.out.println("**前に付けた場合**"); System.out.println("変数xの値は " + x + " です。"); System.out.println("変数yの値は " + y + " です。"); x = 10; // 後に付けた場合 y = x++; System.out.println("**後に付けた場合**"); System.out.println("変数xの値は " + x + " です。"); System.out.println("変数yの値は " + y + " です。"); } }
実行例は次のようになります。
C:¥java>java InkurimentoEnzanshi **前に付けた場合** 変数xの値は 11 です。 変数yの値は 11 です。 **後に付けた場合** 変数xの値は 11 です。 変数yの値は 10 です。
(5) 比較演算子
変数の値の大小を調べる場合には比較演算子を使用します。比較演算子を使用した式の結果はtrue
またはfalse
のboolean型の値になります。
比較演算子 | 使用例 | 説明 |
> |
x > y |
x がy よりも大きい場合true になります |
>= |
x >= y |
x がy より大きいか等しい場合true になります |
< |
x < y |
x がy より小さい場合true になります |
<= |
x <= y |
x がy より小さいか等しい場合true になります |
== |
x == y |
x とy が等しい場合true になります |
!= |
x != y |
x とy が等しくない場合true になります |
x
とy
が等しいかどうか判定する場合
if (x == y) { System.out.println("xとyは等しいです"); }
次に比較演算子を利用したサンプルプログラムを示します。
[HikakuEnzanshi.java]public class HikakuEnzanshi { public static void main(String[] args) { int x = 10; int y = 20; if (x == y) { System.out.println("xとyは等しいです。"); } else if (x > y) { System.out.println("xはyより大きいです。"); } else if (x < y) { System.out.println("xはyより小さいです。"); } } }
実行例は次のようになります。
C:¥java>java HikakuEnzanshi xはyより小さいです。
(6) 論理演算子
AかつB、AまたはB、などのように複数の式の条件を組み合わせる場合に使用します。
論理演算子 | 使用例 | 説明 |
&& |
a && b |
a とb の両方がtrue の場合にtrue になります |
|| |
a || b |
a とb のいずれかがtrue の場合にtrue になります |
! |
!a |
a がfalse の場合にtrue になります |
x == y
かつ x == z
の場合
if (x == y && x == z) { System.out.println("'x=yかつy=z'が成り立ちます。"); }
次に比較演算子を利用したサンプルプログラムを示します。
[RonriEnzanshi.java]public class RonriEnzanshi { public static void main(String args[]) { int x = 10; int y = 20; int z = 20; boolean flag = false; if (x == y && y == z) { System.out.println("'x=yかつy=z'が成り立ちます。"); } else { System.out.println("'x=yかつy=z'が成り立ちません。"); } if (x == y || y == z) { System.out.println("'x=yまたはy=z'が成り立ちます。"); } else { System.out.println("'x=yまたはy=z'が成り立ちません。"); } if (!flag) { System.out.println("flagはfalseです。"); } else { System.out.println("flagはtrueです。"); } } }
実行例は次のようになります。
C:¥java>java RonriEnzanshi 'x=yかつy=z'が成り立ちません。 'x=yまたはy=z'が成り立ちます。 flagはfalseです。
(7) ビット演算子
ビット演算子とは変数に格納されたデータのビットを直接操作するための演算子のことです。
※ビット演算子については実際に利用する機会は少ないため、余裕のある場合のみ内容を確認してください。
ビット演算子 | 使用例 | 説明 |
& |
x & y |
x とy が整数型の場合、x とy のビットごとのAND演算を行う |
| |
x | y |
x とy が整数型の場合、x とy のビットことのOR演算を行う |
^ |
x ^ y |
x とy が整数型の場合、x とy のビットごとのXOR演算を行う |
~ |
~x |
x が整数型の場合、x のビットごとのNOT演算を行う |
(ア) AND演算(&)
論理積演算とも呼ばれます。入力されたビットが両方とも1
の場合に1
を出力する演算です。
入力1 | 入力2 | 出力 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
1 |
(イ) OR演算(|)
論理和演算とも呼ばれます。入力されたビットのいずれかが1
の場合に1
を出力する演算です。
入力1 | 入力2 | 出力 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
(ウ) XOR演算(^)
排他的論理和演算とも呼ばれます。入力された2つのビットが異なっていた場合1
を出力する演算です。
入力1 | 入力2 | 出力 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
0 |
(エ) NOT演算(~)
論理否定演算とも呼ばれます。入力されたビットを反転して出力する演算です。
入力 | 出力 |
0 |
1 |
1 |
0 |
次にビット演算子を利用したサンプルプログラムを示します。
[BitEnzanshi.java]public class BitEnzanshi { public static void main(String[] args) { // ビット表現 00000011 byte b1 = 3; // ビット表現 00001001 byte b2 = 9; // i1のビット表現 00000000 00000000 00000000 00000001 int i1 = b1 & b2; // i2のビット表現 00000000 00000000 00000000 00001011 int i2 = b1 | b2; // i3のビット表現 00000000 00000000 00000000 00001010 int i3 = b1 ^ b2; // i4のビット表現 11111111 11111111 11111111 11111100 int i4 = ~b1; System.out.println("i1の値は " + i1 + " です。"); System.out.println("i2の値は " + i2 + " です。"); System.out.println("i3の値は " + i3 + " です。"); System.out.println("i4の値は " + i4 + " です。"); } }
実行例は次のようになります。
C:¥java>java BitEnzanshi i1の値は 1 です。 i2の値は 11 です。 i3の値は 10 です。 i4の値は -4 です。
(8) シフト演算子
ビットを直接操作するためにシフト演算子を使用することができます。シフトとはビットを右または左にずらす操作のことです。
※シフト演算子については実際に利用する機会は少ないため、余裕のある場合のみ内容を確認してください。
シフト演算子 | 使用例 | 説明 |
<< |
x << a |
x のビットをa ビットだけ左にシフトさせる。右端には0 が入る。一般に、nビット左にシフトすると元の数に2nかけた値になります。 |
>> |
x >> a |
x のビットをa ビットだけ右にシフトさせる。左端には最上位ビットと同じ値が入る。一般に、nビット右にシフトする元の数を2nで割った値になります。(算術右シフト) |
>>> |
x >>> a |
x のビットをa ビットだけ右にシフトさせる。左端には0 が入る。左端に0 が入るので符号の区別がない演算に使用します。(論理右シフト) |
2
を5ビット左にシフトする場合( 2 << 5
)
10進数 | 2進数 | |
演算前 | 2 |
00000000 00000000 00000000 00000010 |
演算後 | 2 × 2 の5乗 = 64 |
00000000 00000000 00000000 01000000 |
-64
を5ビット右にシフトする場合( -64 >> 5
)
10進数 | 2進数 | |
演算前 | -64 |
00000000 00000000 00000000 11000000 |
演算後 | -64 ÷ 2 の5乗 = -2 |
00000000 00000000 00000000 11111110 |
次にシフト演算子を利用したサンプルプログラムを示します。
[ShiftEnzanshi.java]public class ShiftEnzanshi { public static void main(String args[]) { // ビット表現 00000011 byte b1 = 3; // i1のビット表現 00000000 00000000 00000000 00000110 int i1 = b1 << 1; // i2のビット表現 00000000 00000000 00000000 00011000 int i2 = b1 << 3; System.out.println("i1の値は " + i1 + " です。"); System.out.println("i2の値は " + i2 + " です。"); } }
実行例は次のようになります。
C:¥java>java ShiftEnzanshi i1の値は 6 です。 i2の値は 24 です。
(9) 三項演算子
演算子には、単項演算子、二項演算子、三項演算子の3種類あります。単項演算子は+50
や++x
などのように演算対象が1つの演算子のことです。二項演算子は5 + 10
やx >= y
のように演算対象が2つの演算子のことです。これらに対して、三項演算子は演算対象が3つある演算子のことをいいます。
三項演算子 | 使用例 | 説明 |
?: |
A ? x : y |
A がtrue ならx の式を評価した値を返し、A がfalse ならy の式を評価した値を返します。 |
次に三項演算子を利用したサンプルプログラムを示します。
[SankouEnzanshi.java]public class SankouEnzanshi { public static void main(String args[]) { int x = 10; int y = 20; String s = x == y ? "同じ" : "違う"; // 結果を表示 System.out.println("sの値は " + s + " です。"); } }
実行例は次のようになります。
C:¥java>java SankouEnzanshi sの値は 違う です。
(10) 演算子の優先順位
複数の演算子を組み合わせて1つの式にする場合、どの演算から処理が行われるか決める演算子の優先順位が存在します。例えば以下の例の場合、最初にb * c
が行われてその次にa
が足されます。これは演算子*
が演算子+
よりも優先順位が高いためです。
a + b * c
以下が演算子の優先順位を表にしたものです。
優先順位 | 出力 |
高い | . [] () |
↑ | ++ -- ! ~ |
↑ | new (キャストするための型) |
↑ | * / % |
↑ | + - |
<< >> >>> |
|
> >= < <= instanceof |
|
↓ | == != |
↓ | & ^ | |
↓ | && || |
↓ | ?: |
低い | = += -= *= /= %= &= ^= |= <<= >>= >>>= |
2.2. 演習問題
(1) 以下の内容に従ったプログラムを作成しなさい。
・ クラス名はKeisan
とする。
・ num
という名前のint型変数を宣言する。
・ rate
という名前のfloat型変数を宣言する。
・ 変数num
には「150
」、変数rate
には「10.5
」を代入する。
・ 最後にprintln()
ステートメントを使い、変数num
と変数rate
の値に対して以下の算術計算を行い結果を表示する。
加算、減算、乗算、除算、剰余
・ 表示結果は以下のようになる。
160.5 139.5 1575.0 14.285714 3.0
(2) 以下の内容に従ったプログラムを作成しなさい。
・ クラス名はIncrement
とする。
・ num1
という名前のint型の変数を宣言する。
・ num2
という名前のint型の変数を宣言する。
・ 変数num1
に値「1
」を代入する。
・ num2
にnum1
の値を代入する際にインクリメント演算子を利用して変数num1
には「2
」を、num2
には「1
」を代入する。
・ 最後にprintln()
ステートメントを使い、変数num1
と変数num2
の値を表示する。
・ 表示結果は以下のようになる。
2 1
(3) 以下の内容に従ったプログラムを作成しなさい。
・ クラス名はHikaku
とする。
・ int型の変数num1
、num2
、num3
を宣言する。
・ boolean型の変数judge1
、judge2
、judge3
、judge4
を宣言する。
・ 変数num1
には「1
」を、num2
には「1
」を、num3
には「2
」を代入する。
・ 変数num1
の値がnum2
の値よりも大きいかどうかを評価し、結果を変数judge1
に代入する。
・ 変数num1
の値がnum2
の値以下であるかを評価し、結果を変数judge2
に代入する。
・ 変数num1
の値とnum3
の値が等しい、且つnum1
の値がnum2
の値以上であるかを評価し、結果を変数judge3
に代入する。
・ 変数num1
の値とnum3
の値が等しい、あるいはnum1
の値がnum2
の値以上であるかを評価し、結果を変数judge4
に代入する。
・ 最後にprintln()
ステートメントを使い、変数judge1
、judge2
、judge3
、judge4
の値を表示する。
・ 結果は以下のようになる。
false true false true