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++);
}
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)
i
est défini sur 10
(facile).i
est incrémenté à 11
.i
est copiée dans j
. Donc j
est maintenant égal à 11
.i
est incrémenté à 12
.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 --
.
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'
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.
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.
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.
i ++ est post-incrément. L'incrémentation a lieu après le retour de la valeur.
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++);
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);
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
Cela a à voir avec le fonctionnement de l'opérateur post-incrémentation. Il renvoie la valeur de i puis incrémente la valeur.
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.
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é.
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
.
fun (10) renvoie 10. Si vous voulez qu'il renvoie 11, vous devez utiliser ++ i par opposition à i ++.
int fun(int i)
{
return ++i;
}