Frage

Wir bekommen in unnötige Codierung Argumente bei meiner Arbeit all-the-Zeit. Heute habe ich gefragt, ob bedingte AND (&&) oder OR (||) hatten eine höhere Priorität. Einer meiner Mitarbeiter bestand darauf, dass sie die gleiche Priorität hatte, hatte ich Zweifel, so dass ich es nachgeschlagen.

Laut MSDN AND (&&) hat eine höhere Priorität als OR (||). Aber können Sie beweisen, dass es zu einem skeptischen Mitarbeiter?

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

Also meine Frage ist, wie Sie mit dem Code beweisen, dass AND (&&) eine höhere Priorität, dass OR (||)? Wenn Ihre Antwort ist es egal, warum dann ist es auf diese Weise in der Sprache eingebaut?

War es hilfreich?

Lösung

Ändern Sie den ersten false wahr. Ich weiß, es ist dumm zu haben scheint (true || true), aber es beweist Ihren Punkt.

bool result = true || true && false;   // --> true 
     result = (true || true) && false; // --> false
     result = true || (true && false); // --> true

Andere Tipps

Wenn Sie wirklich wollen, dass er versucht ausflippen:

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:

True
False
False
-----
False

Edit:

Als Reaktion auf den Kommentar:

In C # ist | ein logischer Operator, führt die gleiche Boolesche Logik wie ||, aber nicht kurzschließen. Auch in C #, die | Operator hat eine höhere Priorität als die beiden || und &&.

Durch die Werte auszudrucken, können Sie sehen, dass, wenn ich den typischen || Operator verwendet wird, wird nur die erste True gedruckt werden würde. - durch das Ergebnis des Ausdrucks an, der True gewesen wäre, auch

Aber wegen der höheren Priorität von | wird die true | false zuerst ausgewertet (was true) und und das Ergebnis wird &&ed mit false zu Ausbeute false.

Ich habe nicht versucht, die Reihenfolge der Auswertung zu zeigen, sondern nur die Tatsache, dass die rechte Hälfte der | Zeit wurde bewertet, wenn es normalerweise nicht sein:)

würde dies Sie nicht bekommen, was Sie wollen? Oder vielleicht bin ich etwas fehlt ...

bool result = true || false && false;

Sie beweisen, dass es nicht mit dem Code, sondern mit Logik. UND ist boolean Multiplikation während OR boolean Addition ist. Nun, die man hat eine höhere Priorität?

false || wahr && true

Die Ausbeuten: true

false && wahr || true

Die Ausbeuten: true

Sie können nicht nur zeigen, das Endergebnis, wenn der Boolesche Ausdrücke werden kurzgeschlossen werden. Hier ist ein Ausschnitt, der Ihren Fall absetzt.

Es stützt sich auf die Implementierung & und | Betreiber von && verwendet und ||, wie angegeben in MSDN 7.11 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 soll, dass && zeigt zunächst vor ausgewertet ||.

True & False
False | False
-----
False

Für mehr Spaß, versuchen Sie es mit result = t || t && f und sehen, was mit Kurzschlüssen geschieht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top