Le code suivant m'a confondu un bit: Il s'agit d'une implémentation supprimée de la fonction J'aimerais que quelqu'un explique la première itération de la boucle tandis. p> p> Strcpy code>. À partir de ce code, nous voyons que le pointeur
p code> et
q code> sont incrémentés puis déérique et
q code> est attribué à
p code> jusqu'à ce que Le
\ 0 code> Char a été atteint. P>
8 Réponses :
Parce que le ++ code> est après les variables, ils ne sont pas incrémentés jusqu'à ce que après em> l'expression est évaluée. C'est pourquoi c'est l'opérateur post-incrément; Le pré-augmentation est préfixé (
++ p code>).
* ++ p code> écrirait sur la deuxième spot,
* p ++ code> écrit au premier. p>
Le côté droit de l'expression (* Q ++) sera évalué avant * p ++, et les deux ne seront incrémentés qu'après que l'affectation a lieu.
Lisez la déclaration à gauche et rappelez-vous post-incraction (Q ++ Au lieu de ++ Q) arrive après que tout ce qui soit dans la ligne soit résolu. p> incrément à la fois. p> fais cela jusqu'à ce que qp prenant q's element = 0 qui est quand il atteint le terminateur nul. p> p>
Votre raisonnement aurait été correct Si le Dans ce cas, l'incrément se produirait avant la déséroférance. P> P> p ++ code> est post-incrémentation du pointeur
p code>. Donc la valeur actuelle de
p code> est utilisée par l'opérateur de déférence
* code> avant
p code> est incrémenté.
pendant code> est écrit comme suit: p>
Non, l'incrément se produit après l'affectation. P>
S'il était * (++ p) code>, le pointeur
p code> serait incrémenté et après cela assigné. P>
Ceci est une implémentation dépouillée de la fonction Strcpy. À partir de ce code, nous voyons que le pointeur P et Q sont flous, que la perférencée et Q est affectée à P jusqu'à ce que le caractère \ 0 ait été atteint. p> blockQuote>
Cela arrive dans l'inverse. La valeur au
* p code> est définie sur
* q code>, puis les deux pointeurs sont incrémentés. p>
Lorsque vous avez
int foo = bar ++ code> L'incrément se produit après la définition de FOO. Pour que cela se produise, vous feriez d'abord
int foo = ++ bar code> p>
@Marlon, pourquoi avez-vous édité mon message? Vous avez inversé le sens, ce qui est incorrect. * P est défini sur * Q, pas l'inverse, à moins d'avoir un pet cérébral complet et de manquer quelque chose.
La valeur de q ++ code> est q
La valeur de ++ q code> est
q + 1 code> p>
Le pendant que code> La condition de la boucle est effectué après l'incrément. Équivalent:
Pas tout à fait vrai, parce que votre temps (* p) regarde le caractère suivant, pas celui qui vient de copier.
Les expressions Le résultat em> de l'expression le résultat em> de l'expression Notez que le côté L'effet ne doit pas nécessairement être appliqué immédiatement après l'évaluation de l'expression; Il suffit d'être appliqué avant le point de séquence suivant. Par exemple, étant donné le code p> il n'y a aucune garantie que le contenu de Il est important de vous rappeler que le comportement des expressions comme Les opérateurs postfix ont une priorité plus élevée que les opérateurs unaires, les expressions telles que Notez que l'opérande aux opérateurs AutooinCrementation / décrémentation doit être un lvalue em> (essentiellement une expression qui fait référence à un emplacement de mémoire de sorte que la mémoire puisse être lue. ou modifié). Le résultat de l'expression x ++ code> et
++ x code> ont à la fois un résultat em> (valeur) et un effet secondaire em>.
x ++ code> est la valeur actuelle de
x code>. L'effet secondaire em> est que le contenu de
x code> est incrémenté par 1. p>
de l'expression
++ x code> est la valeur actuelle de
x code> plus 1. L'effet latéral em> est identique que ci-dessus. p>
x code> sera modifié avant l'expression
y ++ code> est évalué, ou même avant le résultat de
++ x + y ++ code> est attribué à
z code> (ni le
= code> ni
+ Code> Les opérateurs introduisent un point de séquence). L'expression em>
++ x code> est évaluée à 2, mais il est possible que la variable
x code> ne peut pas contenir la valeur 2 jusqu'à après
z < / code> a été attribué. p>
x ++ + x ++ code> est explicitement em> non défini par la norme de langue; Il n'y a pas de moyen (bon) de prédire ce que le résultat de l'expression sera ou quelle valeur
x code> contiendra après avoir été évaluée. p>
* p ++ code> sont analysées comme
* (p ++) code> (c.-à-d. L'opérateur
* code> à la suite de l'expression
p ++ code>). Encore une fois, le résultat de l'expression
p ++ code> est la valeur actuelle de
p code>, donc
tandis que (* p ++ = * q ++); code> ne saute pas Le premier élément. p>
x ++ code> ou
++ x code> est pas em> un lvalue, vous ne pouvez donc pas écrire des choses comme
++ x ++ code> ou
(x ++) ++ code> ou
++ (++ x) code>. Vous pourrait em> écrire quelque chose comme
++ (* p ++) code> (
p ++ code> n'est pas un lvalue, mais
* p ++ code> est ), bien que cela vous ferait probablement gifler par quiconque lisant votre code. p> p>
Vos définitions de Post / Pre Semblaient être en arrière. Post = après, avant avant. La post-augmentation montre ici que le premier caractère sera copié, puis le pointeur sera incrémenté.
Pourquoi la balise C ++ (et le titre)? Ceci est une fonction de bibliothèque C.
Ressemble à un code C ++ parfaitement valide pour moi, @Paul. Alors pourquoi pas i> la balise C ++?
Dupliqué possible de Comment l'attribution du pointeur dans Strcpy fonctionne-t-elle?
@ROB: Eh bien c'est parfaitement valide Code de l'objectif-C B> aussi - peut-être qu'il devrait être étiqueté comme
objectif-c code> alors?
@DAVITA: Pas tout à fait - cela dit toujours "C ++" dans le titre.