KEN's .NET

[初心5] 演算子 〜 +や-の仲間 〜

ホーム > KEN's .NET > [初心5] 演算子 〜 +や-の仲間 〜

ここではプログラミングがはじめての人のための解説をおこないます。 今までほとんど説明せずに使っていた演算子ですが、今後の解説のとき、一つ一つ説明していくのは大変なので、 ここらである程度まとめて、演算子について説明します。

0.演算子とは?

演算子とは、例えば、+や-です。 以下のようなコードがあるとき、演算子+は、変数iの値に3を加算します。 そして、演算子=でその結果を再びiに代入します。 +のよう算術に用いられる演算子を算術演算子、=のように代入に用いられる演算子を代入演算子といいます。 他にもいくつか演算子の種類があります。次で演算子を紹介します。

    Dim i As Integer
    i = i + 3
   図1 演算子の使用例

1.さまざまな演算子

下記の表に主要な演算子とその使用方法を載せました。
種類演算子内容説明
代入演算子=代入 a = 3 のように右辺の値を左辺の変数に代入する。
算術演算子+加算a = b + 2 のように足し算をする。
-減算a = b - 2 のように引き算をする。
*乗算a = 4 * 2 のように掛け算をする。
/除算Dim d As Double
d = 3 / 2
のように割り算をする。dは1.5になる。
\整数除算Dim i As Integer
i = 10 \ 3
のようにして、割り算した結果の商を求める。iは3になる。
Mod剰余算Dim i As Integer
i = 10 Mod 3
のようにして、割り算した結果の余りを求める。iは1になる。
^べき乗a = 2^4 のようにべき乗を計算する。aは2の4乗で16になる。
文字列連結演算子&または+文字列連結Dim s As String = "私は"
s = s & "男です。"
のようにして文字列同士をつなぐ。sは"私は男です。"となる。
&の代わりに+でも同じ。(細かい違いはヘルプ参照)
比較演算子=等号If a = b Then でaとbが等しいなら、という意味になる。
<>不等号If a <> b Then でaとbが等しくないなら、という意味になる。
>、<、>=、<=大小比較等号、不等号と同様にIf文等で大なり、小なり、大なりイコール、小なりイコールの意味になる。
LikeパターンマッチングDim s As String = "abcd"
If s Like "ab*" Thenという場合、このIf文は成り立つ。
文字列が部分的に一致するなど曖昧な比較をする。詳細はヘルプのLike演算子参照。
論理演算子Not否定Dim b As Boolean = False
b = Not b
でbはTrueになる。
If Not [条件式] Thenのようにすることで条件式が成り立たないとき、という条件を書ける。
And、AndAlso論理積If [条件式1] And [条件式2] Then で[条件式1]、かつ、[条件式2]なら、という意味になる。
Andの部分にはAndAlsoにすることもできる。AndとAndAlsoの違いは後述。
Or、OrElse論理和If [条件式1] Or [条件式2] Then で[条件式1]、または、[条件式2]なら、という意味になる。
Orの部分にはOrElseにすることもできる。OrとOrElseの違いは後述。
Xor排他的論理和Boolean型の変数a,bがあるとき、a Xor bの結果は以下の表のようになる。
aba Xor b
TrueTrueFalse
TrueFalseTrue
FalseTrueTrue
FalseFalseFalse
   表1 さまざまな演算子

表1に掲載した以外にももう少し演算子がありますが(※1)、他の演算子についてはまた実際に必要な場面が出てきたときに解説します。 また、図1に挙げた例のコードは、以下のように書くこともできます。
    Dim i As Integer
    i +=  3
   図2 算術演算子、文字列連結演算子を使った代入文の省略記法

これはある左辺の変数に何らかの演算を行って、再びその変数に結果を代入する場合に利用できる省略記法です。 Mod以外の算術演算子と文字列結合演算子でこの書き方ができます。ぜひ覚えておきましょう。

2.優先順位と丸括弧

演算には優先順位があり、演算子によって決まっています。 算数か数学でも習いますが、例えば、掛け算は足し算より優先されます。 なので、10 + 2 * 3は16になります。足し算を先に行いたい場合は、(10+2) * 3のようにすると計算の順番を変更できます。 また、複数の条件を含むIf文では、And(Also)やOr(Else)を使いますが、例えば以下のような行があったとしましょう。
    If a > 10 And a < 100 Or a > 120 And a < 200 Then
   図3 括弧を使わないIf文

演算子の優先順位としては、<や>、And、Orの順となりますので、 条件が成立するのは、aが11〜99のとき、または、aが121〜199のとき、となります。 こういう条件文はややこしいので、括弧をつけて以下のようにするとよいでしょう。

    If (a > 10 And a < 100) Or (a > 120 And a < 200) Then
   図4 括弧を使ったIf文

演算子の優先順位を気にするぐらいならばんばん括弧を使いましょう!

3.AndとAndAlso、OrとOrElseの違い

これらは主に(※2)条件式で使用します。例えば、aをbで割った値が10より大きいときにxxxをするというようにしたい場合、 以下の図5のように書きたいところですが、bが0の場合、0で割ることはできないのでエラーが発生します。

    If a / b > 10 Then
        'xxx
    End If
   図5 問題のあるIf文

さて、この問題を解決するには、bが0でないときだけ、a / b > 10を調べるようにすればいいですね。 この条件をプログラミングを意識した言葉で書くと、「bが0でない、かつ、a / b > 10ならば」と書けますが、この場合、Andは使えません。

    If (b <> 0) And (a / b > 10) Then
        'xxx
    End If
   図6 依然、問題のあるIf文

Andを使うと図6のような内容になりますが、この書き方の場合、(b <> 0)を検査して、bが0だった場合も、 次の条件式(a / b > 10)の検査に移ってしまい、エラーになります。 これを回避するには、図7のようにAパターン、Bパターンの2パターンあります。 Aパターンのような形を「入れ子」といいますが、この方法であれば、外のIf文を実行し成立したときのみ、中のIf文が実行されます。 Bパターンでは、図6のIf文の形のままAndをAndAlsoに変えただけですが、こちらは最初の条件が成立しなかった時点で、残りの条件も判断しません。 これによりbが0だったときも、後半の式(a / b > 10)は実行されないのでエラーになりません。これがAndとAndAlsoの違いです。OrとOrElseの場合も同様です。 余談ですが、このような評価の方法を短絡評価(ショートサーキット)といいます。

Aパターン
    If (b <> 0) Then
        If(a / b > 10) Then
            'xxx
        End If
    End If

Bパターン
    If (b <> 0) AndAlso (a / b > 10) Then
        'xxx
    End If
   図7 問題を解消したIf文

2.学んだこと

キーワード:演算子、丸括弧と優先順位、入れ子、短絡評価、\、^、Mod、Xor
  • 演算子には代入演算子、算術演算子、文字列連結演算子、比較演算子、論理演算子などがある。
  • 演算子には計算の順番を決める優先順位がある。
  • 演算の優先順位は丸括弧で制御できる。
  • And、Orはすべての条件を検査するが、AndAlso、OrElseは条件式が成立する/しないがわかるまで検査し、結果がわかればその時点で検査を終了する(短絡評価)。


(注釈)
※1 今回挙げていないものには、Is、TypeOf 〜 Is、AddressOf、GetTypeがあります。気になる方はヘルプをご覧下さい。
※2 AndAlso、OrElse以外の論理演算子はビット演算にも利用します。今回はビット演算については解説しません。

ホーム > KEN's .NET > [初心5] 演算子 〜 +や-の仲間 〜

[e-mail]yone_ken00@hotmail.com