En C, quelle est la différence entre l’utilisation de et
, et qui doit être utilisé dans le bloc d’incrémentation d’une `` boucle ?
Réponses
Trop de publicités?-
++i
incrémente la valeur dei
, puis de retourner la valeur incrémentée.i = 1; j = ++i; (i is 2, j is 2)
-
i++
incrémente la valeur dei
, mais le retour à la valeur d'origine qu'i
détenus avant d'être augmentés.i = 1; j = i++; (i is 2, j is 1)
Pour un for
boucle, soit des œuvres. ++i
semble de plus en plus commun, peut-être parce que c'est ce qui est utilisé dans le K&R.
Dans tous les cas, suivre les directives "préfèrent ++i
sur i++
" et vous ne vous tromperez pas.
Il ya un couple de commentaires au sujet de l'efficacité de l' ++i
et i++
. Dans tous les non-étudiants-projet de compilateur, il n'y aura pas de différence de performances. Vous pouvez le vérifier en regardant le code généré qui sera identique.
L'efficacité de la question est intéressante... voici ma tentative de réponse:
Est-il une différence de performance entre i++ et ++i en C?
Comme Sur Freund notes, c'est différent pour un objet C++, depuis operator++()
est une fonction et le compilateur ne peut pas savoir à optimiser à l'écart de la création d'un objet temporaire pour contenir la valeur intermédiaire.
i++ est connu comme Post Incrément alors que ++i est appelé Pré Incrémentation.i++
i++
post incrément car il incrémente i
s'valeur par 1 après l'opération est terminée.
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 attribuée j
d'abord, puis i
sera incrémenté.++i
++i
est pré incrémentation car il incrémente i
s'valeur par 1 avant l'opération.
Cela signifie j = i;
exécuté en premier et ensuite, 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 attribuée j
après l' i
incremention d' i
.
De même, ++i
sera exécutée avant la j=i;
.
Pour votre question qui doit être utilisé dans l'incrémentation bloc d'une boucle for? la réponse est, vous pouvez utiliser un.. peu importe. Elle exécutera vos pour la boucle même pas. de fois.
for(i=0; i<5; i++)
printf("%d ",i);
Et
for(i=0; i<5; ++i)
printf("%d ",i);
Les deux boucles va produire la même sortie. ie 0 1 2 3 4
.
Il importe seulement lorsque vous l'utilisez.
for(i = 0; i<5;)
printf("%d ",++i);
Dans ce cas, la sortie sera 1 2 3 4 5
.
La raison pour laquelle ++ j’ai peut être un peu plus rapide que i ++ est que i ++ peut exiger une copie locale de la valeur d’i avant elle obtient incrémentée, tandis que ++ je ne fait jamais. Dans certains cas, certains compilateurs permettent d’optimiser il loin si possible... mais il n’est pas toujours possible, et pour ce faire, pas tous les compilateurs.
J’ai essayer de ne pas compter trop d’optimisations des compilateurs sur, donc je suivrais les conseils de Ryan Fox : quand je peux utiliser à la fois, j’ai utiliser ++ j’ai.