論理演算子

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では新たにAndAlsoOrElseという演算子が追加されました。 これはショートサーキットによる評価を行うための演算子で、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演算子の真理値表をまとめると次のようになります。

Or演算子の真理値表
第一項 第二項 結果
False False False
False True True
True False True
True True True
OrElse演算子の真理値表
第一項 第二項 結果
False False False
False True True
True (評価しない) True
And演算子の真理値表
第一項 第二項 結果
False False False
False True False
True False False
True True True
AndAlso演算子の真理値表
第一項 第二項 結果
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合体演算子??と同様のものです。

参照型とIf演算子の例
Dim str As String = Nothing

Console.WriteLine(If(str, "Nothing")) ' 文字列 "Nothing" が出力される

str = "foo"

Console.WriteLine(If(str, "Nothing")) ' strに代入されている値 "foo" が出力される
null許容型とIf演算子の例
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」と等価