VB .NET プログラミングリファレンス - 3-4 演算子

3-4-1 VB .NET の演算子

すでに、以下のような加算演算をおこなう計算式をサンプルの中で利用していましたが、ここでは、そのような VB .NET の演算子について説明します。

[例] 変数 X の値と数値 3 の加算

                  Ans = X + 3  '変数 X の値と 3 を加算して、計算結果を変数 Ans に代入

VB .NET には、以下のような演算子があります(表 3-4)。

種類演算子
四則演算など足し算+
引き算-
掛け算*
割り算/
余りMod
累乗^
マイナス化-
文字列連結& または +
代入をともなう演算式=、+=、-=、*=、/=
¥=、^=、&=
ビット演算ビット反転Not
論理和Or
論理積And
排他的論理和Xor
条件式等号=
不等号<>
大小比較<、>、<=、>=
パターンマッチLike
参照比較Is
条件式の論理演算否定Not
またはOr、OrElse
かつAnd、AndAlso
排他的論理輪Xor
その他AddressOf
GetType

表 3-4 VB .NET の演算子

なお、これらの演算子は組み合わせて使うことができます。その場合、演算子には優先順位がありますが、すべての演算子の優先順位を暗記する訳にもいきません。明示的に、丸括弧( )で演算の優先順位を指定することができるので、複数の演算子を使うときは、丸括弧( )を使って明示的に優先順位を指定したほうがよいでしょう。

以下の例では、X+Y を明示的に先に計算するように指定しています。本来の優先順位では、「*」 演算子のほうが 「+」 演算子よりも優先度が高いので、丸括弧( )を記述しなければ、先に Y*100 が計算されます。

[例] 優先順位を指定する(計算結果は変数 Z に格納される)

                  
Z = ( X + Y ) * 100  ' X + Y が先に計算される

前記の表のうち、いくつか特徴的な機能をみていきます。ただし、条件式に関するものは第 4 章 「さまざまな制御構造」、その他の欄の演算子は第 5 章 「クラスの定義と実装」 で扱います。

3-4-2 四則演算の留意点

前表の四則演算の欄にある演算子の使用例を、以下に示します。この例では、どれも計算結果は、「=」 演算子を使った代入文の左辺の変数に格納されます。

[例] 演算子を使った計算式

                   
1: Dim X As Integer = 10, Y As Integer = 37, Z As Integer
 2: Dim F As Double = 10.4, G As Double = 3.11, H As Double
 3: Z = X + Y    '10 + 37
 4: Z = X - Y    '10 - 37
 5: Z = X * Y    '10 × 37
 6: H = F / G    '10.4 ÷ 3.11
 7: Z = Y \ X    '37 ÷ 10 の商
 8: Z = Y Mod X  '37 ÷ 10 の余り
 9: H = X ^ 3    '10 の 3 乗
10: Z = -X       '変数の値の符号を反対にする -10

演算対象にできるデータは、計算することが意味のあるデータ、つまり整数型(Byte、Short、Integer、Long)、浮動小数点型(Single、Double)、および Decimal 型などです。逆にいえば、「1+"abc"」 では加算として意味をなしません(ただし、"abc"+"d" は文字列連結という別の機能があります。文字列連結は次項で扱います)。

原則として計算結果は、もとの計算対象項目と同じデータ型で算出されるか、またサイズが異なる複数のデータ型を 1 つの計算式で使っていた場合は、最もサイズが大きいデータ型で算出されます。

ただし、6 行目の割り算(/)では、仮に整数型同士の割り算をしても、小数点以下を求めることができ、計算結果は Double 型で取得されます。

一方、7 行目の商を求める 「\」 演算子では、計算する前に整数型データに変換され、計算結果も整数になります。もし、Option Strict がオンの場合、浮動小数点型を 「\」 演算子で使用すると、コンパイルエラーになります。つまり、厳密にいうと、7 行目の商を求める計算では、整数型データが 「\」 演算子の対象となります(Options Strictについては、 3-1-5 「Dim 文によるさまざまな変数の宣言」の 「参考」 欄を参照)。

9 行目の累乗計算では、計算項目は Double 型に変換されてから累乗計算され、結果も Double 型で取得されます。

10 行目のマイナスを表す演算子は、その変数の値の符号を反対にする機能があります。もし、変数の値がはじめから負ならば、結果は正になります。

このように、マイナス記号は 「-3」 や 「-10.4」 のようにリテラルにつけられるだけでなく、変数や計算式にもつけることができます。以下のような使い方もできます。

[例] X+3 の計算結果の符号を反対にする

                  
Z = -(X + 3)

3-4-3 文字列の連結

「+」 演算子には、数値の加算だけでなく、文字列を連結する機能もあります。もし、「+」 演算子の前後両方の演算項目が String 型ならば、文字列の連結として作用します。

[例] 変数 S の "ABC" とリテラル "DEF" の連結

                  
1: Dim S As String = "ABC", T As String
2: T = S + "DEF"

前記の例では、"ABC" と "DEF" が連結して "ABCDEF" という文字列になり、変数 T に代入されます(厳密にいえば、String 型の変数 T は参照型なので、文字列データ "ABCDEF" の参照情報が変数 T に格納されます。詳しくは、3-2-3 「参照型とは?」 を参照)。

