Question Quelle est la difference entre ++ i et i ++?


En C, quelle est la différence entre l'utilisation ++i et i++, et qui devrait être utilisé dans le bloc d'incrémentation d'un for boucle?


648
2017-08-24 05:19


origine


Réponses:


  • ++i augmentera la valeur de i, puis renvoyez la valeur incrémentée.

     i = 1;
     j = ++i;
     (i is 2, j is 2)
    
  • i++ augmentera la valeur de i, mais renvoie la valeur d'origine i tenu avant d'être incrémenté.

     i = 1;
     j = i++;
     (i is 2, j is 1)
    

Pour un for boucle, fonctionne. ++i semble plus commun, peut-être parce que c'est ce qui est utilisé dans K & R.

Dans tous les cas, suivez les instructions ++i plus de i++"et vous ne vous tromperez pas.

Il y a quelques commentaires concernant l'efficacité de ++i et i++. Dans tout compilateur non-étudiant-projet, il n'y aura pas de différence de performance. Vous pouvez vérifier cela en regardant le code généré, qui sera identique.

La question de l'efficacité est intéressante ... voici ma tentative de réponse: Y a-t-il une différence de performance entre i ++ et ++ i en C?

Comme Sur Freund notes, c'est différent pour un objet C ++, puisque operator++() est une fonction et le compilateur ne peut pas savoir optimiser la création d'un objet temporaire pour contenir la valeur intermédiaire.


815
2017-08-24 05:23



je ++ est connu comme Post-incrément tandis que ++ i est appelé Pré-incrément.

i++

i++ est post-incrément car il incrémente ivaleur de 1 après la fin de l'opération.

Permet de voir l'exemple suivant:

int i = 1, j;
j = i++;

Ici la valeur de j = 1 mais i = 2. Ici la valeur de i sera affecté à j d'abord, puis i sera incrémenté.

++i 

++i est pré-incrément car il incrémente ivaleur de 1 avant l'opération. Ça veut dire j = i; va exécuter après i++.

Permet de voir l'exemple suivant:

int i = 1, j;
j = ++i;

Ici la valeur de j = 2 mais i = 2. Ici la valeur de i sera affecté à j après le i  incrémentation de i. De même ++i sera exécuté avant j=i;.

Pour votre question qui devrait être utilisé dans le bloc d'incrémentation d'une boucle for? la réponse est, vous pouvez utiliser un .. n'a pas d'importance. Il va exécuter votre pour la même boucle non. de temps.

for(i=0; i<5; i++)
   printf("%d ",i);

Et

for(i=0; i<5; ++i)
   printf("%d ",i);

Les deux boucles produiront la même sortie. c'est à dire 0 1 2 3 4.

Cela importe seulement où vous l'utilisez.

for(i = 0; i<5;)
    printf("%d ",++i);

Dans ce cas, la sortie sera 1 2 3 4 5.


139
2018-03-28 05:54



S'il vous plaît ne vous inquiétez pas de "l'efficacité" (vitesse, vraiment) dont on est plus rapide. Nous avons des compilateurs ces jours-ci qui s'occupent de ces choses. Utilisez celui qui a du sens à utiliser, basé sur lequel montre plus clairement votre intention.


30
2017-09-20 05:06



++i incrémente la valeur, puis la renvoie.

i++ renvoie la valeur, puis l'incrémente.

C'est une différence subtile.

Pour une boucle for, utilisez ++i, comme c'est légèrement plus rapide. i++ va créer une copie supplémentaire qui vient d'être jetée.


25
2017-08-24 05:21



i ++: - Dans ce scénario, la valeur est d'abord affectée, puis l'incrément se produit.

++ i: - Dans ce scénario d'abord l'incrément est fait et ensuite la valeur est assignée

Ci-dessous la visualisation d'image et aussi voici une belle vidéo pratique ( http://www.youtube.com/watch?v=lrtcfgbUXm4) qui démontre la même chose.

enter image description here


17
2017-07-25 07:42



La raison ++i  pouvez être légèrement plus rapide que i++ est-ce i++ peut exiger une copie locale de la valeur de i avant qu'il ne soit incrémenté, tandis que ++i ne fait jamais. Dans certains cas, certains compilateurs l'optimiseront si possible ... mais ce n'est pas toujours possible, et tous les compilateurs ne le font pas.

J'essaie de ne pas trop compter sur les optimisations des compilateurs, alors je suis le conseil de Ryan Fox: quand je peux utiliser les deux, j'utilise ++i.


17
2017-08-24 06:00



Le résultat effectif de l'utilisation de l'un ou l'autre est identique. En d'autres termes, la boucle fera exactement la même chose dans les deux cas.

