2019/02/06
sponsored link
演算子とオペランド
変数というものがなんとなく分かったら、次は演算子を使ってみましょう。使ってみましょうと言っても、実は前回の「変数って何?」の中でもう既に使ってました。変数を初期化する際に使った「=」がそれです。
「=」は「左辺に右辺を代入する」という働きの演算子なんです。ただしプログラミングの用語では左辺、右辺という言い方はしません。というのも左辺、右辺という言い方は「=」を挟んでいるからこそそう言えますが、演算子には「=」だけじゃなく、「+」や「-」などもあります。「+」の左にあるのを左辺、右にあるのを右辺なんて言わないですよね?そこでプログラミングの用語では、演算子の左右にある変数や値のことをオペランドと言います。なので「=」の働きは「左オペランドに右オペランドを代入する」と言いかえられます。
算術演算子と評価
演算子の中でも計算をする為の演算子を算術演算子と言います。
「+」「-」「*」「/」の四則演算は誰でも分かると思いますが、プログラミングが初めてという人は「%」という演算子は知らないと思います。「%」というのは、左オペランドを右オペランドで割った余りを算出する演算子です。例をあげると、
9 % 2 >>>>> 1
ってことです。慣れない人はちょっと変な感じですよね。
今、さりげなく「>>>>>」こんな記号を使いました。いや記号自体には意味はないんです。その記号の意味するところが実は重要なんです。今、「9 % 2」が「1」に置き換わるという意味で「>>>>>」この記号を使いました。他にも例を挙げると、
3 + 5 >>>>> 8
4 * 6 >>>>> 24
18 / 2 >>>>> 9
左オペランド 演算子 右オペランド >>>>> 演算子によって算出された値
「左オペランド 演算子 右オペランド」の形が、「演算子によって算出された値」に置き換わっています。実は演算子の働きというのはまさにこれなんです。演算子はその左右にあるオペランドごと、その演算結果の値に置き換わるんです。そして、この算出された値に置き換わることを評価すると言います。
評価する?
例えば、こんな場合、
3 + 5 * 2
算数でも習いましたが「*」と「/」は「+」と「-」よりも優先されます。それはプログラミングでも同じです(ちなみに「%」も優先されます)。なのでまず先に「5 * 2」が評価されます。それから「3 + 10」が評価されるという段取りです。
で、最終的に「3 + 5 * 2」という式は「13」に置き換わるわけです。
そんなの当たり前じゃないか。と思った方も居ると思います。けど、この評価する(置き換わる)という感覚はプログラミングをする上で非常に重要です。小学生でもできるただの計算問題だとバカにせずに、この「評価する」という感覚をぜひ身につけて下さい。
代入演算子
先ほども出てきましたが変数に値を代入する際に使っていた「=」は、代入演算子と言います。そのままですよね、代入する為の演算子ですから。
算術演算子と大きく違うところは、代入するんですから、左オペランドは変数じゃないと駄目です。「3」に「10」を代入しても何の意味もないし意味分からないですよね。代入演算子には「=」以外にもいくつかあります。
例えば「+=」、これは算数では見たことないですよね?けど大丈夫です。簡単です。前回の「変数って何?」で出てきた式、
age = age + 1
これを短縮した形が、
age += 1
になるだけです。つまり、左オペランドに右オペランドを「+」した値を左オペランドに代入する。ということです。言葉にするとなんか難しいですが、慣れると簡単です。「-=」も「*=」も「/=」も「%=」同じです。
ただ、さすがに「/=」や「%=」はちょっとややこしいので、あんまり使うことないんじゃないかな?自分で読んでややこしかったら、無理に縮めることないので分かりやすいように書いたらいいと思います。
演算子の優先順位
演算子には優先順位というのがあります。「+」より「*」を先に評価するというのも優先順位で決められていることです。例えば、
age = 35 + 2 * 3
こんな場合は、評価の優先順位は①「*」②「+」③「=」の順になります。これは難しく考えなくても感覚的に分かると思いますが、「=」などの代入演算子の出番は一番最後です。
一番下の矢印が途切れてますよね。これは僕がミスったからではありません。あえてです。何が言いたかったかと言うと、代入演算子も評価されるってことです。つまり値が置き換わるんです。「2 * 3」が「6」に置き換わるのはイメージできますが、「age = 41」は評価されると一体、何に置き換わるのでしょう?それは代入された値です。つまりここでは「41」になります。
代入演算子の場合、何かに置き換わったところで演算の一番最後なのであまり意識しなくていいのですが、こんな場合もあります。
int myAge; int yourAge; myAge = yourAge = 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」
インクリメント・デクリメント
これはちょっと変わった演算子です。インクリメントというのは「+」を二つつなげて書くやつです。
age++
たったこれだけで、
age = age + 1
と同じことになります。つまり、その変数に1増やしたい時に使います。デクリメントというのはそれの「–」バージョンで1減らしたい時に使います。ただし「age++」「++age」という風にこの演算子を変数の前につけるか後ろにつけるかで微妙に結果が変わってきます。1増やす(減らす)処理をその変数の値を使う前にするか後にするかの違いなのですが、まあ、おいおい覚えていってください。。
大丈夫、わざわざインクリ・デクリのややこしい使い方しなくてもプログラミングは出来ます。ただし、oracleの試験受けたらインクリ・デクリ関連のいやらしい問題がわんさか出ますので、試験受ける人は必須です。頑張って。
論理演算子
代表的な論理演算子は、「&&」と「||」と「!」の3つです。とりあえず初めはこの3つを覚えてたらいいと思います。ちなみにこの縦線「|」は、キーボードの一番右上の¥マークのついたボタンをシフト押しながら押すと出ます(こんな基本的なこと教えてくれるのは当サイトならではw)。
論理演算子は非常によく使うので大事です。けど、あえて簡単に考えた方がいいです。
「&&」は、「かつ」 「||」は、「または」 「!」は、否定
これだけです。基本的には「かつ」と「または」を文章で理解できれば使いこなせるとは思うのですが、一応どういう仕組みで評価されているかも理解している方がいいのでちょっとややこしいですが説明します。
「&&」は論理積と言って「a && b」の場合、a、b両方がtrueの場合にのみtrueになります。逆に言えばどちらか一方でもfalseであればfalseになります。
「||」は論理和と言って「a || b」の場合、a、bどちらか一方でも(もちろん両方でも)trueであればtrueになります。 両方ともfalseの場合のみfalseになります。
表にすると返って難しく考えてしまうのでどうかと思うのですが、一応、表にしておきます。
a | b | && | || | |
---|---|---|---|---|
0 | 0 | » | 0 | 0 |
1 | 0 | » | 0 | 1 |
0 | 1 | » | 0 | 1 |
1 | 1 | » | 1 | 1 |
具体例の方が分かりやすいと思うので、どういう順番で評価されるかに注目して以下の例を見てください。
「myAge」も「yourAge」も35だとします。
ちなみに( )は見やすいように付けただけで、なくても優先順位は変わらす、論理演算子よりも比較演算子が優先されます。まあ、見やすいに越したことはないのでつけてる方がいいです。
「myaAge == yourAge == 35」であるなら
「(myAge == 35) かつ (yourAge < 35)」がfalseになるのは感覚で分かりますよね?論理演算子に関してはとにかく簡単に考えた方が分かりやすいです。
「!」は決してびっくりするとかじゃなく、否定の意味があります。これはちょっと形的に特殊な演算子で、オペランドで挟む形にしてはいけません。
! (age == 35)
このように「!」に接するのは右オペランドのみです。「!」は右オペランドのtrueかfalseを反転させる演算子です。これは分かりやすいように( )でくくった方が絶対いいです。評価の順番はこうなります。↓
ちなみに、
! (age == 35)
と
(age != 35)
は全く同じです。両方とも評価されると、ageが35なら「false」、35以外なら「true」になります。
自分で感覚的に分かりやすい書き方をしたらいいと思います。
以上で、演算子の解説を終わります。他にもあるのですが、とりあえずこれだけ理解していればプログラミングには困らないと思いますので、いろいろやってみて下さい。
演算子の優先順位に関しては細かい規定があるのですが、プログラミングも算数と同じで( )をつければ優先させることができるので、できるだけ読みやすい式にするように心がけていれば、細かい決まりを全部覚えなくても感覚でなんとかなります。
資格試験を受けるような人は、やらしい問題が結構出ると思うので覚える必要がありますが、そんな問題に出るような読みにくいプログラムは書かないようにしましょう。バグの元です。
長々とご苦労様でした。
次は、演算子をいっぱい使ってif文に挑戦です!
今だけ→転職できなければ全額返金の「エンジニア転職保証コース」
絶対エンジニアになる!→テックエキスパート
フリーランスエンジニアの収入例を見てみる→レバテックフリーランス
コメント
あさやんさん、ご指摘ありがとうございます。
by Nobuo@管理人 2015/11/15 22:00
とても分かりやすくて重宝しています!
このサイトに出会いJavaが少し苦でなくなりました。
ありがとうございます。
これからも宜しくお願い致します!
by りんご 2015/11/24 20:58
ガチでどのサイトよりもわかりやすいです。
感謝感謝。
by ガチ勢 2017/09/03 07:25
>ガチ勢さん
そう言ってもらえるとガチで嬉しいです。笑
ありがとうございます。
by Nobuo@管理人 2017/09/03 09:02
Class名は VariableTest のままで「&&」と「||」と「!」の3つの演算子は使えますか?
普通にわからなく質問しました。
int age = 5;
System.out.print(((age == 5) || (newage==5)));
by ahigi 2017/10/26 07:29