![](/fdotnet/vb6tonet/index/vb6nettitle_l.jpg) |
|
連載
プロフェッショナルVB.NETプログラミング
―― VB 6プログラマーのためのVB.NET入門 ――
第6回 論理演算と制御構造
(株)ピーデー
川俣 晶
2002/05/21
|
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に書き換える場合は、式に副作用が含まれているか、よくチェックしよう。
Insider.NET 記事ランキング
本日
月間