Bei meiner Arbeit geraten wir ständig in unnötige Codierungsargumente. Heute habe ich gefragt, ob bedingtes UND (&&) oder ODER (||) eine höhere Priorität haben. Einer meiner Mitarbeiter bestand darauf, dass sie den gleichen Vorrang hatten, ich hatte Zweifel, also habe ich nachgeschlagen.
Laut MSDN hat AND (&&) eine höhere Priorität als OR (||). Aber können Sie es einem skeptischen Mitarbeiter beweisen?
http://msdn.microsoft.com/en-us/library/aa691323(VS.71).aspx
bool result = false || true && false; // --> false
// is the same result as
bool result = (false || true) && false; // --> false
// even though I know that the first statement is evaluated as
bool result = false || (true && false); // --> false
Meine Frage ist also, wie Sie mit Code beweisen, dass AND (&&) eine höhere Priorität hat als OR (||)? Wenn Ihre Antwort lautet, dass es keine Rolle spielt, warum ist es dann so in der Sprache aufgebaut?
c#
conditional
conditional-operator
operator-precedence
associativity
Josiah Ruddell
quelle
quelle
Antworten:
Ändern Sie das erste false durch true. Ich weiß, es scheint dumm zu sein (wahr || wahr), aber es beweist Ihren Standpunkt.
bool result = true || true && false; // --> true result = (true || true) && false; // --> false result = true || (true && false); // --> true
quelle
true | (false & false)
. Dies würde wahr , weil bewertetfalse & false = false
, dannfalse | true = true
. Die | Der Operator hat eine höhere Priorität als der Operator &&, daher würde sich der zweite Ausdruck wie folgt verhalten(true | false) && false
. Dies würde bewerten zu falsch , weiltrue | false = true
danntrue && false = false
.Wenn Sie ihn wirklich ausflippen wollen, versuchen Sie:
bool result = True() | False() && False(); Console.WriteLine("-----"); Console.WriteLine(result); static bool True() { Console.WriteLine(true); return true; } static bool False() { Console.WriteLine(false); return false; }
Dies wird gedruckt:
Bearbeiten:
Als Antwort auf den Kommentar:
In C #
|
ist ein logischer Operator, der dieselbe boolesche Logik wie ausführt||
, jedoch keinen Kurzschluss verursacht. Auch in C # hat der|
Operator eine höhere Priorität als beide||
und&&
.Wenn Sie die Werte ausdrucken , können Sie sehen, dass bei Verwendung des typischen
||
Operators nur der ersteTrue
gedruckt wird - gefolgt vom Ergebnis des Ausdrucks, der auch gewesen wäreTrue
.Aber wegen des höheren Vorrangs
|
, dastrue | false
ausgewertet wird zuerst (wastrue
) und dann das Ergebnis&&
mit edfalse
auf Ertragfalse
.Ich habe nicht versucht, die Reihenfolge der Bewertung anzuzeigen, sondern nur die Tatsache, dass die rechte Hälfte des
|
Bewertungszeitraums bewertet wurde, in dem dies normalerweise nicht der Fall wäre :)quelle
||
um|
das und zu verlassen&&
, das Ergebnis des Ausdrucks ändert sich von wahr zu falsch? Normalerweise würden Sie also entweder|
zusammen mit&
oder||
zusammen mit verwenden&&
.Würde dir das nicht das bringen, wonach du suchst? Oder vielleicht fehlt mir etwas ...
bool result = true || false && false;
quelle
Sie beweisen es nicht mit Code, sondern mit Logik. AND ist eine boolesche Multiplikation, während OR eine boolesche Addition ist. Welches hat nun einen höheren Vorrang?
quelle
false || Wahr, wahr
Erträge: wahr
false && true || wahr
Erträge: wahr
quelle
true || true && false
(die auch true zurückgibt) kann nur dann wahr sein, wenn && zuerst ausgewertet wird.Sie können das Endergebnis nicht einfach anzeigen, wenn Ihre booleschen Ausdrücke kurzgeschlossen werden. Hier ist ein Ausschnitt, der Ihren Fall regelt.
Es basiert auf der Implementierung von & und | Von && und || verwendete Operatoren, wie in MSDN 7.11 angegeben. Bedingte logische Operatoren
public static void Test() { B t = new B(true); B f = new B(false); B result = f || t && f; Console.WriteLine("-----"); Console.WriteLine(result); } public class B { bool val; public B(bool val) { this.val = val; } public static bool operator true(B b) { return b.val; } public static bool operator false(B b) { return !b.val; } public static B operator &(B lhs, B rhs) { Console.WriteLine(lhs.ToString() + " & " + rhs.ToString()); return new B(lhs.val & rhs.val); } public static B operator |(B lhs, B rhs) { Console.WriteLine(lhs.ToString() + " | " + rhs.ToString()); return new B(lhs.val | rhs.val); } public override string ToString() { return val.ToString(); } }
Die Ausgabe sollte zeigen, dass && zuerst vor || ausgewertet wird.
Versuchen Sie es für zusätzlichen Spaß mit result = t || t && f und sehen, was mit Kurzschluss passiert.
quelle