2017-07-20 5 views
0

Ich habe nach einer Erklärung für die Reihenfolge gesucht, in der boolesche Ausdrücke ausgewertet werden, aber keine gefunden werden können.In welcher Reihenfolge werden boolesche Ausdrücke ausgewertet

Werfen Sie einen Blick auf diese Aussage:

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

Wie dies ausgewertet ist.
wird es so sein:

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

oder so:

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

Gibt es eine Dokumentation über das weiß ich nicht das richtige Suchwort, weil Englisch nicht meine Sprache ist.

Ich weiß, dass ich es testen können, aber ich möchte die Dokumentation darüber finden, so kann ich voll und ganz verstehen es

+1

Wie Sie aus den Antworten gefunden haben, ist der Begriff gesucht für 'Vorrang '- aber ich würde auch beachten In fast allen Sprachen, die ich mir vorstellen kann, erzwingen zusätzliche Klammern keine Leistungseinbußen. Wenn Sie sich also nicht sicher sind, fügen Sie einfach die Klammern ein, damit der Ausdruck * eindeutig * tut, was Sie vorhaben. –

+0

@Damien_The_Unbeliever Ja, ich benutze immer Klammern, aber ich fand diesen Ausdruck in Somenones Code heute und wollte sicher sein, wo die Klammern setzen. Danke – GuidoG

+1

In der Tat, Klammern verwenden. Sie sollten nicht nur Code schreiben, der irgendwie funktioniert, sondern auch Code, den andere verstehen können. Wenn Sie einige Klammern hinzufügen, muss mindestens die nächste Person, die Ihren Code liest, diese Frage nicht stellen. Das Refactoring der Bedingung zu einer Funktion kann für zukünftige Programmierer sogar noch netter sein. Und wenn Sie der zukünftige Programmierer sind, verpassen Sie keine Chance, Dinge besser zu machen :) – oerkelens

Antwort

5

&& höhere Priorität als || hat, so

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

als

bewertet

Beachten Sie, dass && und || auch kurzgeschlossen sind, so die Bewertung von der rechte Operand tritt nur auf, wenn dies das Ergebnis nach der Auswertung des linken ändern könnte.

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

+0

danke für den Link – GuidoG

2

Der Ausdruck readed aus zu zusätzlich links nach rechts, dass die && hat eine höhere Priorität als ||.
Also in Ihrem Fall ist es wie

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

und die technischen therm wäre, dass Sie suchen ist Betreiber Präzedenz werfen Sie einen Blick auf diese link:Operators Precedence

2

In C# der Compiler bewegt sich von von links nach rechts, was bedeutet, dass der linke Ausdruck zuerst ausgewertet wird (in Ihrem Fall ist das locClsTanken.PlaceID == -1)

Außerdem hat && höhere Priorität als || -> wird zuerst ausgewertet

Was Sie jedoch verwirren könnte, ist, wie der Compiler die && und || hantiert. Es gibt einen Unterschied zwischen & und &&.

& bedeutet, dass beide Ausdrücke wahr sein müssen und beide Ausdrücke ausgewertet werden. && bewirkt jedoch nur, dass zuerst ein Ausdruck ausgewertet wird. Wenn der erste Ausdruck fehlschlägt, wird der zweite nicht einmal ausgewertet, denn damit && wahr ist, müssen beide Ausdrücke wahr sein.Wenn der erste bereits fehlschlägt && ist immer falsch ->&& ist schneller als & und mehr "inteligent"

Verwandte Themen