2011-04-20 7 views
4

Si j'ai cette équation:Quelle est la signification de (true && false || true) en C#?

var x = (true && false || true) 

Est-ce équivalent à:

var x = ((true && false) || true) 

ou:

var x = (true && (false || true)) 

Et ce qui est la logique derrière tout cela?

+2

http://msdn.microsoft.com/fr-fr/library/aa691323(v=vs.71).aspx –

+0

http://msdn.microsoft.com/fr-fr/library/aa691323%28v= vs.71% 29.aspx voir ce lien pour donner la définition de Microsoft. – jimplode

Répondre

0

&& a priorisation supérieure, de sorte que la deuxième forme (des trois) est correcte. En ce qui concerne la logique, && a tendance à être associée vaguement à la multiplication, et || avec addition (si vous utilisez respectivement zéro et non nul pour représenter fausse et vraie, respectivement, les opérateurs ont une sémantique équivalente). Mais la plupart du temps c'est juste comme cela a été depuis C, et peut-être avant C.

3

Je crois qu'il est

var x = ((true && false) || true) 

... comme && a precedence selon MSDN.

On pourrait penser que quiconque a écrit cette ligne particulière de code aurait pu faire part de son intention en insérant la parenthèse au bon endroit. Faites une faveur à tous les autres et ajoutez-les.

0

Si vous utilisez dans cette expression || vrai que moyenne n'a pas d'importance sur d'autres résultats, il sera toujours vrai

+0

Dans le code réel, j'utilise des variables. J'ai substitué des valeurs statiques pour simplifier la question. – Entity

2

Il est équivalent à

var x = ((true && false) || true)

L'opérateur & & a une priorité plus élevée que le || opérateur.

Operator precedence MSDN documentation

+4

Votre instruction contient une erreur logique subtile. La priorité ne contrôle pas l'ordre dans lequel les sous-expressions sont évaluées. C'est-à-dire, quand vous dites A() + B() * C() ce n'est pas le cas que B() * C() est évalué avant A() juste parce que * est plus prioritaire que +. Au contraire, l'ordre d'évaluation est A(), puis B(), puis C(), puis la multiplication, puis l'addition. ** Les sous-expressions ** sont évaluées ** de gauche à droite **, fin de l'histoire. La préséance et l'associativité déterminent les sous-expressions. –

+0

@Eric: Oups - pas ce que je voulais dire/transmettre dans ce cas; Merci pour la correction. –

6

Dans la logique booléenne, « non » (!) est évaluée avant « et » (&&) et « et » est évaluée avant « ou » (||). En utilisant le double (&&) et le double (||), ces opérateurs court-circuitent, ce qui n'affecte pas le résultat logique, mais ne permet pas d'évaluer les termes du côté droit si nécessaire.

Ainsi

var x = (true && false || true) est évaluée à false|| true qui évalue à true

et

var x = ((true && false) || true) est évaluée à false || true qui évalue à true

et

var x = (true && (false || true)) évalue à true && true qui évalue à true

+3

Je pense (vrai && faux || vrai) évalue à faux || true comme && a la précédence, donc il est équivalent à ((true && false) || true). Quoi qu'il en soit, à la fin tout cela sera vrai. – rucsi

+0

Bonne prise! J'ai foiré en tapant là. –

0

& & a une priorité plus élevée que || afin que les deux premiers cas d'utilisation agissent exactement la même chose. Les accolades ont pas de sens ici, comme dans:

a * b + c = (a * b) + c

Vous pouvez contrôler la priorité et associativité avec des accolades. Ainsi, le troisième cas d'utilisation vérifie la condition OU, puis l'ET.

Questions connexes