Headline About TechLog Download Java VBA Link


January 16, 2008. Wednesday.

演算子

演算子とは、変数などを関係付け、式を作るためのものです.....などというと、難しそうですが、算数における+、÷、=や「または」「かつ」などに当るものです。無しでプログラムを作るのは不可能に近いため、触った事のない人はいないかと思いますが、ざっと説明をして、注意点などをあげて行きたいと思います。




代入演算子

値を代入するのに使います。


表1. 代入演算子一覧.
演算子用途
=値を代入するy = x + 1
myWindow.width = 100

「一覧と言いながら1つしかないじゃん」と突っ込まれそうですが、長さ0の配列もありますから、プログラマ&理系の人はなんとも思わないかと(笑)。代入演算子などと格好をつけていますが、ようは「イコール」です。数学のそれとは違い※1、左右を比較する意味ではなく、「右辺値を左辺に代入する」意味で用います。まぁ、これまでの記事を読み進んできた人ならおなじみですね。

※1 厳密に言えば、数学においても、左右の等価性を比較することで、両者が置換可能である事から、「代入」という概念でも用いますけどね。プログラム上の代入の場合、等価でないものも代入できるというか、代入することで等価となるというか...。分かりにくいので初心者は無視してください。って、だったら書くなよとかいわないで。




算術演算子

数値の計算を行なう際に用います。


表2. 算術演算子一覧.
演算子用途
^数値のべき乗を求めるareaOfCircle = 3.14 * 5^2
*数値の積を求めるareaOfSqure = base * height
/数値の除算結果を浮動小数点で求めるareaOfTriangle = base * height / 2
\数値の商を求めるteamNo = totalNumber \ memberPerTeam
Mod数値の剰余をもとめるbenchwarmer = totalNumber Mod memberPerTeam
+数値の和を求めるtotal = 100 + 200
-数値の差を求めるrest = 10000 - 4980

算術演算子とは算数のときに使う記号と同じです。気をつけなければいけないのは、「/」、「\」、「Mod」ぐらいでしょうか。演算子の評価には優先順位があり、例えば、answer = 5 * 2 - 2 * 3と書いた場合、乗算記号が優先され、結果としてanswerには4が格納されます。優先順位は数学で用いるものとほぼ同じと考えてよいでしょう。通常の情報系のページなら、ここで優先順位を一覧にするのですが、baristaはあえてやりません。理由は後ほど説明いたします。




連結演算子

文字列の連結を行なう際に用います。


表3. 連結演算子一覧.
演算子用途
+文字列の連結を行なうsentence = "こん" + "にちわ"
sentence = messageA + messageB
&文字列の連結を行なうsentence = "こん" & "にちわ"
sentence = messageA & messageB

上記の例のように左右の文字列を連結した結果を返します。ただし、「+」の利用には注意が必要です。「+」は算術演算子として用いられるため、左右が両方とも文字列でないと、連結演算子とみなされません。算術演算子として足し算を行なおうとし、一方が数値で無かった場合にはエラーとなります。以下に凡例を示します。

Dim a As String
Dim b As String
Dim c As String
Dim d As Integer
Dim answer As Variant
a = "1"
b = "2"
c = "あ"
d = 2

answer = a + b '結果は文字列"12"
answer = a + d '結果は文字列"3"
answer = a + c '結果は文字列"1あ"
answer = c + d '数値に変換できないためエラー
answer = a & d '結果は文字列"12"

と上記のように、「+」による連結では連結結果が予想外のものとなることがあります(理解のうえで使う分には便利ではあるのですが)。という事で、単純な文字列連結の用途では「+」を使うのはやめ、極力「&」を利用するようにしましょう。




比較演算子

左右の変数、定数の比較を行なう際に用います。比較の結果が正しければTrueが、そうでなければFalseが返ります。


表4. 比較演算子一覧.
演算子用途
=左右の値が等しいかどうかIf time = 15 Then
  MsgBox "3時のおやつだ!"
End If
<>左右の値が等しくないかどうかIf inputted <> password Then
  MsgBox "ログインエラー!"
End If
<左辺が小さいかどうかIf money < price Then
  MsgBox "お金が足りないので買えません"
End If
>左辺が大きいかどうかIf bobsHeight > mikesHeight Then
  MsgBox "Bob is taller than Mike!"
End If
<=左辺が右辺以下であるかどうかIf bodyFat < 23 Then
  MsgBox "体脂肪率は正常値です"
End If
>=左辺が右辺以上であるかどうかIf age >= 20 Then
  MsgBox "日本ではお酒が飲めます"
End If
Is左右が同じオブジェクトを参照するかIf a Is b Then
  MsgBox "aとbは同じオブジェクトを参照しています"
End If
Like左の文字列が右のパターンに合致するかIf name Like "田中*" Then
  MsgBox "苗字が田中さんの可能性が高いです"
End If

比較演算子は表のように左右を比較し、結果をTrue、Falseで返します。If文の評価に用いる事が多いでしょう。特に難しい演算子ではありませんが、いくつか注意点があります。


