web-dev-qa-db-fra.com

Quelle est la différence entre les opérateurs préfixe et postfixe?

Le code suivant imprime une valeur de 9. Pourquoi? Ici, return(i++) renverra une valeur de 11 et en raison de --i la valeur doit être 10 elle-même, quelqu'un peut-il expliquer comment cela fonctionne?

#include<stdio.h>
main()
{
    int i= fun(10);
    printf("%d\n",--i);
}

int fun (int i)
{
    return(i++);
}
31
pradeep

Il existe une grande différence entre les versions postfixe et préfixe de ++.

Dans la version préfixe (c'est-à-dire ++i), la valeur de i est incrémentée et la valeur de l'expression est la valeur nouvea de i.

Dans la version postfix (c'est-à-dire i++), la valeur de i est incrémentée, mais la valeur de l'expression est la valeur original de i.

Analysons ligne par ligne le code suivant:

int i = 10;   // (1)
int j = ++i;  // (2)
int k = i++;  // (3)
  1. i est défini sur 10 (facile).
  2. Deux choses sur cette ligne:
    • i est incrémenté à 11.
    • La valeur nouvelle de i est copiée dans j. Donc j est maintenant égal à 11.
  3. Deux choses sur cette ligne aussi:
    • i est incrémenté à 12.
    • La valeur originale de i (qui est 11) est copié dans k. Donc k est maintenant égal à 11.

Donc, après avoir exécuté le code, i sera 12 mais j et k seront 11.

La même chose vaut pour les versions postfixes et préfixes de --.

54

Préfixe:

int a=0;

int b=++a;          // b=1,a=1 

avant l'affectation, la valeur de sera incrémentée.

suffixe:

int a=0;
int b=a++;  // a=1,b=0 

attribuez d'abord la valeur de 'a' à 'b' puis augmentez la valeur de 'a'

12
Dilu Thankachan

La fonction retourne avant que i ne soit incrémentée car vous utilisez un opérateur post-fix (++). Quoi qu'il en soit, l'incrément de i n'est pas global - uniquement pour la fonction respective. Si vous aviez utilisé un opérateur de préfixe, ce serait 11 puis décrémenté à 10.

Vous retournez donc i comme 10 et le décrémentez dans la fonction printf, qui affiche 9 ne pas 10 comme vous pensez.

10
user195488

En fait, return (i++) ne renverra que 10.

Les opérateurs ++ et - peuvent être placés avant ou après la variable, avec différents effets. S'ils sont antérieurs, ils seront traités et retournés et traités essentiellement comme (i-1) ou (i + 1), mais si vous placez le ++ ou - après le i, alors le retour est essentiel

return i;
i + 1;

Il retournera donc 10 et ne l'incrémentera jamais.

7
loganfsmyth

L'incrément de suffixe ++ N'augmente la valeur de son opérande qu'après avoir été évalué. La valeur de i++ Est i.

Le préfixe décrémente augmente la valeur de son opérande avant il a été évalué. La valeur de --i Est i - 1.

L'incrémentation/décrémentation du préfixe modifie la valeur avant l'évaluation de l'expression. L'incrémentation/décrémentation de Postfix modifie la valeur après.

Ainsi, dans votre cas, fun(10) renvoie 10 et l'impression de --i Imprime i - 1, Qui est 9.

4
Rafe Kettler

i ++ est post-incrément. L'incrémentation a lieu après le retour de la valeur.

3
Alok Save

Il y a deux exemples illustre la différence

int a , b , c = 0 ; 
a = ++c ; 
b = c++ ;
printf (" %d %d %d " , a , b , c++);
  • Ici c a la valeur 0 c incrémente de 1 puis attribue la valeur 1 à une valeur so de a = 1 et la valeur de c = 1
  • instruction suivante valeur assiagn de c = 1 à b puis incrémenter c de 1 donc la valeur de b = 1 et la valeur de c = 2

  • dans printf, nous avons c++ cela signifie que la valeur d'origine de c qui est 2 sera imprimée puis incrémentera c de 1 pour que l'instruction printf imprime 1 1 2 et la valeur de c est maintenant 3

vous pouvez utiliser http://pythontutor.com/c.html

int a , b , c = 0 ; 
a = ++c ; 
b = c++ ;
printf (" %d %d %d " , a , b , ++c);
  • Ici dans l'instruction printf++c augmentera d'abord la valeur de c de 1, puis affectera la nouvelle valeur 3 à c pour que l'instruction printf affiche 1 1 3
3
Abdelrhman Fawzy

Cela a à voir avec le fonctionnement de l'opérateur post-incrémentation. Il renvoie la valeur de i puis incrémente la valeur.

2
Kevin

Tout d'abord, notez que le paramètre de fonction nommé i et la variable nommée i dans main() sont deux variables différentes. Je pense que cela n'a pas beaucoup d'importance pour la discussion actuelle, mais il est important de le savoir.

Deuxièmement, vous utilisez l'opérateur de post-incrémentation dans fun(). Cela signifie que le résultat de l'expression est la valeur avanti est incrémenté; la valeur finale 11 de i est simplement ignorée et la fonction renvoie 10. La variable i de retour en principal, étant une variable différente, se voit attribuer la valeur 10, que vous décrémentez ensuite pour obtenir 9.

2

En fait, ce qui se passe est lorsque vous utilisez postfix, c'est-à-dire i ++, la valeur initiale de i est utilisée pour le retour plutôt que l'incrémentée. Après cela, la valeur de i est augmentée de 1. Et cela se produit avec toute instruction qui utilise i ++, c'est-à-dire que la première valeur initiale de i est utilisée dans l'expression, puis elle est incrémentée.

Et l'inverse se produit exactement en préfixe. Si vous auriez renvoyé ++ i, la valeur incrémentée, c'est-à-dire 11, est renvoyée, car l'ajout de 1 est effectué en premier, puis il est renvoyé.

2
Gargee Sanyal

Explication:

Étape 1:int fun(int); Ici, nous déclarons le prototype de la fonction fun().

Étape 2:int i = fun(10); La variable i est déclarée comme un type entier et le résultat de la fun(10) sera stocké dans la variable i .

Étape 3:int fun(int i){ return (i++); } A l'intérieur de la fun() nous retournons une valeur return(i++). Il renvoie 10. car i++ est l'opérateur post-incrémentation.

Étape 4: Ensuite, le contrôle revient à la fonction principale et la valeur 10 Est affectée à la variable i.

Étape 5:printf("%d\n", --i); Ici --i Dénoté pré-incrémentation. Il imprime donc la valeur 9.

2
Setu Kumar Basak

fun (10) renvoie 10. Si vous voulez qu'il renvoie 11, vous devez utiliser ++ i par opposition à i ++.

int fun(int i)
{
    return ++i;
}
1
mbreining