.NET VB 式と演算子について
.NET VB(VisualBasic)のifやselect等に使用される条件式や計算で使用される演算子(代入演算子、算術演算子、連結演算子、ビット演算子、比較演算子、論理演算子、ビット演算子、Like演算子、Is演算子、シフト演算子)の使用方法や使用時の注意点、優先順位についてサンプル付きで解説風に記録しておく。
式の種類
値、変数、定数、関数などを演算子で結びつけたものを式と言います。
演算子の優先順位
1つの式の中で複数の演算子が含まれている場合は、優先順位が高いものから実行及び評価されていく。また、同じ優先度の場合は左から右に評価される。
100 + 200 + 300 '100 + 200が最初に計算され、その後に300を足す
演算子 | 優先度 | |
---|---|---|
()かっこ | 1 | |
関数 | 2 | |
算術演算子 | ^ | 3 |
– | 4 | |
* | 5 | |
/ | 5 | |
\ | 6 | |
Mod | 7 | |
+ | 8 | |
– | 8 | |
& | 9 | |
比較演算子 | = | 10 |
<> | 10 | |
< | 10 | |
<= | 10 | |
> | 10 | |
>= | 10 | |
Like | 10 | |
Is | 10 | |
TypeOf Is | 10 | |
論理演算子 | Not | 11 |
And、AndAlso | 12 | |
Or,OrElse | 13 | |
Xor | 14 | |
=,^=,*=,/=,\=,+=,-=,&= | 15 |
明示的に優先順位を変更したい場合は、カッコを使う。
以下の例のように、合計金額の全体に対して消費税率を掛けたい場合などは、カッコを使用することで、計算や評価の優先順位を変更することができる。カッコは入れ子することができる。その際は、最も内側のカッコの優先順位が高い。
100 + 200 * 0.08 '200×0.08後に100を足す。
(100 + 200) * 0.08 '100 + 200が優先される。
代入演算子(変数と計算で使用される。)
主に変数に値を格納する場合に使用されます。
演算子 | 内容 | 使用例 | 解説 |
---|---|---|---|
= | 右辺の値を左辺に代入する | Dim a = 10 | aの変数内の値は10となる。 |
+= | 左辺の値に右辺の値を加算して左辺に代入する。 | Dim a As Integer = 10 a += 5 | aの値は、15となる。 |
-= | 左辺の値から右辺の値を減算して左辺に代入する。 | Dim a As Integer = 10 a -= 5 | aの値は、5となる。 |
*= | 左辺の値から右辺の値を乗算して左辺に代入する。 | Dim a As Integer = 10 a *= 5 | aの値は、50となる。 |
/= | 左辺の値から右辺の値を除算して左辺に代入する。 | Dim a As Integer = 10 a /= 5 | aの値は、2となる。 |
\= | 左辺の値から右辺の値を除算した結果の整数部分だけ 差辺に代入する。 | Dim a As Integer = 5 a \= 2 | aの値は、2となる。 |
^= | 左辺の値を右辺の値でべき乗して左辺に代入する。 | Dim a As Integer = 10 a ^= 2 | aの値は、100となる。 ※べき乗は、 10*10と同様になる。 a^=3は、10*10*10である。 |
&= | 左辺の文字列に右辺の文字列を連結して左辺に代入する。 | Dim a As String= “.NET” a &= “VB” | aの値は、.NET VBとなる。 |
<<= | 2進数の値を右辺で指定した桁数の分左へシフトし 左辺へ代入する。 また、はみ出た部分は破棄され、 空いた上位ビットは0で埋められます。 | Dim a As Byte= 1 Dim b As Byte=2 a <<= b | aの値は、4となる。 |
>>= | 2進数の値を右辺で指定した桁数の分右へシフトし 左辺へ代入する。 また、はみ出た部分は破棄され、 空いた上位ビットは0で埋められます。 | Dim a As Byte= 10 Dim b As Byte=2 a >>= b | aの値は、2となる。 |
サンプル
'= の代入演算子
Dim a As Integer = 0
a = 10 '= の代入演算子
Console.WriteLine("変数名aの値は、" & a.ToString & "です。")
'+= の代入演算子
Dim b As Integer = 0
b += 10 '+= の代入演算子
Console.WriteLine("変数名bの値は、" & b.ToString & "です。")
'-= の代入演算子
Dim c As Integer = 20
c -= 10 '-= の代入演算子
Console.WriteLine("変数名cの値は、" & c.ToString & "です。")
'*= の代入演算子
Dim d As Integer = 10
d *= 5 '*= の代入演算子
Console.WriteLine("変数名dの値は、" & d.ToString & "です。")
'/= の代入演算子
Dim e As Double = 10
e /= 5 '/= の代入演算子
Console.WriteLine("変数名eの値は、" & e.ToString & "です。")
'\= の代入演算子
Dim f As Integer = 5
f \= 2 '\= の代入演算子
Console.WriteLine("変数名fの値は、" & f.ToString & "です。")
'^= の代入演算子
Dim g As Double = 10
g ^= 2 '^= の代入演算子
Console.WriteLine("変数名gの値は、" & g.ToString & "です。")
'&= の代入演算子
Dim h As String = ".NET"
h &= "VB" '&= の代入演算子
Console.WriteLine("変数名hの値は、" & h.ToString & "です。")
代入演算子による簡略表記
書式
通常表記 | 簡略表記 |
---|---|
a = a + b | a += b |
a = a – b | a -= b |
a = a * b | a *= b |
a = a / b | a /= b |
a = a \ b | a \= b |
a = a ^ b | a ^= b |
a = a & b | a &= b |
a = a << b | a <<= b |
a = a >> b | a >>= b |
Dim a As Decimal = 20
Dim b As Decimal = 10
'a = a + bの短縮形
a += b
Console.WriteLine("a += b 値:" & a.ToString)
'a = a - bの短縮形
a -= b
Console.WriteLine("a -= b 値:" & a.ToString)
'a = a * bの短縮形
a *= b
Console.WriteLine("a *= b 値:" & a.ToString)
'a = a / bの短縮形
a /= b
Console.WriteLine("a /= b 値:" & a.ToString)
'a = a \ bの短縮形
Dim c As Integer = 5
Dim d As Integer = 2
c \= d
Console.WriteLine("c \= d 値:" & c.ToString)
'a = a ^ bの短縮形
Dim e As Double = 5
Dim f As Double = 2
e ^= f
Console.WriteLine("e ^= f 値:" & e.ToString)
'g = g & hの短縮形
Dim g As String = "VB"
Dim h As String = ".NET"
g &= h
Console.WriteLine("g &= h 値:" & g.ToString)
'i = i << jの短縮形
Dim i As Byte = 1
Dim j As Byte = 2
i <<= j
Console.WriteLine("i <<= j 値:" & i.ToString)
'i = i >> jの短縮形
i >>= j
Console.WriteLine("i >>= j 値:" & i.ToString)
算術演算子(計算で使用される)
演算子 | (内容 | 使用例 | |
---|---|---|---|
^ | べき乗(指数演算) | Dim a As Integer = 0 a = 10 ^ 2 | aの値は、100となる。 |
– | 数値を負(マイナス)の値にする | Dim a As Integer = 0 a = 10 – 2 | aの値は、8となる。 |
* | 乗算 | Dim a As Integer = 0 a = 10 * 2 | aの値は、20となる。 |
/ | 除算 | Dim a As Integer = 0 a = 10 / 2 | aの値は、5となる。 |
¥ | 整数除算 | Dim a As Integer = 0 a = 5 \ 2 | aの値は、2となる。 5/2=2.5のうち整数 部分が代入される。 |
Mod | 剰余(割り算の余り) | Dim a As Integer = 0 a = 5 Mod 2 | aの値は、1となる。 5÷2の内余りの1 が代入される。 |
+ | 加算 | Dim a As Integer = 0 a = 10 + 5 | aの値は、15となる。 |
– | 減算 | Dim a As Integer = 0 a = 10 – 5 | aの値は、5となる。 |
サンプル
'^ 算術演算子
Dim a As Double = 0
a = 10 ^ 2 '^ の算術演算子
Console.WriteLine("変数名 aの値は、" & a.ToString & "です。")
'-(負) 算術演算子
Dim b As Integer = 0
b = 10 + -2 '- の算術演算子
Console.WriteLine("変数名 bの値は、" & b.ToString & "です。")
'* 算術演算子
Dim c As Integer = 0
c = 10 * 5 '* の算術演算子
Console.WriteLine("変数名 cの値は、" & c.ToString & "です。")
'/ 算術演算子
Dim d As Double = 0
d = 10 / 5 '/ の算術演算子
Console.WriteLine("変数名 dの値は、" & d.ToString & "です。")
'\ 算術演算子
Dim e As Integer = 0
e = 5 \ 2 '\ の算術演算子
Console.WriteLine("変数名 eの値は、" & e.ToString & "です。")
'Mod 算術演算子
Dim f As Integer = 0
f = 5 Mod 2 'Mod の算術演算子
Console.WriteLine("変数名 fの値は、" & f.ToString & "です。")
'+ 算術演算子
Dim g As Integer = 0
g = 10 + 5 '+ の算術演算子
Console.WriteLine("変数名 gの値は、" & g.ToString & "です。")
'- 算術演算子
Dim h As Integer = 0
h = 10 - 5 '- の算術演算子
Console.WriteLine("変数名 hの値は、" & h.ToString & "です。")
連結演算子(文字列と文字列を結合させる)
連結演算子は、文字列同士をつなげるための演算子です
演算子 | 内容 | 使用例 | 優先度 | |
---|---|---|---|---|
& | 文字列の連結 | Dim str As String = “” str = “VB” & “.NET” | strの内容は、”VB.NET”となります。 | 7 |
+ | 文字列の連結 | Dim str As String = “” str = “VB” + “.NET” | strの内容は、”VB.NET”となります。 | 7 |
サンプル
'& 連結演算子
Dim a As String = ""
a = "VB" & ".NET" '& の連結演算子
Console.WriteLine("変数名 aの値は、" & a & "です。")
'+ 連結演算子
Dim b As String = ""
b = "VB" + ".NET" '+ の連結演算子
Console.WriteLine("変数名 bの値は、" + b + "です。")
文字列と文字列を結合させる場合、&と+をどちらを使用すべきか。
&演算子で統一するようにしよう。数値型と文字列型を+で連結した場合は、文字列を数字として扱い計算してしまうため、&で統一しておくほうが安全である。
ビット演算子
ビット演算子は、整数型データ(Byte,Integer,Long,列挙型)に対してビット単位で演算を行います。ビット演算を行うには、「&HFFFF」のように16進数を使用します。16進数は、2進数の4桁を常に1桁で表すことができるのでデータをビット単位で扱う場合に利用されます。
Notによるビットの反転
ビットの反転では、ビットが1であれば0,0であれば1に反転します。Not演算の目的は、すべてのビットを強制的に反転(0なら1、1なら0)することです。
Dim a As Integer = &H80000001
a = Not a 'aの値は7FFFFFFEになる。
2進数の表記
1000 0000 0000 0000 0000 0000 0000 0001(0x80000001)
0111 1111 1111 1111 1111 1111 1111 1110(0x7FFFFFFE)
Or演算
Or演算では、同じ位置のビットに1があれば、結果を1があれば、結果を1にします。Or演算の目的は、特定のビットだけ強制的にオンにして、その他のビットはそのままにすることです。
Dim a As Short
b = &H5A Or &H11 ' bの値は5bになる
And演算
And演算では、同じ位置のビットがどちらも1であれば結果を1にします。And演算の目的は特定のビットだけを強制的にオフにして、その他のビットはそのままにすることです。このことビットをマスクするといいます。
Dim a As Short
b = &H5A And &H11 'bの値は10になる
Xor演算
Xor演算では、同じ位置のビットが異なっていれば、結果を1にします。Xor演算の目的は特定のビットだけを強制的に反転(0なら1、1なら0)し、その他のビットはそのままにすることです。
Dim a As Short
b = &H5A And &H11 'bの値は4bになる
比較演算子(if、selectで使用される)
比較演算子は2つの式を比較する場合に使用されrます。比較結果は、True(真)または、False(偽)のどちらかの値で返されます。
演算子 | 内容 | 例 | |
---|---|---|---|
= | 等しい | if price = 10 then | priceが10であればTrue(真) priceが10以外であればFalse(偽) |
<> | 等しくない | if price <> 10 then | priceが10以外であればTrue(真) priceが10であればFalse(偽) |
< | 右辺より小さい | if price < 10 then | priceが10小さければTrue(真) priceが10以上であればFalse(偽) |
<= | 右辺以下 | if price <= 10 then | priceが10以下であればTrue(真) priceが10より大きければFalse(偽) |
> | 右辺より大きい | if price > 10 then | priceが10より大きければ、True(真) priceが10以下であれば、False(偽) |
>= | 右辺以上 | if price >= 10 then | priceが10より以上であれば、True(真) priceが10より小さければ、False(偽) |
サンプル
Dim price As Integer = 100
'= 比較演算子
If price = 100 Then
Console.WriteLine("100円です。")
Else
Console.WriteLine("100円以外です。")
End If
'<> 比較演算子
If price <> 50 Then
Console.WriteLine("50円以外です。")
Else
Console.WriteLine("50円です。")
End If
'< 比較演算子
If price < 200 Then
Console.WriteLine("200円より小さいです。")
Else
Console.WriteLine("200円以上です。")
End If
'< 比較演算子
If price <= 200 Then
Console.WriteLine("200円以下です。")
Else
Console.WriteLine("200円を超えています。")
End If
'> 比較演算子
If price > 50 Then
Console.WriteLine("50円を超えています。")
Else
Console.WriteLine("50円以下です。")
End If
'>= 比較演算子
If price >= 50 Then
Console.WriteLine("50円以上です。")
Else
Console.WriteLine("50円未満です。")
End If
論理演算子
論理演算子は、複数の条件式を組み合わせて、複合的な条件の判定を行う場合に利用します。判定はの結果は、True(真)またはFalse(偽)のどちらかの値で返されます。
And演算子
演算子 | 内容 |
---|---|
And | 2つの条件式の論理積を求める。2つの式が両方ともTrueの場合にのみTrueとなる。それ以外はFalse |
サンプル
Dim priceA As Integer = 100 'A商品価格
Dim priceB As Integer = 200 'B商品価格
Dim priceC As Integer = 300 'C商品価格
'AND 論理演算子
If priceA = 100 And priceB = 200 Then
Console.WriteLine("A商品価格は100円です。B商品価格は200円です。")
Else
Console.WriteLine("A商品価格は100円以外か、B商品価格が200円以外です。")
End If
'AND 論理演算子 ANDを複数繋げた例
If priceA = 100 And priceB = 200 And priceC = 300 Then
Console.WriteLine("A商品価格は100円、B商品価格は200円、C商品価格は300円です。")
Else
Console.WriteLine("A商品価格は100円、B商品価格は200円、C商品価格300円のいずれかが異なります。")
End If
Or演算子
演算子 | 内容 |
---|---|
Or | 2つの条件式の論理和を求める。2つの式のどちらかがTrueであればTrueとなり、 2つの式の両方がFalseの場合にのみFalseになる。 |
サンプル
Dim priceA As Integer = 100 'A商品価格
Dim priceB As Integer = 200 'B商品価格
Dim priceC As Integer = 300 'C商品価格
'OR 論理演算子
If priceA = 100 Or priceB = 100 Then
'True(真)の処理
Console.WriteLine("A商品価格が100円もしくは、B商品価格が100円です。")
Else
'False(偽)の処理
Console.WriteLine("A商品価格は100円以外かつ、B商品価格が100円以外です。")
End If
'OR 論理演算子
If priceA = 100 Or priceB = 100 Or priceC = 100 Then
'True(真)の処理
Console.WriteLine("A商品価格は100円、もしくは、B商品価格が100円、または、C商品価格が100円です。")
Else
'False(偽)の処理
Console.WriteLine("A商品価格は100円、かつ、B商品価格が100円、かつC商品価格100円です。")
End If
Not演算子
演算子 | 内容 |
---|---|
Not | 2つの条件式の論理否定を求める。条件式の真偽を反対に変換する。 条件式がTrueあればFalse、条件がFalseであればTrueの結果を返す。 |
サンプル
Dim priceA As Integer = 100 'A商品価格
'Not 論理演算子
If Not priceA = 100 Then
'True(真)の処理
Console.WriteLine("A商品価格が100円です。")
Else
'False(偽)の処理
Console.WriteLine("A商品価格は100円ではないです。")
End If
Dim flg As Boolean = True
flg = Not flg
Console.WriteLine("flgの値は、" & flg.ToString)
Xor演算子
演算子 | 内容 |
---|---|
Xor | 2つの条件式の排他的論理和を求める。 2つの式のどちらかがTrueの場合にのみTrueの結果を返し、2つの式の両方がTrue,またはFalseの場合は、Falseの結果を返す。 |
サンプル
Dim a As Integer = 1
Dim b As Integer = 2
'変数 a側がFalseで、b側がTrueのため、XorはTrueを返す。
If a > 1 Xor b > 1 Then
Console.WriteLine("True")
Else
Console.WriteLine("False")
End If
'変数 a側がTrueで、b側がFalseのため、XorはTrueを返す。
If a >= 1 Xor b > 2 Then
Console.WriteLine("True")
Else
Console.WriteLine("False")
End If
'変数 a側がTrueで、b側がTrueのため、XorはFalseを返す。
If a >= 1 Xor b > 1 Then
Console.WriteLine("True")
Else
Console.WriteLine("False")
End If
'変数 a側がFalseで、b側がFalseのため、XorはFalseを返す。
If a > 1 Xor b > 2 Then
Console.WriteLine("True")
Else
Console.WriteLine("False")
End If
AndAlso演算子
演算子 | 内容 |
---|---|
AndAlso | 左右がTrueであれば、Trueを返す。 ただし、1つ目の条件式がFalseであれば、2つ目の条件式を評価せずFalseの値を返す。 そのため、パフォーマンスが期待できる。 |
右辺の式の評価が必要な場合は使用できないので注意が必要。
サンプル
Dim priceA As Integer = 100
Dim priceB As Integer = 200
'priceBを評価せず、Falseを返す
If priceA > 100 AndAlso priceB > 100 Then
Console.WriteLine("True")
Else
Console.WriteLine("False")
End If
OrElse演算子
演算子 | 内容 |
---|---|
OrElse | 左右の内のどちらかがTrueであれば、Trueを返す。 ただし、1つ目の条件式がTrueであれば、2つ目の条件式を評価せずTrueの値を返す。 そのため、パフォーマンスが期待できる。 |
右辺の式の評価が必要な場合は使用できないので注意が必要。
サンプル
'priceBを評価せず、Trueを返す
If priceA > 50 OrElse priceB > 200 Then
Console.WriteLine("True")
Else
Console.WriteLine("False")
End If
Like演算子による文字列の比較
Like演算子は、文字列を他の文字列のパターン比較し、マッチすればTrueを返します。マッチしない場合はFalseを返します。
書式
変数名 = 比較対象の文字列(String) Like パターン(文字列 )
パターンマッチ文字 | 解説 |
---|---|
? | 任意の1文字,a?cでは、abc,accなどにマッチする。 |
* | 0個以上の任意の文字。a*zでは、abc…zやabczなどにマッチする。 |
# | 1文字の数字(0~9),0#0では、080や090にマッチする。 |
[charlist] | charlistに指定した文字の中の1文字。カンマで複数選択可能。 ハイフン(-)で範囲指定も可能。 [a-z]であれば、a~zの中の1つの文字。[a-z,0-9] |
[!charlist] | charlistに含まれない1文字 |
【変数名】
比較対象の文字列(String)がパターンと一致したかどうかの結果がBoolean型でセットされます。
【比較対象の文字列(String)】
任意の文字列及び変数を指定します。
【パターン文字列】
比較する文字列をしています。
サンプル
Dim match As String = "password"
'Dim match As String = "pass?word"
'Dim match As String = "password[0-9]"
'Dim match As String = "password[0-9.a-z]"
Console.WriteLine("パスワードを入力してください。")
If Console.ReadLine() Like match Then
Console.WriteLine("パスワードが一致しました。")
Else
Console.WriteLine("パスワードが一致しません。")
End If
Is・NotIs演算子によるオブジェクト比較
Is演算子は、2つのオブジェクトが同じものか判定します(キャスト)。同一であればTrue、異なるものであればFlaseを返します。
サンプル
If TypeOf obj Is ComboBox Then
End if
シフト演算子
シフト演算子は、Byte、Short、Integer、Longのデータ型の数値に対して演算ができます。
<<演算子は、左辺の数値のビット(2進数)を右辺で指定した回数分だけ左側にシフトします。
>>演算子は、左辺の数値のビット(2進数)を右辺で指定した回数分だけ右側にシフトします。
はみ出たビットは破棄されます。
演算子 | 例 | 結果 | 解説 | |
---|---|---|---|---|
<< | 左シフト | 1(左辺) << 2(右辺) | 4 | 左へ2つビットが移動します。 2進数:0000001→00000100 |
>> | 右シフト | 10(左辺) >> 2(右辺) | 2 | 右へ2つビットが移動します。 2進数:0001010→00000010 |
<< サンプル
Dim a As Integer = 0
a = 1 << 2
Console.WriteLine("1 << 2 値:" & a.ToString)
>> サンプル
Dim a As Integer = 0
a = 10 >> 2
Console.WriteLine("10 >> 2 値:" & a.ToString)
演算子には、優先順位がある。1+2*3では、*の優先順位が高いので、2*3が先に計算される。