文字列連結には、もう 1 つ 「&」 演算子を使うこともできます。以下のように記述しても同じ意味です。

[例] 変数 S の "ABC" とリテラル "DEF" の連結

                  
1: Dim S As String = "ABC", T As String
2: T = S & "DEF"

また、以下のように記述すると、変数 S に対して文字列 "DEF" を追加する意味になります。変数 S は、"ABCDEF" になります。

[例] 変数 S に "DEF" を追加

                  
1: Dim S As String = "ABC"
2: S = S + "DEF"  '変数 S の "ABC" と "DEF" を連結して変数 S に代入

ただし、気を付けることは、この演算子の連結機能は、もとの文字列に対して本当に物理的に追加している訳でなく、連結した新しい文字列を生成している点です。つまり、変数 S が 1000 文字の文字列のとき、「S+"A"」 のように 1 文字加えた場合、単に 1 文字追加しているのではなく、新たに 1001 文字分の領域を確保し、そこに 1000 文字コピーして 1 文字追加しています。文字列連結をあまり頻繁におこなうと、オーバーヘッドになるかもしれません(もっとも、1、2 回このような操作をおこなったところで、目でみえるほどパフォーマンスに影響することはありませんが…)。

3-4-4 ビット演算

VB .NET には、ビット演算をおこなう演算子として、Not(ビット反転)、Or(論理和)、And(論理積)、Xor(排他的論理和)が用意されています。これらの演算子を使うと、対象データについて各ビット単位に演算をおこなうことができます。

注意  
コードエディタに以下のコードを入力すると、「&H00FF」 は 「&HFF」 と自動変換され、上位桁のゼロは省略されます。

[例] さまざまなビット演算

                  
1: Dim X As Short = &H00FF  'ビットの並びは 0000 0000 1111 1111
2: Dim Y As Short = &H0FF0  'ビットの並びは 0000 1111 1111 0000
3: Dim Z As Short
4: Z = Not X   '反転   1111 1111 0000 0000 になる
5: Z = X Or Y  '0000 1111 1111 1111 になる(少なくとも一方が 1 なら 1)
6: Z = X And Y '0000 0000 1111 0000 になる(両方が 1 のときのみ 1)
7: Z = X Xor Y '0000 1111 0000 1111 になる(両方が異なるビットのとき 1)

Not は単項演算子で、それ以外は二項演算子です。前記の例では、計算結果は変数 Z に代入されます。

これらのビット演算においては、データは整数型に変換されてからビット単位の演算がおこなわれます。もし、浮動小数点型(SingleやDouble)を演算項目に使用した場合は、演算の前に、その型に見合うバイト長の整数型に変換されます。ただし、Option String がオンの場合、演算項目として浮動小数点を直接記述すると、コンパイルエラーになります(Options Strict については、3-1-5 「Dim 文によるさまざまな変数の宣言」 の 「参考」 欄を参照)。つまり、このビット演算は、本来、整数型データに関してビット単位の演算をおこなうということができます。

なお、Not、Or、And、Xor は、条件式でも使用します(詳しい条件式の説明は、第 4 章 「さまざまな制御構造」 でおこないます)。以下の例では、ビット演算ではなく、2 つの条件式が真であるかどうかをチェックしている条件文です。

[例] 条件文における And

                  
1: If X > 3 And Y > 2  Then  'もし、X > 3 かつ Y > 2 ならば、

もともと、「X>3」 や 「Y>2」 という条件式は、True か False を算出する計算式と考えることができ、この条件式の結果は Boolean 型データになります。つまり、And 演算子の前後の計算項目が Boolean 型データのときは、ビット演算ではなく、「かつ」 という意味に使われ、結果的に 「X>2 And Y>2」 の計算結果も、True か False を返します。このときは、各ビットごとの演算をおこなっている訳ではありません。

3-4-5 代入をともなう演算子

VB .NET には、従来の VB6 にはなかった新しい演算子として、代入をともなう演算子(Assignment operator)が導入されました。この演算子は、演算処理、および演算結果を代入する 2 つの働きがあります。

[例] 代入をともなう演算子

                  
1: Dim A As Integer = 10, S As String = "ABC"
2: A += 1      'A = A + 1 と同じ
3: A -= 2      'A = A - 2 と同じ
4: A *= 5      'A = A * 5 と同じ
5: A /= 2      'A = A / 2 と同じ
6: A ^= 2      'A = A ^ 2 と同じ
7: A \= 3      'A = A \ 3 と同じ
8: S += "DEF"  'S = S + "DEF" と同じ

これらの演算子の書式をまとめると、以下のようになります。

変数 1 = 変数 1 演算子 任意データ

ならば、

変数 1 演算子= 任意データ

と表現できます。

つまり、同一の変数に対して演算結果を反映させる場合は、この代入をともなう演算子を使うことができます。これによって、表記がよりシンプルになります。例えば、変数 A に 2 を直接加算するのであれば、「A=A+2」 の代わりに、以下のように書きます。より直感的にわかりやすくなりました(もともと、この表現は C/C++、C#、Java などでも採用されている表記です)。

[例] 変数 A 自身を 2 だけ増加

                  
A += 2  '2 だけ増加

<< 前のページ  次のページ>>

目次