Renvoyer une variable en utilisant un post incrément en C

J’ai une variable globale appelée var et une fonction foo . (Je sais que c’est une mauvaise pratique mais que c’est parfois inévitable) Je me demande si le standard C (que je comstack avec c99) indique ce qu’il advient de var si j’essaie d’exécuter:

 long foo(){ return var++; } 

Merci.

Réponse courte:

Il retournera une copie de var et incrémentera immédiatement après la variable globale.

Longue réponse:

C11 6.5.2.4

“Le résultat de l’opérateur postfix ++ est la valeur de l’opérande. En tant qu’effet secondaire, la valeur de l’object opérande est incrémentée ..”. / – / Le calcul de la valeur du résultat est séquencé avant l’effet secondaire de la mise à jour de la valeur stockée de l’opérande.

La norme 5.1.2.3 “Exécution du programme” spécifie que tous les effets secondaires doivent avoir été évalués avant que le programme ne rencontre un sharepoint séquence . (Vous trouverez ici beaucoup de points de séquence environ).

Il y a un sharepoint séquence après une déclaration de return (C11 6.8 / 4).

Cela signifie que l’expression var++ est garantie d’être complètement évaluée avant tout code dans main ().

Votre code machine ressemblera à ce pseudo code:

  • Stocker une copie locale de var sur la stack (ou dans un registre, etc.)
  • Augmentez la variable globale avec 1.
  • Retour de sous routine.
  • Utilisez “copy-of- var “.

Si vous aviez utilisé l’incrément de préfixe à la place, l’opération d’augmentation aurait été séquencée avant le stockage de la copie.

Comme var++ est une post-incrémentation, sa structure est la suivante:

 long foo(){ long tmp = var; var++; return tmp; } 

Si vous utilisez plutôt ++var , il renverra la valeur incrémentée (car il incrémentera la variable avant de renvoyer sa valeur).

foo() retournera la valeur courante de var , et var augmenté.