c évaluation des parameters de fonction et passage

J’ai un code qui est petit mais je ne pouvais pas comprendre pourquoi la sortie est comme ça.
C’est ici

#include  int f(int i, int j, int k); int main(int argc, char const *argv[]) { int a; printf("enter a\n"); scanf("%d",&a); f(a,a++,a++); printf("%d \n",a ); return 0; } int f(int i, int j, int k) { printf("function arguments \n"); printf("%d %d %d\n",i,j,k ); } 

entrée: 4
sortie: 6 5 4

La réponse acceptée dans la copie marquée est incorrecte.


 f(a,a++,a++); 

Provoque un comportement indéfini . Il essaie de modifier l’argument a sans sharepoint séquence intermédiaire. De plus, il est important de noter que l’ordre d’évaluation des arguments de la fonction est Non spécifié . Ça peut être:

  • De gauche à droite ou
  • De droite à gauche ou
  • N’importe quel ordre magique choisi par le compilateur.

Si vous utilisez GCC, vous pouvez utiliser l’indicateur d’avertissement -wsequence-point pour vous avertir de comportements non définis liés à un sharepoint séquence.


Dans GCC Si vous comstackz votre programme aux niveaux d’avertissement les plus ssortingcts, le compilateur vous donnera le diagnostic suivant:

prog.c: 10: 18: erreur: l’opération sur ‘a’ peut être indéfinie [-Werror = séquence-point]
prog.c: 10: 18: erreur: l’opération sur ‘a’ peut être indéfinie [-Werror = séquence-point]


Référence:

C99 Standard §6.5.2.2:
Para 10:

L’ordre d’évaluation du désignateur de fonction, des arguments réels et des sous-expressions dans les arguments réels n’est pas spécifié, mais il existe un sharepoint séquence avant l’appel réel.

Notez que la citation indique uniquement qu’il existe un sharepoint séquence avant l’appel de la fonction elle-même. Cela n’implique pas qu’il existe un sharepoint séquence entre l’évaluation des arguments de sous-expression.

f(a,a++,a++); semble être un comportement indéfini parce que:

Si un effet secondaire sur un object scalaire n’est pas séquencé par rapport à un effet secondaire différent sur le même object scalaire ou à un calcul de valeur utilisant la valeur du même object scalaire, le comportement est indéfini. S’il existe plusieurs classements autorisés des sous-expressions d’une expression, le comportement n’est pas défini si un tel effet secondaire non séquencé se produit dans l’un des classements.

Lorsque vous utilisez un comportement non défini, il n’y a pas d’exigences du standard C.