2009-05-07 3 views
7

状況:多くの基準とCでの条件チェック++やC#:C++およびC#では、複数の条件チェックが事前またはランダムシーケンスで実行されていますか?

if (condition1 && condition2 && condition3) 
{ 
    // Do something 
} 

私は常にこれらのチェックが実行される順序が保証されていないと信じられてきました。したがって、必ずしも最初の条件1、条件2、条件3の順である必要はありません。私は私の時代にC++でそれを学んだ。私はそれを聞いたとかどこかに読んだと思う。

私は常に次のような状況で可能なヌルポインターを考慮するために、安全なコードを書いている知っているまで:

if ((object != null) && (object.SomeFunc() != value)) 
{ 
    // A bad way of checking (or so I thought) 
} 

だから私は書いていた:

if (object != null) 
{ 
    if (object.SomeFunc() != value) 
    { 
     // A much better and safer way 
    } 
} 

を私は確認されませんでしたのでnot-nullチェックが最初に実行され、次にインスタンスメソッドが呼び出されて2回目のチェックが実行されます。

ここでは、私たちの最大のコミュニティの心は、これらのチェックが実行される順序が左から右の順序で実行されることを保証しています。

私は非常に驚いています。 C++言語とC#言語の両方で本当にそうですか?

私は今までに聞いたバージョンを他の誰かが聞いたことがありますか?

+1

C#のサブ表現は、左から右、常に、ピリオドで評価されます。 C/C++の部分式は、シーケンスポイント順に評価されます。同じシーケンスポイント内の2つの式は、任意の順序で評価できます。正式な定義が必要な場合は、「シーケンスポイント」でウェブ検索を行います。 –

答えて

14

ショートアンサーは短絡評価をして左から右に表示されます。順序は予測可能です。

// perfectly legal and quite a standard way to express in C++/C# 
if(x != null && x.Count > 0) ... 

一部の言語では、分岐前の条件(例:VB6)のすべてを評価します。

// will fail in VB6 if x is Nothing. 
If x Is Not Nothing And x.Count > 0 Then ... 

Ref:MSDN C# Operatorsとその順序または優先度。

+0

@ロバーツ:「xがNothing && ...でないならば...」(または同等のVB6構文)を意味しないのですか? – RichieHindle

+1

@リッチハンド - はい、私のVB6/VBScriptの思い出はありがたいことです。私は –

2

左から右へ評価すると、と評価され、いずれかが偽と評価された場合、評価が中止されると定義されています。これはC++とC#の両方で当てはまります。

0

他の方法があるとは思われません。これは、理由のないステートメントを順不同で実行することをコンパイラが決定するようなものです。 :)今、いくつかの言語(VB.NETなど)では、短絡や短絡のための論理演算子が異なります。しかし、その順序はコンパイル時に常に明確に定義されています。

ここには、C#言語仕様のoperator precedenceがあります。スペック...代入演算子を除き

から、 すべてのバイナリ演算子は、右 左から 操作が実行されていることを意味し、 左結合されています。例えば、x + y + zは(x + y)+ zとして評価される である。

+0

を更新します。また、部分式評価の優先順位、結合性および順序は3つの異なるものです。 C#で優先順位を決定することはできません。 –

+0

また、引用したビットで仕様が間違っていることは残念です。私はそれを解決しようとしてきました。 –

+0

はい、あなたの意見があります。これは直感的ではありませんが、私はその操作が左結合であり、左から右の順序で評価されると考えています。操作を適用する前に両方を評価する必要があるため、優先順位は評価順序を必ずしも意味するものではありません。しかし、短絡として短絡を断念しなければなりません。&&は2つの演算子と3つのオペランドと||短絡は2つでは機能しません。 –

0

左から右に実行する必要があります。これにより、短絡回路の評価が可能になります。

詳細については、Wikipedia articleを参照してください。

関連する問題