2 votes

Doute sur l'utilisation de *++p dans printf

int main(){
    int a[3]={1,10,20};
    int *p=a;
    printf("%d %d " ,*++p,*p);
    return 0;
}

La sortie du code ci-dessus est 10 1 sur un compilateur gcc.

Je comprends que *++p incrémente p et déréférence la nouvelle valeur. Mais puisque p a été incrémenté, pourquoi *p renvoie-t-il 1 au lieu de 10 ?

7voto

nightcracker Points 34498

L'ordre dans lequel les expressions des arguments de la fonction sont évaluées n'est pas spécifié. Certains compilateurs peuvent utiliser l'ordre de gauche à droite, d'autres de droite à gauche, et d'autres encore peuvent utiliser un ordre d'évaluation différent en fonction de la situation pour l'optimisation. Ainsi, dans votre cas *p est évalué avant *++p ce qui donne lieu à votre "sortie bizarre".

2voto

Jim Lewis Points 18753

La virgule entre *++p y *p fait pas dénote une point de séquence donc c'est indéfini comportement non spécifié. Le compilateur est libre de évaluer *p avant *++p .

0voto

secmask Points 2529

Comportement non défini, la sortie peut varier selon le compilateur.

0voto

Jonathan Wood Points 26443

Apparemment, vos arguments sont évalués dans l'ordre inverse (du dernier au premier). *p est évalué en premier et renvoie 1 .

Comme d'autres l'ont souligné, la norme ne dicte pas l'ordre dans lequel les arguments sont évalués et ce comportement peut donc être identique ou non avec d'autres compilateurs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X