C # ET conditionnelle (&&) OR (||) priorité
-
20-09-2019 - |
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?
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.