目次

参考:教科書 pp71-107

Javaの演算子


演算子はプログラム中で数値計算をしたり、比較をするといった、色々な操作をするために使う記号である。例えば、1+2 の + は足し算をするための演算子である。 また、この場合の1や2はオペランド(被演算数)と呼ばれる、いわば演算されるものである。

以下に主な演算子を説明する。

算術演算子

四則演算を行う演算子を紹介する。

演算子意味使い方結果の値
+加算 1 + 2 3
-減算 1 - 2 -1
-符号反転 -(-5) 5
*乗算(×) 1*2 2
/商算(÷) 10/3 3
%余り 10%3 1

オペランドが双方とも整数型の場合は、整数の計算がされる。例えば、10/3は3.33333… とはならずに、小数点以下が切り捨てられて結果の値は3となる。また、オペランドの片方でも 浮動小数点数である場合は、浮動小数点数として計算される。例えば、10/3.0 は 3.33333… という結果になる。10.0/3や 10.0/3.0 も同様である。

以上の規則は、変数を使った場合も同様である。 つまり、整数型と整数型の変数の四則演算は整数として、片方のオペランドでも浮動小数点数型の変数があれば浮動小数点数として計算される。

練習問題1

参考:教科書 pp.78-79

2つの整数型の変数 a, b をそれぞれ 11 と 3 で初期化し、変数 a, bの値を表示し、さらに以下の演算

a + b
a - b
a * b
a / b
b / a
a % b
b % a

の結果を出力するプログラム Arithmetic.java を書け。この結果とプログラム内容を見比べて、それぞれの計算の意味をよく考えよ。 ただし、結果の値だけ表示するのではなく、出力結果が例えば

a + b = 14

となるように演算式も書き出すように書くこと。

練習問題2

2つの整数型の変数 a, b をそれぞれ 11 と 3 で初期化し、浮動小数点数型の変数 c, d もそれぞれ 11 と 3で初期化せよ。そして、変数 a, b, c, dの値を表示し、さらに以下の演算

c / b
d / a
a - (-b)
a + b * c
(a + b) * c
a * b + c / d
Math.pow(a, b)
Math.pow(b, a)

の結果を出力するプログラム Arithmetic2.java を書け。この結果とプログラム内容を見比べて、それぞれの計算の意味をよく考えよ。 ただし、結果の値だけ表示するのではなく、出力結果が例えば

a + b = 14

となるように演算式も書き出すように書くこと。

関係演算子

2つの値(オペランド)の関係を求める演算子である。 その関係が成り立つ場合は true(真)、成り立たない場合は false(偽)の値を持つ。

演算子意味使い方結果の値
>大きい 10 > 5 true
<小さい 10 < 5 false
>=以上 10 >= 5 true
<=以下 10 <= 5 false
==等しい 10 == 5 false
!=等しくない 10 != 5 true

練習問題3

2つの整数型の変数 a, b をそれぞれ 11 と 3 で初期化し、以下の演算

a > b
a < b
a >= b
a <= b
a == b
a != b

の結果を出力するプログラム Relational.java を書け。この結果とプログラム内容を見比べて、それぞれの計算の意味をよく考えよ。 ただし、結果の値だけ表示するのではなく、出力結果が例えば

a > b = true

となるように演算式も書き出すように書くこと。

論理演算子

論理演算子には以下のものがある。

演算子意味使い方結果の値
&&かつ 10 > 5 && 7 == 3 false
||または 10 > 5 || 7 == 3 true
!〜でない !(10 > 5) false

文字列演算子

文字列演算子には以下のものがある。

演算子意味使い方結果の値
+ 文字列の連結 "th" + "is" "this"

以前説明したように、+ のオペランドの双方が文字列、あるいはどちらかが文字列であれば、 文字列の連結となる。 また、オペランドの双方とも数値あるいは数値型の変数であれば、足し算となる。

代入演算子

変数に値を代入する = も演算子である。

演算子意味使い方結果の値
= 変数 = 式(変数に式の値を代入する) a = 10 10

代入を行った結果も値を持つ(上記の a=10 の場合は 10という値を持つ)。そしてそれをさらに代入したりできる。例えば、 c = b = a = 10; はJavaの正しい演算である。これは、まず a = 10 を行い、その結果の値が10となるため、次に b = 10 を行う。その結果も 10 となるため、最後に c = 10 を行う。

インクリメント演算子、デクリメント演算子

変数の値を1増やすインクリメント演算子(++)と1減らすデクリメント演算子(--)がある。

例えば、整数型の変数aの値が20の時、a++ とすると aの値は21になる。また、aの値が20の時、 a-- とするとaの値は19になる。

さらに、++a --a という風に演算子を変数名の前に書く書き方もある。a++と++aの違いは、演算した結果の値を何かに使う時に出てくる。例えば、以下のように代入する場合である。

int a, b;
a = 50;
b = a++; // aの値をbに代入してから、aの値を1増やす
System.out.println("a = " + a + ",b = " + b);
a = 50;
b = ++a; // aの値を1増やしてから、bに代入する
System.out.println("a = " + a + ",b = " + b);

このように、++aとa++では、aを1増やすタイミングが異なる。 プログラムが分かりづらくなるので、インクリメント(デクリメント)演算子と代入演算子は、できるだけ一緒に使わないほうが良い。

練習問題4

参考:教科書 pp.82-84

次のように最初に変数 a に3を代入して

int a;
a = 3;
b = a++;
c = ++a;

および

a = 3;
b = ++a;
c = a++;

とした後で、変数 a, b, c の内容を出力するプログラム Increment.java を書き、実行してみよ。

複合代入演算子

代入と一緒に他の演算を行える演算子である。

演算子意味使い方説明
+= 加算 a += 10 a = a + 10 と同じ
-= 減算 a -= 10 a = a - 10 と同じ
*= 乗算 a *= 10 a = a * 10 と同じ
/= 商算 a /= 10 a = a / 10 と同じ
%= 余り a %= 10 a = a % 10 と同じ

演算子の優先順位

10+20*3 は、20*3を行ってから10に足される。このように演算子には優先順位があり、 優先順位が高い演算子が先に計算され、その後に低い演算子が計算される。 Javaの演算子の優先順位は以下のとおりである。
順位演算子
( ) [ ] . ++ --
+ - ~ !
new キャスト
* / %
+ -
<< >> >>>
< > >= <= instanceof
== !=
&
^
|
||
&&
? :
= += -= *= /= %= などの複合代入演算子

例えば、 a = b + c * d; は * が一番優先順位が高いので、まず c*d が行われ、次に b+(c*d)の足し算が行われ、最後に一番優先順位が低い =、つまり変数aへの代入が行われる。優先順位を自分で指定したい場合には、( ) を使えば良い。例えば、 a = (b + c) * d; とすれば、一番最初に b + c が行われる。

演算子の結合規則

優先順位が同じ演算子が並んでいた場合、どういう順番で演算が行われるかが決まっている。 これを結合規則という。

多くの演算子は、このような場合、左側にあるものから計算される。これを左結合という。 例えば、a + b + c は、先にaとb が足され、それからcと足される。つまり、(a + b) + c である。

ただし、代入演算子は右結合である。つまり、右側にあるものから計算される。 例えば、a = b = c; は、b = c; a = b; と同じと言える。つまり、先に cの値がbに代入されてから、aに代入される。つまり、a = (b = c)といえる。