連載

プロフェッショナルVB.NETプログラミング
―― VB 6プログラマーのためのVB.NET入門 ――

第6回 論理演算と制御構造

(株)ピーデー
川俣 晶
2002/05/21

Page1 Page2

Eqv演算子とImp演算子

 VB 6(Visual Basic 6.0)には、Eqv演算子とImp演算子という演算子があった。これは、はるか遠い祖先のBASICから受け継いだ演算子で歴史は長い。しかし、これらの演算子が有効に活用された事例があるかというと、残念ながら筆者はそのようなものを知らない。ほかの演算子の組み合わせでも容易に実現できるものであり、なくてもあまり問題にならないのではないかと思っていたが、とうとうVB.NET(Visual Basic .NET)でなくなってしまった。

 以下は、VB 6でこれらの演算子を使った例である。

  1: Private Sub Form_Load()
  2:   For i = -1 To 0
  3:     For j = -1 To 0
  4:       Debug.Print i; " Eqv "; j; "="; i Eqv j
  5:     Next
  6:   Next
  7:   For i = -1 To 0
  8:     For j = -1 To 0
  9:       Debug.Print i; " Imp "; j; "="; i Imp j
 10:     Next
 11:   Next
 12: End Sub
Eqv演算子とImp演算子を使用したVB 6のサンプル・プログラム1

 これを実行すると以下のようになる。

 1: -1  Eqv -1 =-1
 2: -1  Eqv  0 = 0
 3:  0  Eqv -1 = 0
 4:  0  Eqv  0 =-1
 5: -1  Imp -1 =-1
 6: -1  Imp  0 = 0
 7:  0  Imp -1 =-1
 8:  0  Imp  0 =-1
サンプル・プログラム1の実行結果

 これと同じ結果が得られるようにVB.NETで記述したサンプル・プログラムは以下のとおりである。

  1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  2:   Dim i, j As Integer
  3:   For i = -1 To 0
  4:     For j = -1 To 0
  5:       Trace.WriteLine(i & " Eqv " & j & "=" & Not (i Xor j))
  6:     Next
  7:   Next
  8:   For i = -1 To 0
  9:     For j = -1 To 0
 10:       Trace.WriteLine(i & " Imp " & j & "=" & ((Not i) Or j))
 11:     Next
 12:   Next
 13: End Sub
サンプル・プログラム1と同じ結果を得るVB .NETのサンプル・プログラム2

 これを実行すると以下のようになる。

 1: -1 Eqv -1=-1
 2: -1 Eqv 0=0
 3: 0 Eqv -1=0
 4: 0 Eqv 0=-1
 5: -1 Imp -1=-1
 6: -1 Imp 0=0
 7: 0 Imp -1=-1
 8: 0 Imp 0=-1
サンプル・プログラム2の実行結果

 見てのとおり、Not、Xor、Orなどを組み合わせるだけで等価の結果が得られる

 Eqvに関しては、このプログラムのように処理せず、「=」演算子で代用できるケースも多いだろう。Boolean値が同じかどうかを調べるという動作であれば、「=」演算子でも同じことが実現されるからだ。ただし演算子の優先順位が違うので、演算子を置き換える際は注意が必要である。同じ順番で演算させるために、必要に応じて括弧などを補おう。

AndAlso演算子とOrElse演算子

 VB.NETには、効率よくAndやOrを含む条件判断を行うAndAlso演算子とOrElse演算子が追加されている。この2つの演算子は、ショートサーキット演算子と呼ばれる。使わなくてもプログラムは作成可能だが、うまく使えば処理速度を向上できる可能性がある。C/C++/Java/C#をご存じの方は、「&&」や「||」に相当するものだといえばすぐに分かるだろう。まず、VB 6で、普通にOrとAndを使用したサンプル・プログラムを見ていただきたい。

  1: Private Function DummySearch(ByVal val As Boolean) As Boolean
  2:   Debug.Print "時間のかかる検索処理を行っています。"
  3:   DummySearch = val
  4: End Function
  5:
  6: Private Sub Form_Load()
  7:   If DummySearch(False) And DummySearch(True) Then
  8:     Debug.Print "第1の条件は満たされています。"
  9:   Else
 10:     Debug.Print "第1の条件は満たされていません。"
 11:   End If
 12:   If DummySearch(True) Or DummySearch(False) Then
 13:     Debug.Print "第2の条件は満たされています。"
 14:   Else
 15:     Debug.Print "第2の条件は満たされていません。"
 16:   End If
 17: End Sub
OrとAndを使用したVB 6のサンプル・プログラム3

 これを実行すると以下のようになる。なお、「時間のかかる検索処理」は、実際には行われていないが、それが行われていると想像していただきたい。

 1: 時間のかかる検索処理を行っています。
 2: 時間のかかる検索処理を行っています。
 3: 第1の条件は満たされていません。
 4: 時間のかかる検索処理を行っています。
 5: 時間のかかる検索処理を行っています。
 6: 第2の条件は満たされています。
サンプル・プログラム3の実行結果

 さて、これをVB.NETで表現したのが以下のサンプル・プログラムである。そのままAndとOrを使っても動作するが、ここではAndAlsoとOrElseに置き換えてみた。

  1: Private Function DummySearch(ByVal val As Boolean) As Boolean
  2:   Trace.WriteLine("時間のかかる検索処理を行っています。")
  3:   DummySearch = val
  4: End Function
  5:
  6: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  7:   If DummySearch(False) AndAlso DummySearch(True) Then
  8:     Trace.WriteLine("第1の条件は満たされています。")
  9:   Else
 10:     Trace.WriteLine("第1の条件は満たされていません。")
 11:   End If
 12:   If DummySearch(True) OrElse DummySearch(False) Then
 13:     Trace.WriteLine("第2の条件は満たされています。")
 14:   Else
 15:     Trace.WriteLine("第2の条件は満たされていません。")
 16:   End If
 17: End Sub
AndAlsoとOrElseを使用したVB.NETのサンプル・プログラム4

 これを実行すると以下のようになる。

 1: 時間のかかる検索処理を行っています。
 2: 第1の条件は満たされていません。
 3: 時間のかかる検索処理を行っています。
 4: 第2の条件は満たされています。
サンプル・プログラム4の実行結果

 見て分かるとおり、VB 6のサンプルでは検索を4回行っているが、VB.NETサンプルでは2回しか検索を行っていない。これは、演算子の手前の式を計算するだけで結果が決まってしまう場合、演算子の後ろの式は計算しないという機能によるものだ。例えば、「条件A Or 条件B」というとき、条件AがTrueなら、条件BがTrueでもFalseでも、式全体は必ずTrueになる。同様に、「条件A And 条件B」というとき、条件AがFalseなら、条件BがTrueでもFalseでも、式全体は必ずFalseになる。これにより、必要な計算を減らすことができ、活用すれば性能アップになる。

 しかし、副作用を期待した計算式を使う場合は要注意である。副作用とは、値を計算するほかに行われる、変数の値を書き換えるなどの動作をいう。例えば、このサンプル・プログラムでいえば、文字列を出力することが副作用である。AndとOrをAndAlsoとOrElseに置き換えると、計算されない式に含まれる副作用は発生しなくなるため、動作が変わってしまう。AndとOrをAndAlsoとOrElseに書き換える場合は、式に副作用が含まれているか、よくチェックしよう。


 INDEX
  連載 プロフェッショナルVB.NETプログラミング
  第6回 論理演算と制御構造
  1.Eqv演算子とImp演算子 
    2.古い制御構造On…GoToとOn…GoSub
 
「プロフェッショナルVB.NETプログラミング」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間