左から右への式の評価
質問
C#では、式が左から右に評価されることが保証されていますか?
例:
myClass = GetClass();
if (myClass == null || myClass.Property > 0)
continue;
準拠していない言語はありますか?
解決
実際には、「ショートサーキット論理式」と呼ばれる言語機能を参照します:
これが意味することは、次のとおりです。式が" true"に評価されることが明らかな場合または" false"何があっても、式の残りの部分は評価されません。
たとえば、C#、Java、またはJavaScriptがそれを行い、それらの言語で(質問に答えるために)信頼することができます。
あなたの場合、MyClassがnullでない場合:
-
MyClass == null
はfalseと評価されます - 「または」であるため式、2番目の部分は結果を変更できるため、評価されます
-
myClass.Property> 0
は最終結果を決定します
MyClassがnullの場合:
-
MyClass == null
はtrueと評価されます - 「または」であるため式、後に続くものは関係ありません
- これ以上の評価は行われず、最終結果はtrueです
論理式を短絡させない言語があります。古典的なVBは例です。ここでは" myClass.Property> 0" MyClassがnull(VBでは" Nothing"と呼ばれる)の場合、評価され、エラーが生成されます。
他のヒント
ショートサーキットについては、C#3.0仕様のセクション7.11で説明されています。
操作x || yに対応 操作x | y、ただしyは xが真でない場合にのみ評価されます。
そうです、大丈夫です。
他の言語については、すべての言語を話すのは好きではありません。 VB.NETでは、OrElseとAndAlsoを使用できます。これらは短絡されていますが、単純なOrとAndはありません。
ただし、注意してください:
次のようなものがある場合
sprintf(buf、"%s%s&quot ;, func1(& var)、func2(& var));
varに副作用があり、定義されていません(Cでは、評価順序が他の言語で定義されているかどうかわかりません)、その順序でfunc1()およびfunc2()が実行されます(左または右)引数はスタックに置かれ、そこから評価されます。
Ada、Visual Basic、Pascalなどの言語のand / or演算子は短絡しません。これらの機能を許可するための追加の演算子( "and then"など)を提供します。および「またはその他」エイダで。
わかりませんが、注文または短絡評価に本当に興味がありますか?
100%確実ではありませんが、C#では評価の順序が常に同じであるということを知っています(すべてではないとしてもほとんどの.net言語を想定しています)。短絡評価は、前の回答で説明したように機能します。
ただし、C#では、単純な演算子(&&の代わりに&)を使用して短絡しないことを選択できます。通常は短絡したいが、すべての評価を実行したい場合があります。
Pythonには、短絡 or
および and
演算子があります。
JavaおよびHaskellでは&&および||短絡も。
おもしろい:Haskellではこれは言語に自然に付随します(これを行う独自の演算子を定義できます)が、JavaおよびC#では、これら2つの演算子に対して特定です。
実際には短絡は一部ですが、言語がそれらの左から右への評価を保証するかどうかも知る必要があります。たとえば、C(ANSI、ISO、C99)は左から右への評価を保証しません。サンプルコードでは、NULLをチェックする前にPropertyの値をチェックするか、両方を同時に実行することができます...ほとんどのコンパイラはそうではありませんが、それを実行して仕様に完全に準拠することを妨げるものは何もありません。そのため、このようなコードを記述しないように指示しています。