Comme vous le savez peut-être, C/C++ n'a pas spécifié l'ordre d'évaluation de l'expression. Quelles sont les raisons de les laisser indéfinies.Pourquoi C/C++ ne définit pas l'ordre d'évaluation de l'expression?
Répondre
Permet l'optimisation du compilateur. Un exemple serait le réordonnancement des instructions arithmétiques pour l'utilisation maximale des ALU ou la dissimulation de la latence de la mémoire avec des calculs.
L'un des objectifs de conception C/C++ est la mise en œuvre efficace pour les compléteurs. Les compilateurs ont donc assez de liberté pour choisir l'ordre d'évaluation de diverses sous-expressions dans une expression compliquée; cet ordre n'est pas contraint par la précédence de l'opérateur et l'associativité comme nous le pensons. Dans une telle situation lorsque nous modifions la même variable dans une sous-expression multiple, le comportement devient indéfini. Il n'est pas garanti qu'une opération d'incrémentation ou de décrémentation soit effectuée immédiatement après avoir donné la valeur précédente et avant que toute autre partie de l'expression soit évaluée. La seule garantie est que la mise à jour sera effectuée avant que l'expression soit considérée comme terminée.
Le fait de ne pas être défini signifie indéfini et tout peut arriver. Source: C programmig FAQ par Steve Summit
Je m'attends à de bonnes réponses Comme, pour un ordre d'évaluation de gauche à droite (ou autre), un compilateur peut générer un bloc de code d'assemblage (A86) optimisé à partir de certaines instructions (appel de fonction ou autre) et pour un ordre d'évaluation indéfini qu'un compilateur peut générer (B) bloc de code d'assemblage (x86). Il est également bon d'avoir une comparaison (par exemple, pourquoi (B) est plus rapide si c'est le cas) entre (A) et (B). De plus, quelle était la décision? De nombreuses techniques d'optimisation ne sont généralement pas implémentées (y compris l'ensemble des techniques spécifiques à la plate-forme) –
Vous voulez un exemple de code? Essayez divers programmes dans gcc! Cela dépend fortement du programme et des optimisations disponibles. Vous avez également répondu à votre dernière question par vous-même. Si vous corrigez l'ordre d'évaluation, aucune optimisation de réorganisation ne sera possible. – ebo
Pour certaines instructions, GCC peut uniquement générer le code (B) (de mon commentaire précédent) uniquement si GCC peut générer un code optimisé pour l'ordre d'évaluation de l'expression non définie. –