Quel est l'opération c=a+++b signifie?
Le code suivant m'a confondu
int a=2,b=5,c;
c=a+++b;
printf("%d,%d,%d",a,b,c);
Je m'attendais à la sortie de la 3,5,8, principalement en raison++ 2 +1 qui est égal à 3, et 3 + 5 est égal à 8, donc je m'attendais 3,5,8. Il s'avère que le résultat est 3,5,7. Quelqu'un peut m'expliquer pourquoi c'est le cas?
a++
plus certainement ne signifie pas2+1
. 🙂- ce sont juste des exercices dans un livre, mais ils l'ont m'a fait réfléchir. - Je garder de se tromper!, donc ce n'est pas la production de code ou quoi que ce soit
- À moins que vous écrivez un analyseur C++/compilateur, vous ne devriez jamais avoir à écrire/penser à des expressions comme
a+++b
, quelqu'un qui lit le code plus tard, pourrait facilement interpréter commea + (++b)
qui permettrait d'évaluer à 8. Les espaces et les parenthèses sont libres et se rendre la vie de chacun plus facile dans ce cas. - fatigué de gens qui demandent ceci: stackoverflow.com/questions/5677271 stackoverflow.com/questions/5341202 stackoverflow.com/questions/5752910 stackoverflow.com/questions/5649354
- au fond, ce n'est pas vraiment un maximum de munch question, fondamentalement, c'est un malentendu à propos de la façon dont la post-incrémentation des œuvres qui est en fait hors-sujet par les normes d'aujourd'hui.
Vous devez vous connecter pour publier un commentaire.
C'est analysée comme
c = a++ + b
, eta++
moyens de post-incrémentation, c'est à dire incrément après la prise de la valeur dea
pour calculera + b == 2 + 5
.S'il vous plaît, jamais écrire du code comme ceci.
a++ + b
, et non pas commea + ++b
? Le tokenizer est gourmand?var
trois jetonsv
,a
etr
. Ou pourquoi vous voyez>=
comme un jeton et pas>
et=
. Également la même raison pourquoi vous voyez>>
jeton dansvector<vector<int>>
causant des erreurs d'analyse. Par conséquent, lorsque l'analyseur lexical voit plus, il essaie le caractère suivant, il voit qu'il peut correspondre à la fois les personnages comme un++
, puis continue à voir la prochaine+
. Par conséquent, l'analyseur voita ++ + b
a+b
mais comme(a++)+b
il se trouve que le post incrémenta++
renvoie la valeur dea
avant incrémentation, c'est à dire 2.(a++) + b
est le même quea++ + b
par C les règles de priorité et de la valeur de(a++)
dans une expression oùa
se produit exactement une fois la valeur de l'a
avant de l'incrément.a+b
" qui est-à-dire le code est équivalent àa+b;a=a+1
ce qui n'est pas le cas, c'est plus commef(a)+b
oùf(int& a){int tmp=a;a=a+1;return tmp;}
Maximale Munch Règle s'applique à une telle expression, selon laquelle, l'expression est interprétée comme:
Qui est,
a
est post-incrémenté (a++
) et donc la valeur actuelle dea
(avant la post-incrémentation) est pris pour+
opération avecb
.a++ est post incrémentation, c'est à dire l'expression prend la valeur de a et puis ajoute 1.
c = ++a + b ferais ce que vous attendez.
Ceci est un exemple de mauvais style de programmation.
Il est tout à fait illisible, mais il post incréments
a
donc la somme de la valeur actuelle dea
àb
et par la suite par incrémentsa
!a++ obtient évalués à l'issue de l'expression.
c = ++a + b; serait de vous donner ce que vous avez pensé.
Le poste opérateur d'incrémentation, a++, les changements tge valeur d'après la valeur de a est évalué dans l'expression. Depuis la valeur initiale de a est 2, c'est ce qui est utilisé pour calculer c; la valeur est modifiée pour refléter la nouvelle valeur après le ++ est évaluée.
un++ + b ..il donne le résultat 7 et après l'expression de la valeur de a est mise à jour pour 3 à cause de la poste opérateur d'incrémentation
Selon Le Plus Long Match règle générale, il est analysé comme un++ + +b au cours de l'analyse lexicale de la phase de compilateur. Donc la résultante de sortie.
Ici c= a+++b; signifie c= (a++) +b; je.e poste d'incrémentation.
Dans un++, des changements vont se produire dans la prochaine étape dans laquelle c'est l'impression a, b et c.
En ++, j'.e-préfixe d'incrémenter les changements vont se produire dans la même étape et il vous donnera une sortie de 8.