C Language Expressions indéterminées


Exemple

Les appels de fonction comme f(a) impliquent toujours un point de séquence entre l'évaluation des arguments et l'indicatif (ici f et a ) et l'appel réel. Si deux appels de ce type ne sont pas séquencés, les deux appels de fonction sont indéfiniment séquencés, c'est-à-dire que l'un est exécuté avant l'autre et que l'ordre n'est pas spécifié.

unsigned counter = 0;

unsingned account(void) {
   return counter++;
}

int main(void) {
   printf("the order is %u %u\n", account(), account());
}

Cette double modification implicite du counter lors de l'évaluation des arguments printf est valide, nous ne savons tout simplement pas lequel des appels vient en premier. Comme la commande n'est pas spécifiée, elle peut varier et ne peut pas être utilisée. L'impression pourrait donc être:

la commande est 0 1

ou

la commande est 1 0

La déclaration analogue à ce qui précède sans appel de fonction intermédiaire

   printf("the order is %u %u\n", counter++, counter++); // undefined behavior

a un comportement indéfini car il n'y a pas de point de séquence entre les deux modifications du counter .