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