Question

En C #, est-il garanti que les expressions sont évaluées de gauche à droite?

Par exemple:

myClass = GetClass();  
if (myClass == null || myClass.Property > 0)  
    continue;

Existe-t-il des langues non conformes?

Était-ce utile?

La solution

Vous faites en réalité référence à une fonctionnalité de langage appelée "expressions de logique en court-circuit":

Cela signifie: si le résultat d’une expression logique ne peut plus changer, par ex. quand il est clair que l'expression sera évaluée à "vrai" ou " faux " quoi qu'il en soit, les parties restantes de l'expression ne seront pas évaluées.

Par exemple, C #, Java ou JavaScript le font et vous pouvez vous y fier dans ces langues (pour répondre à votre question).

Dans votre cas, si MyClass n'est pas null:

  • MyClass == null est évalué à false
  • puisqu'il s'agit d'un "ou" expression, la deuxième partie peut toujours changer le résultat, donc il est évalué
  • myClass.Property > 0 détermine le résultat final

si MyClass est null:

  • MyClass == null est évalué à true
  • puisqu'il s'agit d'un "ou" expression, peu importe ce qui suit
  • plus aucune évaluation n'est faite, le résultat final est vrai

Certaines langues ne court-circuitent pas les expressions logiques. VB classique en est un exemple, ici & my; myClass.Property > 0 " sera évalué et produira une erreur si MyClass est null (appelé "Nothing" dans VB).

Autres conseils

Le court-circuit est décrit dans la section 7.11 de la spécification C # 3.0:

  

L'opération x || y correspond à   l'opération x | y, sauf que y est   évalué seulement si x n'est pas vrai.

Alors oui, ça va.

En ce qui concerne les autres langues, je n’aime jamais parler pour toutes . Dans VB.NET, vous pouvez utiliser OrElse et AndAlso qui sont court-circuités, mais simples, Or et And ne le sont pas.

Mais faites attention:

si vous avez quelque chose comme

sprintf (buf, "% s% s", func1 (& var;), func2 (& var;));

avec effets latéraux sur var, il n’est pas défini (en C, je ne suis pas sûr que l’ordre d’évaluation soit défini dans d’autres langues), ordre dans lequel func1 () et func2 () sont exécutés (cela dépend, dans quel ordre (gauche ou droite) les arguments sont placés sur la pile et évalués à partir de là.

L'ordre d'évaluation dépend de l'opérateur, dans ce cas le booléen ou ( || ) est défini comme ce qui est communément appelé court-circuitement , pour créer de telles constructions.

Les opérateurs et / ou dans des langages tels que Ada, Visual Basic et Pascal ne court-circuite pas. Ils fournissent des opérateurs supplémentaires pour autoriser cette fonctionnalité, telle que "puis" et et " ou bien " à Ada.

Je ne suis pas sûr, êtes-vous vraiment intéressé par l'ordre ou par l'évaluation des courts-circuits?

Je ne suis pas sûr à 100%, mais pour autant que je sache, l'ordre d'évaluation sera toujours le même en C # (et je suppose que la plupart, sinon toutes les langues .net). L’évaluation des courts-circuits fonctionne comme expliqué dans les réponses précédentes.

Toutefois, en C #, vous pouvez choisir de ne pas court-circuiter à l'aide d'opérateurs simples (& amp; au lieu de & amp; & amp;). Normalement, vous souhaitez court-circuiter, mais vous pouvez éventuellement exécuter toutes les évaluations.

Python possède des opérateurs ou et et de court-circuit.

En Java et Haskell & amp; & amp; et || court-circuit également.

Côté intéressant: dans Haskell, cela vient naturellement avec le langage (vous pouvez définir vos propres opérateurs), alors que dans Java et C #, il est spécifique pour ces deux opérateurs.

En réalité, les courts-circuits font partie du processus, mais vous devez également savoir si le langage garantit une évaluation de gauche à droite de ceux-ci. Par exemple, C (ANSI, ISO, C99) NE GARANTIT PAS une évaluation de gauche à droite. Dans l'exemple de code, il serait possible de vérifier la valeur de Property avant de rechercher NULL ou de faire les deux simultanément ... La plupart des compilateurs ne le font pas, mais rien ne l'empêche de le faire et est totalement conforme à la spécification. Il vous dit même de NE PAS écrire un tel code pour cette raison.

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