Le code ci-dessous affiche des résultats différents lorsqu'il est compilé et exécuté sur Code :: Blocks.Requête du débutant sur le programme C Fonction Pile d'appel, point de séquence (séquencement)
void sum(int a,int b){
printf("a=%d b=%d\n",a,b);
}
int main(){
int i=1;
sum(i=5,++i);
printf("i=%d\n\n",i);
/***********************/
i=2;
sum(i=5,i++);
printf("i=%d\n\n",i);
/**********************/
i=3;
sum(i=5,i);
printf("i=%d\n\n",i);
return 0;
}
Sortie:
a=5 b=5
i=5
a=5 b=2
i=5
a=5 b=5
i=5
Je pense que la réponse à cette question est liée au point de séquence et le point de séquence est liée à ++ opérateur ici. GCC doit suivre un ordre pour passer la valeur à empiler dans un ordre fixe mais à cause de ++ les réponses sont différentes. Je pense que pour un débutant d'écrire un appel de fonction comme celui-ci n'est pas très commun, mais la leçon sur les opérateurs est générale afin que l'on peut essayer.
Mes questions sont, quelle devrait être la réponse exacte et des questions comme celle-ci? Au cours de quelle phase de compilation ces choses sont-elles décidées (claires ou non claires)? Quel algorithme (s) particulier (soit pour l'optimisation ou en général) est impliqué? Est-ce que le même compilateur peut fournir un résultat différent pour une telle expression ou des déclarations? Et le dernier est, comment un débutant va comprendre et comprendre ces problèmes? C'est parfois très surprenant.
Copie possible de [Pourquoi ces constructions (utilisant ++) undefined behavior?] (Http://stackoverflow.com/questions/949433/why-are-these-constructs-using-undefined-behavior) – Olaf
La virgule dans 'sum (i = 5, ++ i);' n'est pas un point de séquence, il sépare les arguments de la fonction. La leçon est, si vous voulez utiliser différentes valeurs dérivées d'une seule variable, utilisez par exemple 'sum (i + 5, i + 1)' et mettez à jour 'i' par la suite. Ou dans ce cas, simplement 'sum (5, i + 1)'. En dehors de toute autre chose, on ne sait pas ce que vous entendez par la valeur finale de «je». Était-ce «5» ou «6» ou «2»? –
oui c'est la meilleure façon d'écrire. – skyconfusion