演算子って何?
変数というものがなんとなく分かったら、次は演算子を使ってみましょう。使ってみましょうと言っても、実は前回の「変数って何?」の中でもう既に使ってました。変数を初期化する際に使った「=」がそれです。
演算子とオペランド
「=」は「左辺に右辺を代入する」という働きの演算子なんです。演算子には「=」だけじゃなく、「+」や「-」などもあります。これらに共通する言い方として、演算子の左右にある変数や値のことをオペランドと言います。なので「=」の働きは「左オペランドの変数に右オペランドの値を代入する」と言いかえられます。
age左オペランド=演算子35右オペランド50左オペランド+演算子35右オペランド算術演算子と評価
演算子の中でも計算をする為の演算子を算術演算子と言います。
「+」「-」「*」「/」の四則演算は誰でも分かると思いますが、プログラミングが初めてという人は「%」という演算子は知らないと思います。「%」というのは、左オペランドを右オペランドで割った余りを算出する演算子です。例をあげると、
9 % 2 → 1ってことです。慣れない人はちょっと変な感じですよね。
今、さりげなく「→」こんな記号を使いました。これはJavaの演算子ではなく、説明のための矢印です。その記号の意味するところが実は重要なんです。今、「9 % 2」が「1」に置き換わるという意味で「 → 」この記号を使いました。他にも例を挙げると、
3 + 5 → 84 * 6 → 2418 / 2 → 9左オペランド 演算子 右オペランド → 演算子によって算出された値「左オペランド 演算子 右オペランド」の形が、「演算子によって算出された値」に置き換わっています。実は演算子の働きというのはまさにこれなんです。ここで見ている算術演算子の式は、その左右にあるオペランドごと、その演算結果の値に置き換わると考えられるんです。そして、このように式の値を求めることを評価すると言います。ソースコードの文字が実際に書き換わるわけではなく、式を読むときの考え方です。
評価する?
例えば、こんな場合、
3 + 5 * 2算数でも習いましたが「*」と「/」は「+」と「-」よりも優先されます。それはプログラミングでも同じです(ちなみに「%」も優先されます)。なのでまず先に「5 * 2」が評価されます。それから「3 + 10」が評価されるという段取りです。
- 3 + 5 * 25 * 2 を評価
- 3 + 103 + 10 を評価
- 13
で、最終的に「3 + 5 * 2」という式は「13」に置き換わるわけです。
そんなの当たり前じゃないか。と思った方も居ると思います。けど、この評価する(置き換わる)という感覚はプログラミングをする上で非常に重要です。小学生でもできるただの計算問題だとバカにせずに、この「評価する」という感覚をぜひ身につけて下さい。
代入演算子
先ほども出てきましたが変数に値を代入する際に使っていた「=」は、代入演算子と言います。そのままですよね、代入する為の演算子ですから。
算術演算子と大きく違うところは、代入するんですから、左オペランドは変数じゃないと駄目です。「3」に「10」を代入しても何の意味もないし意味分からないですよね。代入演算子には「=」以外にもいくつかあります。
例えば「+=」、これは算数では見たことないですよね?けど大丈夫です。簡単です。前回の「変数って何?」で出てきた式、
Main.java
age = age + 1これを短縮した形が、
Main.java
age += 1になるだけです。つまり、左オペランドに右オペランドを「+」した値を左オペランドに代入する。ということです。言葉にするとなんか難しいですが、慣れると簡単です。「-=」も「*=」も「/=」も「%=」同じです。
ただ、さすがに「/=」や「%=」はちょっとややこしいので、あんまり使うことないんじゃないかな?自分で読んでややこしかったら、無理に縮めることないので分かりやすいように書いたらいいと思います。
演算子の優先順位
演算子には優先順位というのがあります。「+」より「*」を先に評価するというのも優先順位で決められていることです。例えば、
Main.java
age = 35 + 2 * 3こんな場合は、評価の優先順位は①「*」②「+」③「=」の順になります。これは難しく考えなくても感覚的に分かると思いますが、この式では「=」の出番は一番最後です。
- age = 35 + 2 * 3① * を評価
- age = 35 + 6② + を評価
- age = 41③ = を評価すると、どんな値になる?
- ?
図の最後に「?」がありますよね。ここでは、いったん立ち止まって考えてみてください。何が言いたかったかと言うと、代入演算子も評価されるってことです。つまり値が置き換わるんです。「2 * 3」が「6」に置き換わるのはイメージできますが、「age = 41」は評価されると一体、何に置き換わるのでしょう?それは代入された値です。つまりここでは「41」になります。
代入演算子の場合、この例では何かに置き換わったところで演算の一番最後なのであまり意識しなくていいのですが、こんな場合もあります。
Main.java
int myAge;
int yourAge;
myAge = yourAge = 35;私とあなたの年齢に35を代入しました。この場合どうなるかと言うと、
- myAge = yourAge = 35yourAgeに35を代入。式の値も35になる
- myAge = 35myAgeに35を代入。式の値も35になる
- 35
先に右側の代入演算子「=」が評価(もちろん代入も)されて、35に置き換わります。それから左側の「=」が評価されます。最後に得られる35という値は、この文では使わないので、ここでは意識しなくても大丈夫です。
このように「=」が二つ並んでいる場合、右側のものから先に評価されます。代入演算子は右側からまとまるという法則があるからです。「+」や「-」演算子は同じ優先度のものが並んでいる場合、算数と同じで左側からまとまります。このまとまり方を「結合規則」といいます。
難しく考えないように!
演算子自体の優先度と、同じ優先度の演算子が並んでいる場合の左右のまとまり方があるので言葉にするとちょっと複雑なようですが、案外そのまんまです。小学生でも分かることです。
比較演算子
age > 30「>」は比較演算子の一つです。これは安心して下さい。算数の「大なり」のことです。
ただし、これも評価される(置き換わる)ということを意識する必要があります。置き換わると言っても「5 + 3」が「8」に置き換わるのは分かりますが、「5 > 3」は一体、何に置き換わるんでしょうか?それは「true」です。基本データ型変数の一つ、boolean型の「true(真)」と「false(偽)」の「true」です。
ちなみに「5 < 3」が評価されると、「false」に置き換わります。比較演算子とは右オペランドと左オペランドを比較した結果、trueかfalseを返す(に置き換わる)演算子です。
大なりイコール「>=」、小なりイコール「<=」もあります。意味は言うまでもないですが、「以上」と「以下」です。算数では「>」と「=」を縦に並べて書きますが、プログラミングでは横に並べて書きます。「=」が右側ですので覚えておきましょう。
あと、大事なのが左右のオペランドが等しい時に「true」を返すイコール「=」です。けど「=」はさっき出てきましたよね?代入演算子として。左のオペランドに右のオペランドを代入するというやつです。なので、「3 = 3」は「true」にはならず、左側が変数ではないのでエラーになります。比較演算子のイコールは「==」です。そのままですが以下のように評価されます。
「3 == 3」 → 「true」
「5 == 3」 → 「false」
「age == 35」 → ageが35なら「true」、35以外なら「false」もう一つ、イコールの反対、ノットイコールを意味する「!=」です。以下のように評価されます。「==」の反対です。
「3 != 3」 → 「false」
「5 != 3」 → 「true」
「age != 35」 → ageが35なら「false」、35以外なら「true」インクリメント・デクリメント
これはちょっと変わった演算子です。インクリメントというのは「+」を二つつなげて書くやつです。
Main.java
age++一つの文として使うなら、たったこれだけで、
Main.java
age = age + 1と同じことになります。つまり、その変数に1足したい時に使います。デクリメントというのはそれの「--」バージョンで1減らしたい時に使います。ただし「age++」「++age」という風にこの演算子を変数の前につけるか後ろにつけるかで微妙に結果が変わってきます。式の値として、増やす(減らす)前の値を使うか、後の値を使うかの違いなのですが、まあ、おいおい覚えていってください。
代表的な論理演算子は、「&&」と「||」と「!」の3つです。とりあえず初めはこの3つを覚えてたらいいと思います。ちなみにこの縦線「|」は、日本語配列のキーボードでは、一般に¥マークのついたキーをShiftキーを押しながら押すと出ます(こんな基本的なこと教えてくれるのは当サイトならではw)。
論理演算子は非常によく使うので大事です。けど、あえて簡単に考えた方がいいです。
「&&」は、「かつ」
「||」は、「または」
「!」は、否定
これだけです。基本的には「かつ」と「または」を文章で理解できれば使いこなせるとは思うのですが、一応どういう仕組みで評価されているかも理解している方がいいのでちょっとややこしいですが説明します。
「&&」は論理積と言って「a && b」の場合、a、b両方がtrueの場合にのみtrueになります。逆に言えばどちらか一方でもfalseであればfalseになります。
「||」は論理和と言って「a || b」の場合、a、bどちらか一方でも(もちろん両方でも)trueであればtrueになります。 両方ともfalseの場合のみfalseになります。
表にすると返って難しく考えてしまうのでどうかと思うのですが、一応、表にしておきます。
| a | b | a && b かつ | a || b または |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 1 | 0 | 0 | 1 |
| 0 | 1 | 0 | 1 |
| 1 | 1 | 1 | 1 |
具体例の方が分かりやすいと思うので、どういう順番で評価されるかに注目して以下の例を見てください。
「myAge」も「yourAge」も35だとします。
- (myAge == 35) && (yourAge < 35)左の比較はtrue、右の比較はfalseになる
- true && falsetrue かつ false を評価
- false
ちなみに( )は見やすいように付けただけで、なくても優先順位は変わらず、この式では「&&」よりも比較演算子が優先されます。まあ、見やすいに越したことはないのでつけてる方がいいです。
myAgeもyourAgeも35であるなら
「(myAge == 35) かつ (yourAge < 35)」がfalseになるのは感覚で分かりますよね?論理演算子に関してはとにかく簡単に考えた方が分かりやすいです。 「!」は決してびっくりするとかじゃなく、否定の意味があります。これはちょっと形的に特殊な演算子で、オペランドで挟む形にしてはいけません。
! (age == 35)このように「!」に接するのは右オペランドのみです。「!」は右オペランドのtrueかfalseを反転させる演算子です。この例では、比較した結果を反転させるために( )でくくる必要があります。評価の順番はこうなります。↓
- ! (age == 35)age == 35 を評価
- ! true! でtrueとfalseを反転
- false
ちなみに、
! (age == 35)と
(age != 35)は全く同じです。両方とも評価されると、ageが35なら「false」、35以外なら「true」になります。
自分で感覚的に分かりやすい書き方をしたらいいと思います。
以上で、演算子の解説を終わります。他にもあるのですが、まずはここで紹介したものから慣れていけばいいと思いますので、いろいろやってみて下さい。
演算子の優先順位に関しては細かい規定があるのですが、プログラミングも算数と同じで( )をつければ優先させることができるので、できるだけ読みやすい式にするように心がけていれば、細かい決まりを全部覚えなくても感覚でなんとかなります。
資格試験を受けるような人は、やらしい問題が結構出ると思うので覚える必要がありますが、そんな問題に出るような読みにくいプログラムは書かないようにしましょう。バグの元です。
長々とご苦労様でした。
次は、演算子をいっぱい使ってif文に挑戦です!
質問・コメント
読み込み中この記事についての質問や、学習して気づいたことをお寄せください。
この記事のコメント
旧サイトに寄せられたコメントも当時の投稿内容のまま掲載しています。現在の記事では変更している内容や、旧環境についてのやり取りも含まれます。
コメントを読み込んでいます。