80 votes

Concept de post-incrément et de pré-incrément ?

Je ne comprends pas le concept d'incrémentation ou de décrémentation du postfixe et du préfixe. Quelqu'un peut-il donner une meilleure explication ?

2 votes

0 votes

Ou peut-être Incrémentation en C++ - Quand utiliser x++ ou ++x ? (ou, très probablement, des dizaines d'autres)

0 votes

Si vous comprenez l'hindi :), cela s'explique très clairement. youtube.com/watch?v=yRt-zYFJIvE

134voto

Cheers and hth. - Alf Points 59647

Les quatre réponses jusqu'à présent sont incorrect dans la mesure où ils affirment un ordre spécifique des événements.

Croire à cette "légende urbaine" a égaré plus d'un novice (et professionnel), à savoir le flot sans fin de questions sur le comportement indéfini des expressions.

Donc.

Pour l'opérateur préfixe intégré C++,

++x

incréments x et produit (comme résultat de l'expression) x en tant que valeur l, tandis que

x++

incréments x et produit (comme résultat de l'expression) la valeur originale de x .

En particulier, pour x++ il n'y a pas pas de commande de temps impliqué pour l'augmentation et la production de la valeur originale de x . Le compilateur est libre d'émettre du code machine qui produit la valeur originale de x Par exemple, il peut être présent dans un registre, ce qui retarde l'incrémentation jusqu'à la fin de l'expression (point de séquence suivant).

Les personnes qui croient à tort que l'incrément doit venir en premier, et elles sont nombreuses, en concluent souvent que certaines expressions doivent avoir un effet bien défini, alors qu'elles ont en fait un comportement indéfini.

10 votes

@Sa'me Smd : "lvalue" est essentiellement une référence à un objet qui dispose d'un stockage. C'est une terminologie qui provient des débuts du C, où une affectation avait besoin d'une lvalue sur le serveur. gauche côté.

0 votes

Hm, j'ai fait une gaffe dans le dernier paragraphe. Je le modifierai plus tard. C'est complexe, donc il faut aussi des citations standard et des exemples concrets. Désolé...

0 votes

Le premier est un incrément préfixe, pas un incrément postfixe.

29voto

sje397 Points 23619
int i, x;

i = 2;
x = ++i;
// now i = 3, x = 3

i = 2;
x = i++; 
// now i = 3, x = 2

Post" signifie "après", c'est-à-dire que l'incrémentation est effectuée après la lecture de la variable. Pre' signifie avant - c'est-à-dire que la valeur de la variable est d'abord incrémentée, puis utilisée dans l'expression.

0 votes

"l'incrémentation est faite après la lecture de la variable". J'avais l'habitude de penser que je comprenais le post et le préfixe d'incrémentation, mais maintenant tu as moi confus !

0 votes

Pourquoi est-ce que ça prête à confusion ? Nous parlons de la concept de l'incrément "pré" et "post". Ces préfixes signifient antes de y après .

7 votes

Les termes "pre" et "post" dans "preincrement" et "postincrement" font référence à la position de l'opérateur par rapport à l'opérande. Ils n'impliquent aucun ordre temporel entre le moment où l'incrément se produit et le moment où la variable est lue.

20voto

wilhelmtell Points 25504

La différence entre le postfix incrément, x++ et le préfixe incrément, ++x est précisément dans comment les deux opérateurs évaluent leurs opérandes. L'incrément postfixe copie conceptuellement l'opérande en mémoire, incrémente l'opérande original et finalement donne la valeur de la copie. Je pense que la meilleure façon d'illustrer cela est d'implémenter l'opérateur dans le code :

int operator ++ (int& n)  // postfix increment
{
    int tmp = n;
    n = n + 1;
    return tmp;
}

Le code ci-dessus ne compilera pas car vous ne pouvez pas redéfinir les opérateurs pour les types primitifs. Le compilateur ne peut pas non plus dire qu'ici nous définissons un opérateur postfix plutôt que l'opérateur préfixe mais faisons comme si c'était un C++ correct et valide. Vous pouvez voir que l'opérateur postfixe agit effectivement sur son opérande, mais il renvoie l'ancienne valeur avant l'incrémentation, donc le résultat de l'expression x++ est la valeur avant l'incrément. x Cependant, est incrémenté.

Le préfixe d'incrémentation incrémente également son opérande, mais il donne la valeur de l'opérande après l'incrément :

int& operator ++ (int& n)
{
    n = n + 1;
    return n;
}

Cela signifie que l'expression ++x est évalué à la valeur de x après l'incrément.

Il est facile de penser que l'expression ++x est donc équivalent à l'assignmnet (x=x+1) . Toutefois, ce n'est pas exactement le cas, car une incrémenter est une opération qui peut signifier différentes choses dans différents contextes. Dans le cas d'un simple entier primitif, en effet ++x est substituable à (x=x+1) . Mais dans le cas d'un type de classe, tel qu'un itérateur d'une liste chaînée, un incrément de préfixe de l'itérateur ne signifie certainement pas "ajouter un à l'objet".

17voto

mathewbruens Points 21

Personne n'a répondu à la question : Pourquoi ce concept est-il déroutant ?

En tant qu'étudiant en informatique, il m'a fallu du temps pour comprendre ceci à cause de la façon dont je lis le code.

Ce qui suit n'est pas correct !


x = y++

X est égal à y poste incrément. Ce qui semble logiquement signifier que X est égal à la valeur de Y. après l'opération d'incrémentation est effectuée. Poste signification après .

o

x = ++y
X est égal à y pré -incrément. Ce qui semble logiquement signifier que X est égal à la valeur de Y. antes de l'opération d'incrémentation est effectuée. Pré signification antes de .


En fait, c'est le contraire qui se produit. Ce concept est déroutant car le langage utilisé est trompeur. Dans ce cas, nous ne pouvons pas utiliser les mots pour définir le comportement.
x=++y est en fait lu comme X est égal à la valeur de Y après l'incrément.
x=y++ est en fait lu comme X est égal à la valeur de Y antes de l'incrément.

Les mots pre et post sont en arrière par rapport à la sémantique de l'anglais . Ils signifient seulement où se trouve le ++ par rapport au Y. Rien de plus.

Personnellement, si j'avais le choix, j'échangerais les significations de ++y et y++. C'est juste un exemple d'idiome que j'ai dû apprendre.

S'il y a une méthode à cette folie, j'aimerais la connaître en termes simples.

Merci de votre lecture.

18 votes

"S'il y a une méthode à cette folie, j'aimerais le savoir en termes simples." - Je vois ça comme ça : Incrémentation PRE (y=++x) : incrémenter x d'abord PUIS affecter à y. Et pour l'incrémentation POST (y=x++) : Assignez à y PUIS incrémentez x. Pensez donc à pre & post comme "quand x est incrémenté" plutôt que "quelle version de x obtient y". C'est ma "méthode de la folie" et c'est parfaitement logique, IMO ;-)

0 votes

"S'il y a une méthode à cette folie, j'aimerais le savoir en termes simples." Bien sûr qu'il y en a une. pré L'incrément signifie "l'opérateur vient pré alias. antes de l'opérande, donc l'incrément vient antes de l'opérande est retourné à l'appelant, donc la valeur qu'il obtient inclut l'incrément.' poste L'incrément signifie "l'opérateur vient poste alias. après l'opérande, donc l'incrément vient après (une copie) de l'opérande est retournée à l'appelant, de sorte que la valeur qu'il obtient n'inclut pas l'incrément'.

0 votes

++y est préincrémenté car le ++ est utilisé comme préfixe, y++ est postincrémenté car ++ est utilisé comme postfixe (ou "suffixe"). Pas du tout contraire à la langue anglaise.

8voto

Jonathan Wood Points 26443

C'est assez simple. Les deux vont incrémenter la valeur d'une variable. Les deux lignes suivantes sont égales :

x++;
++x;

La différence réside dans le fait que vous utilisez la valeur d'une variable qui est incrémentée :

x = y++;
x = ++y;

Ici, les deux lignes incrémentent la valeur de y de un. Cependant, la première affecte la valeur de y avant l'incrément à x, et la seconde affecte la valeur de y après l'incrément à x.

Il n'y a donc une différence que lorsque l'incrément est également utilisé comme une expression. Le post-incrément incrémente après avoir retourné la valeur. Le pré-incrément s'incrémente avant.

4 votes

Les deux lignes ne sont pas du tout égales. -1

7 votes

Wilhemtell : Merci de n'avoir absolument rien ajouté à la discussion. Bon travail.

1 votes

@JonathanWood quel est le type de x ? Voilà, c'est fait. Les deux lignes ne sont pas égales. Est-ce que j'ajoute quelque chose à la discussion maintenant ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X