- PR -

VBのAnd演算子とOr演算子の存在意義

投稿者投稿内容
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2006-10-07 17:39
こんにちは。常々疑問に思ってたことがあり、ちょいと皆さんの意見を伺ってみたいのですが。

C#で以下のようなコードがあったとします。

コード:

if (str == null || str.Length == 0) {
    SomeMethod();
}

if (str != null && str.Length > 0) {
    SomeMethod();
}


これを、C# to VB.NET Translatorで翻訳してみると、以下のようなコードになります。

コード:

If str Is Nothing Or str.Length = 0 Then
   SomeMethod()
End If

If Not (str Is Nothing) And str.Length > 0 Then
   SomeMethod()
End If


ところが、このC#のコードとVBのコード、動作が異なるんですよね。
具体的にはstrがnullの時、VBの方だけ例外が発生します。

調べてみると、VBのAndやOr演算子って、最初の評価でif、else
どっちのブロックに飛ぶかが決まるような場合も全ての評価を行ってしまうようで。

代わりにAndAlsoとOrElse演算子が用意されているようですが、
理解に苦しむのは、何故わざわざAndやOr演算子の動作を&&や||と同じにせず、
別途AndAlsoとOrElse演算子を用意しているのか、ということです。

このような、阿呆としか思えないようなAndとOr演算子の動作を残していることに、
何か意味はあるのでしょうか?
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2006-10-07 17:47
えーと、& 演算子や | 演算子ってご存じでない?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-10-07 18:07
引用:

ぼのぼのさんの書き込み (2006-10-07 17:39) より:

このような、阿呆としか思えないようなAndとOr演算子の動作を残していることに、
何か意味はあるのでしょうか?


たとえば、System.IO.FileAttributes などから属性を抽出する時、
ぼのぼのさんなら、どうするのでしょうか?逆に結合する時、ぼのぼのさんなら、どうするのでしょうか?
ちなみに '+' 演算子を使用すると、列挙型から System.Int32 型になってしまいます。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2006-10-07 19:10
ビット演算に関する話は、単にオペランドの型がブール型か整数型かで
別の動作をする演算なだけで、本質的にはあんまり関係ないと思いますが。

まあ、両辺を評価する演算子がなけりゃそれはそれで両辺を評価したい場合に困りますね。
なんでAndとOrが残ってるか、あるいは短絡評価しないのかって意味では、
おおよそ歴史的な事情、互換性等々でしょう。
※配列のサイズ指定が要素数ではなくてインデックスの最大値ってのも同じようなもの
ぷさいくろう
ぬし
会議室デビュー日: 2006/08/30
投稿数: 1034
投稿日時: 2006-10-07 20:18
副作用を使いたいときもある
普通は使わんけど
ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2006-10-07 20:48
引用:


このような、阿呆としか思えないようなAndとOr演算子の動作を残していることに、
何か意味はあるのでしょうか?



結局その表現は、Cの仕様が絶対と思っているだけじゃない。既定(というと誤解があるかもしれないので、いわゆるAnd演算で一般的に使われるほう)が短絡かどうかなんてどっちでもいい(し言語設計者、使用者の思想による)としかいえないし。

Cの(一般的に言われる、使われる)And演算子(&&)は短絡だった。また、ビット演算が短絡でない評価結果と等価だった(厳密に言えばTrueの値はそろえる必要があるけども)のでその意味(短絡ではないAnd演算子)でも使用されていて、C#はboolの & 演算子の動作をそれで定義した。VBのAndは短絡ではなかった。短絡もほしくなったのでAndAlsoが追加されただけ。

個人的にはステートメントではなく、エクスプレッションで分岐を定義する短絡評価の方こそ糞仕様だといわれたって反論できない。短くかけるし、きれいにかける場合があるから必要と思うだけで。

# というかC#は、演算子の文字数の対応では、& が短絡ではなく && が短絡なんだから、
# 同じじゃないのかということに今気づいた
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2006-10-07 21:28
大昔は、Cでも両方とも評価する実装も、あったような。
BASICはずっと、両方とも評価するんじゃないかな…20年ちょい前からの、いくつかしか知りませんが。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2006-10-07 21:39
> というかC#は、演算子の文字数の対応では、& が短絡ではなく && が短絡なんだから、
> 同じじゃないのかということに今気づいた

うむむ、ですね。

スキルアップ/キャリアアップ(JOB@IT)