7
votes

Renvoyer une variable lors de l'utilisation d'une incrémentation postale en C

J'ai une variable globale appelée var code> et une fonction foo code>. (Je sais que c'est une mauvaise pratique, mais parfois c'est inévitable) Je me demande si la norme C (je compose à l'aide de C99) indique ce qui arrive à var code> si j'essaie d'exécuter:

long foo(){
    return var++;
}


4 commentaires

Son vieille valeur est renvoyée et la valeur incrémentée est stockée.


Oui. Il semble fonctionner comme prévu. Je ne suis tout simplement pas sûr que ce soit le droit de penser à juger par la norme.


C'est bien - aussi bien que les variables globales sont.


J'ai ajouté l'étiquette "Language-avocat" pour éviter que cette question soit fermée comme "trop ​​localisée".


3 Réponses :


2
votes

foo () retournera la valeur actuelle de var et var augmente.


0 commentaires

6
votes

comme var ++ est un post-incrément, c'est fondamentalement quelque chose comme ceci: xxx

si vous utilisez ++ var , il retournera la valeur incrémentée (car elle augmentera la variable avant renvoyer sa valeur).


0 commentaires

10
votes

Réponse courte:

Il retournera une copie de var , puis immédiatement après l'augmentation de l'incrément global var .

longue réponse:

C11 6.5.2.4

"Le résultat de l'opérateur Postfix ++ est la valeur de l'opérande. Comme Effet secondaire, la valeur de l'objet opératoire est incrémentée .. / - / - / Le calcul de la valeur du résultat est séquencé avant l'effet secondaire de Mise à jour de la valeur stockée de l'opérande.

L'étalon 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 point de séquence . (Beaucoup d'informations sur les points de séquence peuvent être trouvés ici ).

Il y a un point de séquence après une instruction (C11 6.8 / 4).

Cela signifie que l'expression var ++ est garantie à être complètement évaluée avant que n'importe quel code dans Main () continue.

Votre code de machine ressemblera à ce pseudo code:

  • Stockez une copie locale de var sur la pile (ou dans un registre, etc.)
  • Augmente le global var avec 1.
  • retour de sous-routine.
  • Utilisez "copie-de- var ".

    Avez-vous utilisé auparavant l'incrément de préfixe, l'augmentation de l'opération aurait été séquencée avant que la copie ne soit stockée.


1 commentaires

Il vaut peut-être la peine de mentionner que le "code de la machine" ci-dessus illustre pourquoi ++ sur une variable globale n'est pas en sécurité. Un coup de contexte entre "Copie de magasin" et "Augmentation" que Acesses var (soit à lire) peut entraîner un comportement de programme inattendu.