- - PR -
VBのAnd演算子とOr演算子の存在意義
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-10-07 17:39
こんにちは。常々疑問に思ってたことがあり、ちょいと皆さんの意見を伺ってみたいのですが。
C#で以下のようなコードがあったとします。
これを、C# to VB.NET Translatorで翻訳してみると、以下のようなコードになります。
ところが、このC#のコードとVBのコード、動作が異なるんですよね。 具体的にはstrがnullの時、VBの方だけ例外が発生します。 調べてみると、VBのAndやOr演算子って、最初の評価でif、else どっちのブロックに飛ぶかが決まるような場合も全ての評価を行ってしまうようで。 代わりにAndAlsoとOrElse演算子が用意されているようですが、 理解に苦しむのは、何故わざわざAndやOr演算子の動作を&&や||と同じにせず、 別途AndAlsoとOrElse演算子を用意しているのか、ということです。 このような、阿呆としか思えないようなAndとOr演算子の動作を残していることに、 何か意味はあるのでしょうか? | ||||||||
|
投稿日時: 2006-10-07 17:47
えーと、& 演算子や | 演算子ってご存じでない?
| ||||||||
|
投稿日時: 2006-10-07 18:07
たとえば、System.IO.FileAttributes などから属性を抽出する時、 ぼのぼのさんなら、どうするのでしょうか?逆に結合する時、ぼのぼのさんなら、どうするのでしょうか? ちなみに '+' 演算子を使用すると、列挙型から System.Int32 型になってしまいます。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2006-10-07 19:10
ビット演算に関する話は、単にオペランドの型がブール型か整数型かで
別の動作をする演算なだけで、本質的にはあんまり関係ないと思いますが。 まあ、両辺を評価する演算子がなけりゃそれはそれで両辺を評価したい場合に困りますね。 なんでAndとOrが残ってるか、あるいは短絡評価しないのかって意味では、 おおよそ歴史的な事情、互換性等々でしょう。 ※配列のサイズ指定が要素数ではなくてインデックスの最大値ってのも同じようなもの | ||||||||
|
投稿日時: 2006-10-07 20:18
副作用を使いたいときもある
普通は使わんけど | ||||||||
|
投稿日時: 2006-10-07 20:48
結局その表現は、Cの仕様が絶対と思っているだけじゃない。既定(というと誤解があるかもしれないので、いわゆるAnd演算で一般的に使われるほう)が短絡かどうかなんてどっちでもいい(し言語設計者、使用者の思想による)としかいえないし。 Cの(一般的に言われる、使われる)And演算子(&&)は短絡だった。また、ビット演算が短絡でない評価結果と等価だった(厳密に言えばTrueの値はそろえる必要があるけども)のでその意味(短絡ではないAnd演算子)でも使用されていて、C#はboolの & 演算子の動作をそれで定義した。VBのAndは短絡ではなかった。短絡もほしくなったのでAndAlsoが追加されただけ。 個人的にはステートメントではなく、エクスプレッションで分岐を定義する短絡評価の方こそ糞仕様だといわれたって反論できない。短くかけるし、きれいにかける場合があるから必要と思うだけで。 # というかC#は、演算子の文字数の対応では、& が短絡ではなく && が短絡なんだから、 # 同じじゃないのかということに今気づいた | ||||||||
|
投稿日時: 2006-10-07 21:28
大昔は、Cでも両方とも評価する実装も、あったような。
BASICはずっと、両方とも評価するんじゃないかな…20年ちょい前からの、いくつかしか知りませんが。 | ||||||||
|
投稿日時: 2006-10-07 21:39
> というかC#は、演算子の文字数の対応では、& が短絡ではなく && が短絡なんだから、
> 同じじゃないのかということに今気づいた うむむ、ですね。 |