なんとなくわかるJava入門#4 演算編
こんにちは。
今回は演算編です。今回の目標は「演算子と評価について理解する」です。
演算子
今回は、演算について詳しくお話したいと思います。これまで演算について、とくに説明することなくなんとなくでお話してきましたが、改めて説明したいと思います。
まず細かいハナシは置いておいて、ざっくり説明すると、「a=1+2」のようなものを「式」と呼んで、「=」や「-」のような計算を行う記号のことを「演算子(オペレータ)」と呼びます。そして、計算される対象を「被演算子(オペランド)」と呼びます。
この演算子にはいくつか種類と、それぞれによって構成される式の中で評価される優先順位があります。以降より、この演算子の種類と評価の優先順位について説明をしていきます。
算術演算子
Javaでも四則演算を行うことができます。足し算、引き算、掛け算、割り算はそれぞれ、+、-、*、/で表記します。これらを算術演算子と呼びます。掛け算は*で、割り算は/であることに注意しましょう。また、この演算にはもちろん「()カッコ」も用いることができます。
代入演算子
これまで学習した「=(代入)」も演算子のひとつです。
さらに、「=」と「+、-、*、/」を組み合わせた「複合代入演算子」というものもあります。例えば、「ans += 1;」のように記述します。この計算は「ans = ans + 1;」の省略記法です。つまり「+=」の左側の変数の値に、「+=」の右側の値を足して、再度代入することになります。その他、「-=」「*=」「/=」も同様です。
比較演算子
数値を比較するための演算子として「(数値)比較演算子」があります。「>」「>=」「<」「<=」「==」「!=」の6種類があります。左辺と右辺の項を比較し、その結果からboolean型のtrue or falseを値とします。それぞれ、以下のような意味になります。
比較演算子 | 意味 |
---|---|
> | 左辺の値は、右辺の値より大きいかどうか? |
>= | 左辺の値は、右辺の値以上かどうか? |
< | 左辺の値は、右辺の値より小さいかどうか? |
<= | 左辺の値は、右辺の値以下かどうか? |
== | 左辺の値と右辺の値が等しいかどうか? |
!= | 左辺の値と右辺の値が等しくないかどうか? |
例えば、「2 > 1」は、「2は1より大きいかどうか?」という意味で、これは正しい(真)のでtrueとなります。一方で、「1 > 2」の場合、「1は2より大きいかどうか?」という意味になり、誤り(偽)なのでfalseとなります。
論理演算子
論理積、論理和、否定を実現するための演算子として論理演算子と呼ばれるものがあります。それぞれ、&&(論理積;条件和演算子)、|| (論理和;条件和演算子)、! (否定;否定演算子)のように記述します。
それぞれの演算子の被演算子はboolean型の値でないといけません。
&&(条件和演算子)は二項演算子であり、左辺の条件式と右辺の条件式が両方とも true であれば true として評価されます。例えば、true && true は true と評価されます。
|| (条件和演算子)も二項演算子であり、左辺の条件式と右辺の条件式のいずれかが true であれば true として評価されます。例えば、true || false は左辺が true なので、 || も true と評価します。
! (否定演算子)は単項演算子であり、被演算子はboolean型の値でなければなりません。被演算子がtrue であれば false として評価されます。例えば、! true は、falseとして評価されます。
インクリメント/デクリメント演算子
その他にも「++(インクリメント演算子)」「--(デクリメント演算子)」といった、特殊な計算があります。「++a」は、「a = a+1」の省略記法で、1加算して再度代入するという意味です。ということは「--a」は、「a = a-1」ですね。
評価
評価には、優先順位と結合規則という2つの規則が関わっています。それぞれについて理解できれば演算をマスターすることができます。
優先順位
これらの演算子には評価の優先順位があります。以下の順に評価されます。
優先順位 | 演算子 |
---|---|
1 | ()かっこの中の演算子、インクリメント/デクリメント演算子 |
2 | ! |
3 | *、/、% |
4 | +、- |
5 | >、>=、<、<= |
6 | ==、!= |
7 | && |
8 | || |
9 | =、+=、-=、*=、/=、%= |
同じ優先順位の演算子が並んでいる場合は、代入演算子以外は左にあるものから評価されます。例えば、「5-2-3」は、「-」が二つありますが、左の「5-2」から評価します。代入演算子は右にあるものから評価します。a = b = c = 1; の場合は、c=1から評価されます。
この同じ優先順位の演算子が並んでいる場合に、どちらを優先するのか決めた規則を「結合規則」と呼び、左側から優先されるものを「左結合」と呼びます。右から優先されるものを「右結合」と呼びます。
こまけぇハナシ
その他の演算子
今回紹介した演算子は、全体の一部です。その他にもビット演算子やシフト演算子等があります。
n項演算子
算術演算子などの演算子は、右辺と左辺の2つの項から一つの結果を得ることから、2項演算子と呼びます。
インクリメント/デクリメント演算子は1つの項から結果を得ることから、単項演算子と呼びます。
ちなみに、3項演算子も存在します。「条件式?式1:式2」の形式で記述し、条件が真であれば式1を評価した結果、条件が偽であれば式2を評価した結果を得ます。
(式、項、因子という用語を定義について説明するとさらにややこしくなるので、今回はこの説明は避けます。とりあえず、計算対象とぐらいに置き換えて頂ければ良いです。)
比較演算子と関係演算子
今回、>、>=、<、<=、==、!= のことを比較演算子と呼びましたが、関係演算子と呼ばれることもあります。
厳密にはJavaの仕様書によると、>、>=、<、<=を数値比較演算子と呼び、instanceof と記述する型比較演算子と合わせて、関係演算子と呼ぶようです。また、==、!=のことを等価演算子と呼びます。
今回は、分かりやすさを優先して、すべて比較演算子と呼んでいます。
論理演算子の使われ方
論理演算子の説明でtrue && true であれば true として評価されると説明しましたが、実際の使われ方はもう少し複雑です。
例えば、「 0 <= a && a <= 10」のように使われます。この式は、まず、「0 <= a」「a <= 10」の順に評価されます。もし、変数a に代入されている値が11であれば、「0 <= a」は true 、「a <= 10」は false として評価されます。この評価結果が元の式に適用され、「true && false」となります。きちんと、「&&」の被演算子はboolean型の値になっていますね。そして、「true && false」が評価され、結果としては false になります。つまりこの式は a の値が0以上10以下かどうかを判定しているわけです。
今はまだ実用性にピンとこないと思いますが、これは後日学習する条件分岐で納得いただけると思います。
前置、後置インクリメント、デクリメント
インクリメント/デクリメント演算子は、被演算子の前に記述(例:++a)することと、後ろに記述(例:a--)することができます。それぞれ、前置インクリメント/デクリメント、後置インクリメント/デクリメントと呼ばれます。
++aは、優先順位に従って加算した後の値が式の中で使われますが、a++は、加算する前の値が式の中で使われます。
つまり、
a = 1;
b = ++a + 2;
の場合、
++aによってaに1が加算された後に、2(aの加算後の値)+2が行われます。
一方で、
a = 1;
b = a++ + 2;
の場合、
a++ によってaに1が加算された後に、1(aの加算前の値)+2が行われます。
評価順序は変わりませんが、演算子による振る舞いが変わります。ここら辺は、後に学習するメソッドを理解すると分かりやすいかもしれません。
評価順序も、実は、
1. ()内の演算子、後置演算子
2. 前置演算子
・・・以降は同じ
が正しいです。
単項演算子の実行はややこしく、間違えやすいので、他の演算子と組み合わせて使うことは極力避けると良いでしょう。
Javaの文だとか式だとか
今回学習した演算子や、結合規則や、文だとか式だとか項だとかのハナシは、「JavaのBNF」とか「コンパイラ」とか調べると良く分かると思いますので、ぜひ勉強してみて下さい。
終わりに
といことで、演算編は以上です。基本となる演算子を挙げましたが、これらは暗記しようとするよりも、いくつか演習問題を解いてみる方がすぐに身に付くと思います。評価の優先順位と結合規則については、とりあえずは、「代入以外を左から評価する」とだけ覚えておけば基本は問題なく実装できると思います。次回は型変換編です。
ほんじゃ、また。
励みになるので、良ければ下の☆ボタン、読者になるボタンを押していって下さい。