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++;
}
3 Réponses :
foo () code> retournera la valeur actuelle de
var code> et
var code> augmente. P>
comme si vous utilisez var ++ code> est un post-incrément, c'est fondamentalement quelque chose comme ceci:
++ var code> , il retournera la valeur incrémentée (car elle augmentera la variable avant em> renvoyer sa valeur). P> P>
Réponse courte: P>
Il retournera une copie de longue réponse: p>
C11 6.5.2.4 P>
"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. P>
blockQuote>
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 em>. (Beaucoup d'informations sur les points de séquence peuvent être trouvés ici ). P>
Il y a un point de séquence après une instruction code> code> (C11 6.8 / 4). P>
Cela signifie que l'expression Votre code de machine ressemblera à ce pseudo code: p>
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. P> var code>, puis immédiatement après l'augmentation de l'incrément global
var code>. p>
var ++ code> est garantie à être complètement évaluée avant que n'importe quel code dans Main () continue. P>
var code> sur la pile (ou dans un registre, etc.) li>
var code> avec 1. li>
var code>". li>
ul>
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 code> (soit à lire) peut entraîner un comportement de programme inattendu.
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".