まず、「=」は代入演算子と表記が同じです。そのため、If a = b ThenのようにIf文内で書けば比較演算子ですが、プログラム中で普通にa = bと書くと代入演算子となります。ごちゃごちゃにならないよう、気をつけましょう。※以下初心者は読み飛ばしてください。プログラム中にa = b = cと書くとb = cが比較演算子で、bとcが同じならaにtrueが入るという、非常に分かりにくい動作をします。そういう表記はやめましょう。


次に「Is」は参照するオブジェクトが同じであるかどうかを比較します。例えば、僕が携帯電話705SHを持っていて、貴方も705SHを持っていたときに、両者は同じ商品ですが、別の物体です。この場合、「=」で比較するとTrueかもしれませんが、「Is」で比較するとFalseと評価します。なお、初心者が「Is」を効果的に使う局面は無いので、意味が分からなかった人は「Is」の存在を忘れてください。プログラムに慣れてから再学習しましょう。


最後に「Like」。Likeは文字列のあいまい比較を行なう演算子だと思ってもらえば良いでしょう。例えば、ゲームを探してFFシリーズを探したいなら、If gameTitle Like "FF*" Thenのように記述すれば"FF1"、"FF2" ..... "FF12"などは全てTrueとなります。一方、gameTitleが"DQ1"だったり、"aFF"だったりした場合はFalseとなります。他にも多くの比較方法があるので、パターンの記述方法について以下に列挙します。いろいろ試してみてください。


表5. 比較パターン.
記述意味表記例Trueの例Falseの例
*任意の0文字以上の文字列xxxx Like "田*"田, 田中, 田園地帯中田, 山田
?任意の1文字xxxx Like "田?"田中, 田村田, 田園地帯,中田, 山田
#任意の数字文字列1文字xxxx Like "田#"田1, 田2, 田1(←全角)田, 1, 田中, 田12
[charlist]charlist内の1文字xxxx Like "[bc]at"bat, catbattery, at, dat, boat
[!charlist]charlist以外の1文字xxxx Like "[!bc]at"dat, matdata, bat, cat, goat
[ - ]指定範囲内の1文字xxxx Like "か[あ-そ]し"かいし、かえし、かかしからし、かし、かいごし、かいしご



論理演算子

「かつ」、「もしくは」等の論理演算を行ないます。


表6. 論理演算子一覧.
演算子用途詳細
And論理積A And B と記述した場合、A、BともTrueの時にTrueを返します。
Or論理和A Or B と記述した場合、AかBのどちらか一方でもTrueならTrueを返します。
Not論理否定Not A と記述した場合、AがFalseの場合、Trueを返します。
Xor排他的論理和A Xor B と記述した場合、「AがTrueでBがFalse」か「AがFalseでBがTrue」の場合にTrueを返します。
Imp論理包含演算(Not A) Or B と記述するのと同じです。
Eqv論理等価演算Not(A Xor B)と記述するのと同じです。

ごちゃごちゃと書きましたが、And, Or, Not, Xorの4つだけでプログラムは書けます。多くは最初の3つで書けます。ImpやEqvなんてまず使いません。何故なら最初の3つの組み合わせで表現できるからです。取り合えず最初の3つでプログラムを書いてみて、必要に応じて残りを覚えれば充分です。

算術演算子と同様に論理演算子にも優先順位があります。例えばNotは最も優先度が高く、最初に評価されます。しかし、算術演算子の時と同様、ここでは触れません。他のサイトと同じことをしても意味がありませんから。詳しくは次項を参照下さい。




演算子の評価順について

さて、もったいぶってきましたが、何故演算子の評価順に関する説明しなかったのかの種明かしをしましょう。例えば以下のようなプログラムを見てください。


If 10 * x + 5^3 = 20 Or y / 5 = 10 And printFlg = True Then
  '処理
End If

「さて、処理は行なわれるでしょうか?」と尋ねられた時、あなたは何と答えますか?baristaの答えは「面倒くさいから知らん!」です。何で、こんなどうでも良い事に、記憶力と思考力を使わなければならないのでしょうか。努力する方向が間違っています。


演算子の評価順を制御する最も簡単な方法は、(1)括弧で括る、(2)必要であれば部分式を変数にまとめる、の2つです。上記の式はこのように理解しやすく書き換えることが出来ます。


Dim a As Double
Dim b As Double
a = (10 * x) + (5^3)
b = y / 5

If (a = 20) Or ((b = 10) And (printFlg = True)) Then
  '処理
End If

どうでしょうか?「行をまたいで計算が行われる」と考える人なんて誰もいませんし、誰だって括弧内の式を先に評価するのではないでしょうか。このように書けば、演算子の優先順位なんて覚える必要がありません。

「演算子の評価順なんて常識だろ。読めない方が悪い」と言う人も居ますが、評価順を知っていても、大抵の場合括弧を付けた方が読みやすいのですから、積極的に括弧をつけ、長い式は分割するべきです。例え貴方には簡単でも、自分の後任のプログラマが評価順に詳しくなければ、せっかく作ったプログラムをめちゃくちゃにされてしまうかも知れません。

自分が評価順に詳しいからと、だらだらと式を書く人は、英語に詳しいからと書類を全部英語で書く人と同じです。優秀かも知れませんが、鼻について鬱陶しいだけ。このサイトでは「演算子の評価順を覚えるより、分かりやすい表記を心がける」事をお勧めします。