Question

Nous obtenons dans les arguments de codage inutiles à mon travail tout le temps. Aujourd'hui, j'ai demandé si elle est conditionnelle ET (&&) ou OR (||) a une priorité plus élevée. Un de mes collègues a insisté qu'ils avaient la même priorité, j'avais des doutes, donc je l'ai regardé vers le haut.

Selon MSDN ET (&&) a une priorité supérieure OR (||). Mais, pouvez-vous le prouver à un collègue de travail sceptique?

http://msdn.microsoft.com/en -us / bibliothèque / 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

Alors, ma question est de savoir comment prouvez-vous avec code ET (&&) a une priorité plus élevée que OR (||)? Si votre réponse est peu importe, alors pourquoi est-il construit de cette façon dans la langue?

Était-ce utile?

La solution

Modifier la première faux par vrai. Je sais que cela semble stupide d'avoir (vrai || vrai), mais il prouve votre point.

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

Autres conseils

Si vous voulez vraiment l'essayer paniquer:

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;
}

Cette impression volonté:

True
False
False
-----
False

Edit:

En réponse au commentaire:

C #, | est un opérateur logique qui effectue la même logique booléenne comme ||, mais ne pas court-circuit. De plus en C #, l'opérateur | a une priorité supérieure à la fois || et &&.

En imprimant les valeurs, vous pouvez voir que si je l'opérateur || typique, seule la première True serait imprimé -. Suivie par le résultat de l'expression qui aurait été True aussi

Mais en raison de la priorité la plus élevée de |, le true | false est évalué en premier (résultat true) et puis ce résultat est &&ed avec false pour obtenir false.

Je ne cherche pas à montrer l'ordre d'évaluation, juste le fait que la moitié droite de la | a été évaluée période quand il ne serait normalement pas:)

Ne serait-ce que vous obtenez ce que vous êtes après? Ou peut-être que je manque quelque chose ...

bool result = true || false && false;

Vous ne prouvez pas avec le code, mais avec la logique. ET est la multiplication booléennes alors que OU est plus booléenne. Maintenant que l'on a une priorité plus élevée?

false || vrai && true

Les rendements: true

false && vrai || true

Les rendements: true

Vous ne pouvez pas montrer le résultat final lorsque vos expressions booléennes sont court-circuiter. Voici un extrait qui se dépose votre cas.

Elle repose sur la mise en œuvre et et | opérateurs utilisés par && et ||, comme indiqué dans MSDN 7,11 opérateurs logiques conditionnels

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(); 
    }
}

La sortie doit montrer que && est évaluée avant ||.

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

Pour le plaisir supplémentaire, essayez avec un résultat = t || t && f et de voir ce qui se passe avec un court-circuit.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top