Y a-t-il une différence dans ++i
et i++
dans une for
boucle? Est-ce simplement une question de syntaxe?
303
Y a-t-il une différence dans ++i
et i++
dans une for
boucle? Est-ce simplement une question de syntaxe?
Réponses:
a ++ est appelé postfix.
ajouter 1 à a, renvoie l'ancienne valeur.
++ a est appelé préfixe.
ajouter 1 à a, renvoie la nouvelle valeur.
C #:
Production:
foreach
et leswhile
boucles dépendent du type d'incrément que vous utilisez. Avec des boucles for comme ci-dessous, cela ne fait aucune différence car vous n'utilisez pas la valeur de retour de i:Si la valeur évaluée est utilisée, le type d'incrément devient significatif:
la source
Pre-increment ++ i incrémente la valeur de i et évalue la nouvelle valeur incrémentée.
Post-increment i ++ incrémente la valeur de i et évalue la valeur d'origine non incrémentée.
En C ++, la pré-incrémentation est généralement préférée lorsque vous pouvez utiliser l'une ou l'autre.
En effet, si vous utilisez la post-incrémentation, le compilateur peut avoir à générer du code qui crée une variable temporaire supplémentaire. Cela est dû au fait que les valeurs précédentes et nouvelles de la variable incrémentée doivent être conservées quelque part, car elles peuvent être nécessaires ailleurs dans l'expression à évaluer.
Ainsi, en C ++ au moins, il peut y avoir une différence de performances qui guide votre choix de celui à utiliser.
Il s'agit principalement d'un problème uniquement lorsque la variable incrémentée est un type défini par l'utilisateur avec un opérateur ++ remplacé. Pour les types primitifs (int, etc.), il n'y a pas de différence de performances. Mais, cela vaut la peine de s'en tenir à l'opérateur de pré-incrémentation à titre indicatif, sauf si l'opérateur de post-incrémentation est définitivement ce qui est requis.
Il y a plus de discussion ici:
https://web.archive.org/web/20170405054235/http://en.allexperts.com/q/C-1040/Increment-operators.htm
En C ++ si vous utilisez STL, vous utilisez peut-être des boucles avec des itérateurs. Ceux-ci ont principalement des opérateurs ++ remplacés, donc s'en tenir à la pré-incrémentation est une bonne idée. Les compilateurs deviennent toujours plus intelligents, et les plus récents peuvent être en mesure d'effectuer des optimisations qui signifient qu'il n'y a pas de différence de performances - en particulier si le type incrémenté est défini en ligne dans le fichier d'en-tête (comme le sont souvent les implémentations STL) afin que le compilateur puisse voir comment la méthode est implémentée et peut alors savoir quelles optimisations sont sûres à effectuer. Néanmoins, cela vaut probablement la peine de s'en tenir à la pré-incrémentation, car les boucles sont exécutées de nombreuses fois et cela signifie qu'une petite pénalité de performance pourrait bientôt être amplifiée.
Dans d'autres langages tels que C # où l'opérateur ++ ne peut pas être surchargé, il n'y a pas de différence de performances. Utilisés dans une boucle pour faire avancer la variable de boucle, les opérateurs pré et post-incrémentation sont équivalents.
Correction: la surcharge ++ en C # est autorisée. Il semble cependant que, par rapport à C ++, en c #, vous ne pouvez pas surcharger les versions pré et post indépendamment. Donc, je suppose que si le résultat de l'appel de ++ en C # n'est pas affecté à une variable ou utilisé dans le cadre d'une expression complexe, le compilateur réduira les versions pré et post de ++ vers du code qui fonctionne de manière équivalente.
la source
En C #, il n'y a pas de différence lorsqu'il est utilisé dans une boucle for .
sort la même chose que
Comme d'autres l'ont souligné, lorsqu'ils sont utilisés en général i ++ et ++, j'ai une différence subtile mais significative:
i ++ lit la valeur de i puis l'incrémente.
++ i incrémente la valeur de i puis la lit.
la source
++i
eti++
exécutent les mêmes opérations dans le même ordre: créer une copie temporaire dei
; incrémentez la valeur de temp pour produire une nouvelle valeur (pour ne pas remplacer la temp); stocker la nouvelle valeur dansi
; maintenant, si c'est++i
le résultat renvoyé, c'est la nouvelle valeur; si c'esti++
le résultat retourné, c'est la copie temporaire. Réponse plus détaillée ici: stackoverflow.com/a/3346729/3330348La question est:
La réponse est: non .
Pourquoi chaque réponse doit-elle entrer dans des explications détaillées sur la pré et post-incrémentation alors que ce n'est même pas demandé?
Cette boucle for:
Se traduirait dans ce code sans utiliser de boucles:
Maintenant, est-ce important si vous mettez
i++
ou++i
comme incrément ici? Non, ce n'est pas le cas car la valeur de retour de l'opération d'incrémentation est insignifiante.i
sera incrémenté APRÈS l'exécution du code qui se trouve dans le corps de la boucle for.la source
Puisque vous demandez la différence dans une boucle, je suppose que vous voulez dire
Dans ce cas, vous n'avez aucune différence dans la plupart des langues: la boucle se comporte de la même manière, que vous écriviez
i++
ou non++i
. En C ++, vous pouvez écrire vos propres versions des opérateurs ++, et vous pouvez définir des significations distinctes pour eux, si lei
est d'un type défini par l'utilisateur (votre propre classe, par exemple).La raison pour laquelle cela n'a pas d'importance ci-dessus est que vous n'utilisez pas la valeur de
i++
. Une autre chose est quand vous faitesMaintenant, il y a une différence, car comme d'autres le font remarquer,
i++
signifie incrémenter, mais évaluer à la valeur précédente , mais++i
signifie incrémenter, mais évaluer ài
(donc il évaluerait à la nouvelle valeur). Dans le cas ci-dessus,a
la valeur précédente de i est affectée, tandis que i est incrémenté.la source
Comme le montre ce code (voir le MSIL dissambled dans les commentaires), le compilateur C # 3 ne fait aucune distinction entre i ++ et ++ i dans une boucle for. Si la valeur de i ++ ou ++ i était prise, il y aurait certainement une différence (cela a été compilé dans Visutal Studio 2008 / Release Build):
la source
Un (++ i) est pré-incrémenté, un (i ++) est post-incrémenté. La différence réside dans la valeur immédiatement renvoyée par l'expression.
Edit: Woops, complètement ignoré le côté boucle des choses. Il n'y a pas de réelle différence dans les boucles for lorsqu'il s'agit de la partie 'step' (pour (...; ...;)), mais cela peut entrer en jeu dans d'autres cas.
la source
Il n'y a aucune différence si vous n'utilisez pas la valeur après incrément dans la boucle.
Les deux boucles imprimeront 0123.
Mais la différence survient lorsque vous utilisez la valeur après incrément / décrément dans votre boucle comme ci-dessous:
Boucle de pré-incrémentation:
Sortie: 0 0 1 1 2 2 3 3
Boucle de post-incrémentation:
Sortie: 0 0 1 0 2 1 3 2
J'espère que la différence est claire en comparant la sortie. Le point à noter ici est que l'incrémentation / décrémentation est toujours effectuée à la fin de la boucle for et donc les résultats peuvent être expliqués.
la source
Voici un exemple Java et le Byte-Code, le post et le pré-incrément ne montrent aucune différence dans le Bytecode:
Et maintenant pour le code d'octet (javap -private -c PreOrPostIncrement):
la source
Oui il y a. La différence réside dans la valeur de retour. La valeur de retour de "++ i" sera la valeur après l' incrémentation de i. Le retour de "i ++" sera la valeur avant l' incrémentation. Cela signifie que le code qui ressemble à ceci:
Par conséquent, a serait 2 et b et c seraient chacun 1.
Je pourrais réécrire le code comme ceci:
la source
Il n'y a pas de différence réelle dans les deux cas '
i
' sera incrémenté de 1.Mais il y a une différence lorsque vous l'utilisez dans une expression, par exemple:
la source
Il y a plus à ++ i et i ++ que des boucles et des différences de performances. ++ i renvoie une valeur l et i ++ renvoie une valeur r. Sur cette base, il y a beaucoup de choses que vous pouvez faire pour (++ i) mais pas pour (i ++).
la source
Cela m'embarrasse de savoir pourquoi les gens peuvent écrire l'expression d'incrémentation en boucle for comme i ++.
Dans une boucle for, lorsque le 3e composant est une simple instruction d'incrémentation, comme dans
ou
il n'y a aucune différence dans les exécutions qui en résultent.
la source
Comme le dit @Jon B , il n'y a pas de différence dans une boucle for.
Mais dans une boucle
while
oudo...while
, vous pouvez trouver des différences si vous faites une comparaison avec le++i
oui++
la source
En javascript en raison des éléments suivants, il est préférable d'utiliser i ++:
Alors que les tableaux (je pense que tous) et certaines autres fonctions et appels utilisent 0 comme point de départ, vous devez définir i sur -1 pour faire fonctionner la boucle avec le tableau lorsque vous utilisez ++ i .
Lorsque vous utilisez i ++, la valeur suivante utilise la valeur augmentée. On pourrait dire que i ++ est la façon dont les humains comptent, car vous pouvez commencer avec un 0 .
la source
est égal à la version WHILE
la source
Il peut y avoir une différence pour les boucles. Il s'agit de l'application pratique du post / pré-incrément.
Alors que le premier compte jusqu'à 11 et boucle 11 fois, le second non.
Généralement, cela est plutôt utilisé dans un temps simple (x--> 0); - - Boucle pour itérer par exemple tous les éléments d'un tableau (en excluant foreach-constructs ici).
la source
Ils incrémentent tous les deux 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émentent le nombre avant que l'expression actuelle ne soit évaluée, tandis que l'i++
incrémente le nombre après que l'expression est évaluée.Vérifiez ce lien .
la source
Oui, il y a une différence entre
++i
eti++
dans unefor
boucle, bien que dans des cas d'utilisation inhabituels; lorsqu'une variable de boucle avec opérateur d'incrémentation / décrémentation est utilisée dans le bloc for ou dans l'expression de test de boucle , ou avec l'une des variables de boucle . Non, ce n'est pas simplement une chose de syntaxe.Comme
i
dans un code signifie évaluer l'expressioni
et l'opérateur ne signifie pas une évaluation mais juste une opération;++i
signifie incrémenter la valeur dei
1 et évaluer plus tardi
,i++
signifie évalueri
et incrémenter ultérieurement la valeur dei
1.Ainsi, ce qui est obtenu à partir de chacune des deux expressions diffère parce que ce qui est évalué diffère dans chacune. Même chose pour
--i
eti--
Par exemple;
Dans des cas d'utilisation inhabituels, cependant l'exemple suivant semble utile ou non, cela montre une différence
la source
Pour
i
les types définis par l'utilisateur, ces opérateurs pourraient (mais ne devraient pas ) avoir une sémantique significativement différente dans le contexte d'un index de boucle, ce qui pourrait (mais ne devrait pas) affecter le comportement de la boucle décrite.De plus,
c++
il est généralement plus sûr d'utiliser le formulaire de pré-incrémentation (++i
) car il est plus facilement optimisé. (Scott Langham m'a battu à cette friandise . Je vous maudis , Scott)la source
Je ne sais pas pour les autres langages mais en Java ++ i est un incrément de préfixe qui signifie: augmenter i de 1 puis utiliser la nouvelle valeur de i dans l'expression dans laquelle je réside, et i ++ est un incrément postfix qui signifie ce qui suit : utilisez la valeur actuelle de i dans l'expression, puis augmentez-la de 1. Exemple:
} et la sortie est:
la source
i ++; ++ i; les deux sont similaires car ils ne sont pas utilisés dans une expression.
la source