2017-07-20 19 views
0

ブール式が評価されても見つからない順序についての説明を探しています。ブール式がどのような順序で評価されていますか

は、この文を見てみましょう:

if (locClsTanken.PlaceID == -1 && locRwF.PlaceID > -1 || locClsTanken.DagPrijs == 0) 

これが評価される方法。

if ((locClsTanken.PlaceID == -1 && locRwF.PlaceID > -1) || locClsTanken.DagPrijs == 0) 

またはこのような:

if (locClsTanken.PlaceID == -1 && (locRwF.PlaceID > -1 || locClsTanken.DagPrijs == 0)) 

が、私は英語が私の言語ではないので、正しい検索用語を知らないこれについていくつかのドキュメントがあります
が、それはこのようになります。

私は完全にそれを理解することができますので、

+1

で、ために追求用語は 'precedence'である - しかし、私も注意したいです私が考えることができるほとんどすべての言語で、余分な角括弧はパフォーマンスのペナルティを課すものではないので、すべてがわからない場合は、括弧を挿入するだけです。 –

+0

@Damien_The_Unbelieverはい私はいつも括弧を使いますが、今日のsomenonesコードでこの表現を見つけ、どこに括弧を入れるべきかを知りたがっています。ありがとう – GuidoG

+1

確かに括弧を使います。何らかの形で動作するコードだけでなく、他の人が理解できるコードを書くべきです。角かっこを追加すると、少なくとも次のコードを読んでいる人がこの同じ質問をする必要はありません。条件を関数にリファクタリングすることは、将来のプログラマーにとってより良いことかもしれません。あなたが未来のプログラマーであれば、物事をより良くするチャンスを逃さないでください:) – oerkelens

答えて

5

&&はそう

locClsTanken.PlaceID == -1 && locRwF.PlaceID > -1 || locClsTanken.DagPrijs == 0 

として評価され、 ||よりも優先順位が高い私は、私はそれをテストすることができます知っているが、私はこれについてのドキュメントを見つけるしたいと思います
(locClsTanken.PlaceID == -1 && locRwF.PlaceID > -1) || locClsTanken.DagPrijs == 0 

&&||も短絡されていることに注意してください右側のオペランドは、左側のオペランドが評価された後に結果を変更できる場合にのみ発生します。

参考:https://msdn.microsoft.com/en-gb/library/aa691323(v=vs.71).aspx

+0

リンクありがとう – GuidoG

2

式が&&||よりも優先順位が高いことに加えて、左から右にreadedされています。
は、だからあなたの場合にはそれが

if ((locClsTanken.PlaceID == -1 && locRwF.PlaceID > -1) || locClsTanken.DagPrijs == 0) 

ようになるだとあなたが探している技術的サームは 演算子の優先順位 C#では、コンパイラの動きをこのlink:Operators Precedence

2

に見ています左から右に向かって、最も左の式が最初に評価されることを意味します(あなたのケースでは、locClsTanken.PlaceID == -1

また、&&は、 || - >最初に評価されます

しかし、コンパイラが&&||をどのようにハンドリングするかは、混乱させるかもしれません。 &&&の間に違いがあります。

&は、両方の式が真でなければならず、両方の式が評価されることを意味します。ただし、&&は、最初に1つの式が評価されるだけです。最初の式が失敗した場合は、&&をtrueにするためには両方の式が真である必要があるため、2番目の式が評価されていない場合もあります。一つ目は、すでに&&は常にfalseで失敗した場合 - あなたは答えから発見されてきたように>&&&より速く、より「知的な」

関連する問題