• [^] # Re: En vrac

    Posté par . En réponse au journal Pourquoi empaqueter KDE prend-il du temps ?. Évalué à 8.

    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 :

    int i = 4;
    f(i++,i++,i++);

    Le « triplet » de i peut être évalué comme f(4,5,6) (ou une combinaison différente de 4 5 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).

    Lire aussi ici, qui explique tous les tenants et aboutissants.