論理演算子
VB.NETではVB6以前からの論理演算子Or
, And
, Xor
, Not
が使えます。
Dim b, b1, b2 As Boolean
b1 = True
b2 = False
b = b1 Or b2 ' 論理和 : b = True
b = b1 And b2 ' 論理積 : b = False
b = b1 Xor b2 ' 排他的論理和 : b = True
b = Not b1 ' 論理否定 : b = False
AndAlso演算子・OrElse演算子
VB.NETでは新たにAndAlso
とOrElse
という演算子が追加されました。 これはショートサーキットによる評価を行うための演算子で、And/Or演算子とAndAlso/OrElse演算子の違いは、第二項が常に評価されるかどうかが異なる点にあります。 第一項がFalseの場合、AndAlsoは第二項を評価せずにFalseを返します。 同様に、第一項がTrueの場合、OrElseは第二項を評価せずに Trueを返します。
And演算子とAndAlso演算子の違いをより明確にするため、次のようなコードを考えます。
Module Module1
Sub Main()
Console.WriteLine("And演算子")
If Func1() And Func2() Then
Console.WriteLine("成功")
Else
Console.WriteLine("失敗")
End If
Console.WriteLine("AndAlso演算子")
If Func1() AndAlso Func2() Then
Console.WriteLine("成功")
Else
Console.WriteLine("失敗")
End If
End Sub
Function Func1() As Boolean
Console.WriteLine("Func1が呼び出されました")
Return False
End Function
Function Func2() As Boolean
Console.WriteLine("Func2が呼び出されました")
Return True
End Function
End Module
この例ではFunc1は失敗、Func2は成功します。 And演算子を使った場合では、Func1が失敗となってもFunc2も呼び出されます。 一方AndAlso演算子を使った場合は、Func1が失敗した時点で式Func1() AndAlso Func2()
がFalse
となる事が確定するため、Func2は呼び出す必要がなくなります(Func2を評価しない)。
そのため、上記のコードの実行結果はこのようになります。
And演算子 Func1が呼び出されました Func2が呼び出されました 失敗 AndAlso演算子 Func1が呼び出されました 失敗
AndAlso演算子・OrElse演算子の真理値表をまとめると次のようになります。
第一項 | 第二項 | 結果 |
---|---|---|
False | False | False |
False | True | True |
True | False | True |
True | True | True |
第一項 | 第二項 | 結果 |
---|---|---|
False | False | False |
False | True | True |
True | (評価しない) | True |
第一項 | 第二項 | 結果 |
---|---|---|
False | False | False |
False | True | False |
True | False | False |
True | True | True |
第一項 | 第二項 | 結果 |
---|---|---|
False | (評価しない) | False |
True | False | False |
True | True | True |
If演算子
VB.NET 2008(Visual Studio 2008)からは、If演算子がサポートされるようになりました。 これはCやC#の三項演算子~?~:~
と同様のものです。 If演算子は、If(条件式, 真の場合の値, 偽の場合の値)
という形式で使用します。 If演算子は、AndAlso・OrElse演算子と同様にショートサーキットによる評価を行います。
Dim i As Integer = 1
Console.WriteLine("{0}は{1}です", i, If(i Mod 2 = 0, "偶数", "奇数"))
If演算子と似たものとしてIIf関数が用意されていましたが、IIf関数では結果はObject型で返されるのに対し、If演算子では結果が第二項・第三項の型で返される点が異なります。
Dim a As Object = IIf(True, "2", 3) ' aには文字列"2"が代入される
Dim b As Object = IIf(False, "2", 3) ' bには数値3が代入される
Dim c As Integer = If(True, "2", 3) ' 二項目と三項目で型が異なるためコンパイルエラー
1行形式のIf~Then~ElseステートメントとIf演算子を使った場合の違いを例示すると次のようになります。 Ifステートメントでは条件式と真偽それぞれの場合の処理(ステートメント)を記述しますが、If演算子では条件式と真偽それぞれの場合の値を記述します。
Dim i As Integer = 1
Dim oddeven As String
' 1行形式のIfステートメントを使った場合の記述
If i Mod 2 = 0 Then oddeven = "偶数" Else oddeven = "奇数"
Console.WriteLine("{0}は{1}です", i, oddeven)
' If演算子を使った場合の記述
oddeven = If(i Mod 2 = 0, "偶数", "奇数")
Console.WriteLine("{0}は{1}です", i, oddeven)
二項形式のIf演算子
If演算子では二項形式でも使用できます。 二項形式のIf演算子は、If(値, 第一項がNothingの場合の値)
という形式で使用します。 第一項がNothingの場合は第二項の値が返され、Nothing以外の場合は第一項の値がそのまま返されます。 If演算子を二項形式で使用する場合、第一項は参照型(もしくはnull許容型)でなければなりません。 二項形式のIf演算子は、C#におけるnull合体演算子??
と同様のものです。
Dim str As String = Nothing
Console.WriteLine(If(str, "Nothing")) ' 文字列 "Nothing" が出力される
str = "foo"
Console.WriteLine(If(str, "Nothing")) ' strに代入されている値 "foo" が出力される
Dim val As Integer? = Nothing ' null許容のInteger型
Console.WriteLine(If(val, 3)) ' 数値 3 が出力される
val = 16
Console.WriteLine(If(val, 3)) ' valに代入されている値 16 が出力される
Eqv演算子・Imp演算子
VB6以前に存在したEqv, Imp演算子はVB.NETでは廃止されました。 これらの演算子と同様の結果を得るには次のようにします
Dim b, b1, b2 As Boolean
' Eqv演算子、Imp演算子と同じ結果を得る方法
b = (b1 = b2) ' VB6以前の「b = b1 Eqv b2」と等価
b = (Not b1) Or b2 ' VB6以前の「b = b1 Imp b2」と等価