En termes d'efficacité, il pourrait y avoir une pénalité à choisir entre i ++ et ++ i. En termes de spécification de langage, l'opérateur post-incrément doit créer une copie supplémentaire de la valeur sur laquelle l'opérateur agit. Cela pourrait être une source d'opérations supplémentaires.

Cependant, vous devriez considérer deux problèmes principaux avec la logique précédente.

  1. Les compilateurs modernes sont géniaux. Tous les bons compilateurs sont assez intelligents pour réaliser qu'il voit un incrément entier dans une boucle for, et il optimisera les deux méthodes pour le même code efficace. Si l'utilisation du post-incrément par rapport à la pré-incrémentation entraîne en fait un ralentissement de votre programme, vous utilisez un terrible compilateur.

  2. En termes de complexité temporelle opérationnelle, les deux méthodes (même si une copie est en cours d'exécution) sont équivalentes. Le nombre d'instructions exécutées à l'intérieur de la boucle devrait considérablement dominer le nombre d'opérations dans l'opération d'incrémentation. Par conséquent, dans toute boucle de taille significative, la pénalité de la méthode d'incrément sera massivement éclipsée par l'exécution du corps de la boucle. En d'autres termes, il vaut mieux s'inquiéter de l'optimisation du code dans la boucle plutôt que de l'incrément.

À mon avis, toute la question se résume simplement à une préférence de style. Si vous pensez que le pré-incrément est plus lisible, utilisez-le. Personnellement, je préfère le post-incrément, mais c'est probablement parce que c'était ce qu'on m'avait appris avant de savoir quoi que ce soit sur l'optimisation.

C'est un exemple typique d'optimisation prématurée, et des problèmes comme celui-ci peuvent nous détourner de sérieux problèmes de conception. C'est toujours une bonne question à poser, cependant, parce qu'il n'y a pas d'uniformité dans l'utilisation ou de consensus dans les «meilleures pratiques».


11
2018-05-06 21:36



++ i est pré-incrémenté l'autre est post-incrémenté

i ++: récupère l'élément puis l'incrémente.
++ i: incrémente i et retourne l'élément

Exemple:

int i = 0;
printf("i: %d\n", i);
printf("i++: %d\n", i++);
printf("++i: %d\n", ++i);

Sortie:

i: 0
i++: 0
++i: 2

4
2017-09-17 12:23



++ i (opération de préfixe): incrémente puis affecte la valeur
(par exemple): int i = 5, int b = ++ i
       Dans ce cas, 6 est d'abord affecté à b, puis à 7 et ainsi de suite.

i ++ (opération Postfix): affecte et incrémente la valeur
(par exemple): int i = 5, int b = i ++
       Dans ce cas, 5 est d'abord affecté à b, puis incrémente à 6 et ainsi de suite.

Incase de for loop: i ++ est principalement utilisé car, normalement, nous utilisons la valeur de départ de i avant d'incrémenter dans la boucle for.Mais selon la logique de votre programme, elle peut varier.


4
2018-05-13 05:50



Ils ont tous deux incrémenter le nombre. ++ i est équivalent à i = i + 1.

i ++ et ++ i sont très similaires mais pas exactement les mêmes. Les deux incrémentent le nombre, mais ++ i incrémente le nombre avant que l'expression courante soit évaluée, tandis que i ++ incrémente le nombre après l'évaluation de l'expression.

Exemple :

int i = 1;
int x = i++; //x is 1, i is 2
int y = ++i; //y is 3, i is 3

4
2018-02-19 05:04



Je suppose que vous comprenez la différence de sémantique maintenant (même si honnêtement, je me demande pourquoi les gens demandent «qu'est-ce que l'opérateur X veut dire» les questions sur le débordement de la pile plutôt que sur la lecture, vous savez, un livre ou un tutoriel Web ou quelque chose.

Mais de toute façon, aussi loin que celui à utiliser, ignorer les questions de performance, qui sont peu important même en C ++. C'est le principe que vous devriez utiliser pour décider lequel utiliser:

Dites ce que vous voulez dire dans le code.

Si vous n'avez pas besoin de value-before-increment dans votre instruction, n'utilisez pas cette forme de l'opérateur. C'est un problème mineur, sauf si vous travaillez avec un guide de style qui interdit version en faveur de l'autre tout à fait (aka un guide de style à tête d'os), vous devez utiliser la forme qui exprime le plus exactement ce que vous essayez de faire.

QED, utilisez la version de pré-incrément:

for (int i = 0; i != X; ++i) ...

3
2017-08-04 17:20