web-dev-qa-db-fra.com

Quelle est la différence entre pré-incrément et post-incrément dans le cycle (pour/tout le temps)?

Mon intérêt est dans la différence entre les boucles for et while. Je sais que la valeur post-incrément est utilisée puis incrémentée et que l'opération renvoie une pré-incrémentation constante.

while (true) {
    //...
    i++;
    int j = i;
}

Ici, j contiendra-t-il l'ancien i ou la post-incrémentée i à la fin de la boucle?

18
user1886376

Étant donné que l'instruction i ++ se termine par le ; dans votre exemple, le fait que vous utilisiez une pré-incrémentation ou une post-incrémentation ne fait aucune différence.

La différence survient lorsque vous utilisez le résultat:

int j = i++; // i will contain i_old + 1, j will contain the i_old.

Contre:

int j = ++i; // i and j will both contain i_old + 1.
43
zennehoy

Cela dépend de la façon dont vous les utilisez.

  • i++ fait une copie, augmente i et renvoie la copie (ancienne valeur).
  • ++i augmente i et retourne i.

Dans votre exemple, tout est question de vitesse. ++i sera le plus rapide que i++ puisqu'il ne crée pas de copie.

Cependant, un compilateur l'optimisera probablement car vous ne stockez pas la valeur renvoyée par l'opérateur d'incrément de votre exemple, mais cela n'est possible que pour les types fondamentaux tels que int.

36
Tim

Réponse de base pour comprendre . L’opérateur d’incrémentation fonctionne comme suit:

// ++i
function pre_increment(i) {
    i += 1;
    return i;
}
// i++
function post_increment(i) {
    copy = i;
    i += 1;
    return copy;
}

Un bon compilateur remplacera automatiquement i++ par ++i lorsqu'il détectera que la valeur renvoyée ne sera pas utilisée.

20
Kulvar

En pré-incrémentation, la valeur initiale est d'abord incrémentée, puis utilisée dans l'expression.

a=++i;

Dans cet exemple, supposons que la valeur de la variable i soit égale à 5, alors que celle de la variable a soit égale à 6 car la valeur de i est modifiée avant d'être utilisée dans une expression.

En post-incrémentation, la valeur est d'abord utilisée dans une expression, puis incrémentée.

a=i++;

Dans cet exemple, supposons que la valeur de la variable i soit égale à 5, alors que celle de la variable a soit égale à 5 car la valeur de i est incrémentée uniquement après l'attribution de la valeur 5 à a.

6
Pbk1303
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char **argp)
{
    int x = 5;

    printf("x=%d\n", ++x);
    printf("x=%d\n", x++);
    printf("x=%d\n", x);

    return EXIT_SUCCESS;
}

Sortie du programme: 

x=6
x=6
x=7

Dans la première instruction printf, x est incrémenté avant d'être transmis à printf de sorte que la valeur 6 soit sortie, dans la seconde x, à printf déclaration en produisant à nouveau x qui a maintenant la valeur 7. 

4
Taha

i ++ utilise la valeur de i puis l'incrémente mais ++ i incrémente la valeur de i avant de l'utiliser.

2
Naira Magdy

peu importe que vous utilisiez pré ou post-incrémentation dans une instruction indépendante, à l'exception du pré-incrémentation, l'effet est immédiat.

//an example will make it more clear:


int n=1;
printf("%d",n);
printf("%d",++n);// try changing it to n++(you'll get to know what's going on)

n++;
printf("%d",n);

sortie: 123

0
Oswin Topno

La différence entre post-et pré-incrément est vraiment, dans de nombreux cas, subtile. post incremenet, alias num++, crée d'abord une copie de num, le renvoie, et ensuite , l'incrémente. La pré-incrémentation, par exemple, ++num, est d'abord évaluée, puis renvoie la valeur. La plupart des compilateurs modernes, lorsqu'ils voient cela dans une boucle, vont généralement optimiser, surtout quand post increment est utilisé, et la valeur initiale retournée n'est pas utilisée. La différence la plus importante entre les 2 incréments, où il est très courant de créer des bogues subtils, est lors de la déclaration de variables, avec des valeurs incrémentées: Exemple ci-dessous:

int num = 5;
int num2 = ++num; //Here, first num is incremented, 
                  //then made 6, and that value is stored in num2;

Un autre exemple:

int num = 5;
int num2 = num++; //Here, num is first returned, (unfortunately?), and then 
                  //incremented. This is useful for some cases.

La dernière chose que je veux dire ici est SOYEZ PRUDENT AVEC DES AUGMENTATIONS . Lorsque vous déclarez des variables, veillez à utiliser le bon incrément ou écrivez simplement le tout (num2 = num + 1, qui ne fonctionne pas toujours et équivaut à un pré-incrément). Beaucoup de problèmes seront sauvés si vous utilisez le bon incrément.

0
Arnav Borborah