Donc tout va bien. Mais ma question est la suivante : Est-ce que c'est un comportement sur lequel on peut compter ? Est-on sûr, est-ce un standard ou quoi que ce soit ? Parce que si un jour je tombe sur un compilateur qui fait par exemple les tests à l'envers et que lors de l'écriture du code je compte sur le comportement inverse... ouch :)
Je pense en particulier à un code de fonction dans une classe qui testerai si la classe est initialisée et qui tenterai de l'initialiser si elle ne l'est pas :
DeAtHCrAsH
Messages postés2670Date d'inscriptionvendredi 25 janvier 2002StatutMembreDernière intervention 6 février 2013 5 nov. 2010 à 22:19
En fait je vois deux choses dans ta question.
1) Premiere chose :
Avec le code suivant :
int a = 2;
int b = 4;
int c = 6;
int d = a+b*c; // Ici d vaudra 26 car la multiplication est prioritaire sur l'addition
int e = (a+b)*c; // Ici e vaudra 36 car les parenthèses sont prioritaires
Conclusion : La regle apprit a l'école et aussi vrai en programmation
2) Deuxième chose :
Avec le code suivant:
if(x || y)
Rien ne garanti que le compilateur ne vas pas générer du code assembleur qui va d'abord évaluer y et ensuite x.
Malgré ca tout les compilo avec lesquels j'ai déjà travaillé, vont d'abord évaluer x et ensuite y.
Ils partent sur le principe ou il revient au programmeur d'organiser son code pour qu'il soit le plus performant possible.
Mais je répète cela n'est pas une généralité. Il se peut que demain tu tombes sur un compilo qui evaluera y et ensuite x, d'ou l'interet de bétonner ton code en y ajoutant des controles dès que tu sens que cela est nécéssaire.
DeAtHCrAsH
Messages postés2670Date d'inscriptionvendredi 25 janvier 2002StatutMembreDernière intervention 6 février 2013 5 nov. 2010 à 20:54
Concernant la suite, le bout de code suivant sera toujours vrai quelque soit le compilateur.
Si un compilo change l'ordre des instructions mets le direct a la poubelle!
Malgré cela meme si t'es instruction sont inversées, dans ta fonction Initialise() tu devrais toujours faire le test qui verifie si la classe n'est pas deja initialisée. Cela s'applique par mesure de sécurité, au cas ou la fonction serais appellée deux fois de suite par un codeur un peu fatigué.
Ainsi quelque soit l'ordre d'execution de la condition, elle ne posera jamais problème.
Shell
Vous n’avez pas trouvé la réponse que vous recherchez ?
La priorité (quel opérateur est appliqué avant, en l'absence de parenthèses explicite) et l'associativité (dans quel ordre sont traités les arguments des opérateurs ayant la même priorité) sont résumées dans la table suivante (par ordre décroissant de priorité - les opérateurs décrits dans un autre chapitre ont un lien dédié) :
Et dans le tableau :
|| binaire GD ou logique avec séquencement
Donc "associativité" gauche vers droite. Quelqu'un sait si ça vient de là ?
A moins que ça soit juste "par convention", ou dépendant du compilateur.