Juste une observation aléatoire, il semble que sur StackOverflow.com, on se demande si "++ i == i ++". Cette question est posée tout le temps, je pense que je l'ai vue posée environ 6 ou 7 fois au cours des 2 derniers mois.
Je me demande juste pourquoi les développeurs C s'y intéressent autant? Le même concept / question existe également pour les développeurs C # et Java, mais je pense que je n'ai vu qu'une seule question liée à C #.
Est-ce parce que de nombreux exemples utilisent ++ i? Est-ce parce qu'il existe un livre ou un tutoriel populaire? Est-ce parce que les développeurs C aiment juste entasser autant que possible dans une seule ligne pour «efficacité» / «performance» et rencontrent donc des constructions «étranges» en utilisant plus souvent l'opérateur ++?
la source
++i == i++
, ou plus généralement à la différence de sens entre++i
eti++
?Réponses:
Je soupçonne qu'au moins une partie est un peu plus simple: même maintenant, nous voyons beaucoup de questions comme celle-ci commencer vers le début de l'année scolaire, et elles diminuent progressivement tout au long de l'année.
En tant que tel, je pense qu'il est juste de supposer que bon nombre d'entre eux sont simplement le résultat de cours dans lesquels l'enseignant en parle au moins un peu, mais n'explique pas très bien ses points (aussi souvent qu'autrement). parce qu'il ne les comprend pas vraiment lui-même). Particulièrement sur la base des personnes qui semblent poser ces questions, peu sont basées sur un codage réel.
la source
Parce que les programmeurs C doivent comprendre l'ordre des opérations. Les développeurs C # n'utilisent pas nécessairement les opérateurs au niveau du bit (&, |, ~) ou les opérateurs de préfixe car nous sommes normalement plus préoccupés par d'autres choses. Cependant, ce que nous, les développeurs C #, ne réalisons pas, c'est que nous devons savoir ce que font les opérateurs que nous utilisons quotidiennement et comment les utiliser correctement. La plupart d'entre nous évitent simplement les endroits où cela peut poser problème.
Du haut de votre tête, quelle est la sortie de cet extrait?
Je dirais qu'un bon nombre de développeurs C # chevronnés n'ont aucune idée de la sortie vers la console.
la source
if (myList[i++] == item)
. Intelligent. Je l'ai trouvé à la recherche de la source d'une exception IndexOutOfRange ... En effet, très "intelligent".++
utilisé sur un flotteur auparavant, et je dois dire que cela ne semble pas très approprié. Les gens font ça? (Je préfère+= 1
)Je pense que c'est évident. En C #, pour an
int i
,i++ == ++i
est toujours faux tandis que++i == i++
c'est toujours vrai, de manière fiable, et tous ceux qui sont intéressés peuvent le découvrir facilement simplement en apprenant les règles de C # (ou en le faisant simplement fonctionner).En C et C ++, en revanche, il est presque indéfini car cela dépend du compilateur, de l'environnement d'exécution, de la plate-forme, etc., donc c'est une question beaucoup plus difficile à répondre, donc beaucoup de gens la posent.
la source
C'est une question populaire parce que c'est une question piège. Ce n'est pas défini .
Le lien ci-dessus renvoie à une FAQ sur la page d'accueil de Bjarnes Stroustrup, qui répond spécifiquement à cette question et explique pourquoi cette construction n'est pas définie. Ce qu'il dit, c'est:
la source
Très probablement parce qu'en C, cela importe vraiment si vous écrivez
i++
ou++i
lorsque vous faites de l'arithmétique de pointeur. Là, augmenteri
avant ou après une opération pourrait être crucial. Je vous donnerais un exemple mais la dernière fois que j'ai écrit C était il y a 10 ans ...En C #, je n'ai jamais rencontré de situation qui m'obligerait à réfléchir
i++
ou++i
parce que AFAIK, pour les boucles for / while, cela n'a pas vraiment d'importance.la source
i++
et++i
, mais de les combiner dans la même expression.Il y a quelques années, j'ai lu que ces opérateurs étaient considérés comme dangereux, alors j'ai essayé de creuser plus d'informations à ce sujet. Si stackoverflow avait été en place à ce moment-là, je l'aurais demandé là-bas.
Maintenant, c'est parce que certaines personnes tordues écrivent des boucles telles que
Même maintenant, je ne suis pas trop sûr de ce qui va / devrait arriver, mais il est assez clair pour moi que plusieurs ++ [var] sur la même ligne demandent des ennuis.
la source
x = ++j;
sont bien définies en C. Ce qui précède n'est pas défini car ilj
est modifié deux fois sans points de séquence intermédiaires.Deux raisons.
L'implémentation correcte de ++ i consiste à incrémenter i puis à le renvoyer. L'implémentation correcte d'i ++ consiste à enregistrer la valeur actuelle, à incrémenter i et à renvoyer la valeur enregistrée. Les connaître n'est pas implémenté car les synonymes sont importants.
La question devient alors quand le compilateur les applique-t-il lors de l'évaluation d'une expression, telle que l'égalité.
Si le test d'égalité est fait en premier, alors les opérateurs pré et post-incrémentation, vous allez devoir écrire une logique différente que si le côté gauche (lhs) et le côté droit (rhs) sont évalués en premier, puis l'égalité.
Tout dépend de l'ordre des opérations, et cela affecte à son tour le code que l'on écrit. Et, sans surprise, toutes les langues ne sont pas d'accord.
La liste des tests de base permet aux développeurs de tester pour voir si leurs hypothèses sont correctes, ainsi que si l'implémentation réelle correspond aux spécifications du langage.
Cela peut avoir toutes sortes d'impact lorsque vous travaillez avec des pointeurs, des boucles ou que vous retournez des valeurs.
la source
++i
est d' utiliser la valeuri+1
et à un moment donné, peut-être avant ou après cela, mais avant le point de séquence suivant, incrémenteri
.Je pense que c'est un choc culturel.
Comme déjà souligné, le comportement d'une expression en C ou C ++ peut être indéfini car l'ordre d'exécution des post-incréments, etc. n'est pas strictement défini. Le comportement indéfini est assez courant en C, et bien sûr une grande partie de cela a été importé en C ++.
Pour quelqu'un qui a fait de la programmation dans un autre langage - quelqu'un qui a compris que les langages de programmation sont censés être précis et que les ordinateurs sont censés faire ce qu'on leur dit de faire ... eh bien, c'est un choc pour découvrir que C est intentionnellement vague sur certaines choses.
la source
++
et les--
opérateurs n'étaient pas basés sur le PDP-11, qui n'existait pas lorsque ces opérateurs ont été introduits dans le langage prédécesseur de C. B. Voir cm.bell-labs.com/who/dmr/chist.html et recherchez "auto-incrément".C'est peut-être juste que les développeurs C utilisent l'incrémentation ++ plus souvent en général - vu que C n'a pas de "foreach" ou instruction similaire pour parcourir les tableaux. Oh, et bien sûr pointeur arithmatique, comme mentionné précédemment!
la source
La différence entre les deux parties: le post et le pré-incrément fonctionnent comme ces deux morceaux de code devraient fonctionner dans toutes les langues. CE N'EST PAS DÉPENDANT DE LA LANGUE !!!
C'est pré incrément. Ce morceau de code augmentera d'abord la valeur de
i
avant d'envoyer la valeur à la ligne où il est utilisé.Ceci est l'incrément de post. Ce morceau de code renverra la valeur de
i
avant d'augmenter la valeur dei
sur la ligne où il est utilisé.Dans un autre petit exemple:
Ce code se compile avec les résultats sur le codepad.
Cela a à voir avec la mise en œuvre interne de la surcharge de l'opérateur.
++i
augmente directement la valeur (et est donc un peu plus rapide)i++
crée d'abord une copie qui est retournée à l'endroit où cela est nécessaire et ensuite la valeur d'origine de lai
variable est augmentée d'une unité.J'espère que c'est clair maintenant.
la source
++i
n'est pas plus rapide eti++
ne crée pas de copie. De plus,++i
se comporte légèrement différemment en C qu'en C ++, et encore moins entre les autres langages.