web-dev-qa-db-fra.com

C # conditionnel AND (&&) OR (||) priorité

Nous entrons constamment dans des arguments de codage inutiles dans mon travail. Aujourd'hui, j'ai demandé si la conditionnelle AND (&&) ou OR (||) avait une priorité plus élevée. Un de mes collègues a insisté sur le fait qu'ils avaient la même priorité, j'avais des doutes, alors j'ai recherché.

Selon MSDN AND (&&) a une priorité plus élevée que OR (||). Mais, pouvez-vous le prouver à un collègue sceptique?

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

Donc, ma question est de savoir comment prouver avec du code que AND (&&) a une priorité plus élevée que OR (||)? Si votre réponse est que cela n'a pas d'importance, alors pourquoi est-il construit de cette façon dans la langue?

68
Josiah Ruddell

Changez le premier faux par vrai. Je sais que cela semble stupide (vrai || vrai) mais cela prouve votre point.

bool result = true || true && false;   // --> true 
     result = (true || true) && false; // --> false
     result = true || (true && false); // --> true
105
Francis B.

Si vous voulez vraiment lui faire peur, essayez:

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

Cela imprimera:

True
False
False
-----
False

Modifier:

En réponse au commentaire:

En C #, | est un opérateur logique qui exécute la même logique booléenne que ||, mais ne court-circuite pas. Toujours en C #, le | L'opérateur a une priorité plus élevée que les deux || et &&.

En imprimant les valeurs, vous pouvez voir que si j'utilise le ||, seul le premier True sera imprimé - suivi du résultat de l'expression qui aurait été True également.

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

Je n'essayais pas de montrer l'ordre d'évaluation, juste le fait que la moitié droite du | a été évalué comme il ne le serait normalement pas :)

10
John Rasch

Cela ne vous donnerait-il pas ce que vous recherchez? Ou peut-être que je manque quelque chose ...

bool result = true || false && false;
6
Max Schmeling

Vous ne le prouvez pas avec du code mais avec de la logique. ET est une multiplication booléenne alors que OR est une addition booléenne. Maintenant, lequel a la priorité la plus élevée?

5
EFraim

faux || vrai vrai

Rendements: vrais

false && true || vrai

Rendements: vrais

0
veggerby