Alors pour moi, l'ordre non spécifié des arguments ne veut pas dire que le compilateur a le droit de les évaluer en parallèle.
f(i++,i++,i++) est un comportement indéfini, et pas un comportement défini par l'implémentation. D'une part la norme du C (et aussi du C++ dans ce cas je crois bien) ne garantit rien sur l'ordre d'évaluation des arguments (contrairement à Java par exemple, qui garantit que l'évaluation des paramètres se fait de gauche à droite). D'autre part, comme le comportement est indéfini, l'évaluation de f(i++,i++,i++) peut renvoyer n'importe quoi qui arrange le compilateur pour ce qui est de la valeur passée de i. Ça signifie entre autres que pour le compilateur, n'importe quelle valeur de i convient, même des valeurs qui ne devraient « logiquement » pas exister. Imaginons le code suivant :
inti=4;f(i++,i++,i++);
Le « triplet » de i peut être évalué comme f(4,5,6) (ou une combinaison différente de 45 et 6) et i aura comme valeur finale 7. Mais il peut aussi se résoudre comme f(0,0,0). « Hein ? De quoi ? » Ben oui : le comportement est indéfini, et le compilateur peut faire ce qu'il veut. Et ce n'est pas forcément reproductible (un implémenteur de compilos un peu pervers pourrait décider d'affecter des valeurs aléatoires dans le cas de comportements indéfinis).
[^] # Re: En vrac
Posté par lasher . En réponse au journal Pourquoi empaqueter KDE prend-il du temps ?. Évalué à 8.
f(i++,i++,i++)est un comportement indéfini, et pas un comportement défini par l'implémentation. D'une part la norme du C (et aussi du C++ dans ce cas je crois bien) ne garantit rien sur l'ordre d'évaluation des arguments (contrairement à Java par exemple, qui garantit que l'évaluation des paramètres se fait de gauche à droite). D'autre part, comme le comportement est indéfini, l'évaluation def(i++,i++,i++)peut renvoyer n'importe quoi qui arrange le compilateur pour ce qui est de la valeur passée dei. Ça signifie entre autres que pour le compilateur, n'importe quelle valeur deiconvient, même des valeurs qui ne devraient « logiquement » pas exister. Imaginons le code suivant :Le « triplet » de
ipeut être évalué commef(4,5,6)(ou une combinaison différente de45et6) etiaura comme valeur finale7. Mais il peut aussi se résoudre commef(0,0,0). « Hein ? De quoi ? » Ben oui : le comportement est indéfini, et le compilateur peut faire ce qu'il veut. Et ce n'est pas forcément reproductible (un implémenteur de compilos un peu pervers pourrait décider d'affecter des valeurs aléatoires dans le cas de comportements indéfinis).Lire aussi ici, qui explique tous les tenants et aboutissants.