38 votes

Pourquoi "a + + b" fonctionne-t-il, mais pas "a++b" ?

Je me suis amusé avec différentes choses, comme ça.

var a = 1, b = 2;
alert(a + - + - + - + - + - + - + - + b); //alerts -1

et je pourrais enlever les espaces, et ça marcherait toujours.

a+-+-+-+-+-+-+-+b

Puis j'ai essayé

a + + b

Il s'est exécuté et a évalué à 3, mais lorsque j'ai retiré les espaces, ( a++b ), il n'a pas voulu s'exécuter, et il y avait un avertissement qui disait "Confusing plusses".

Je peux comprendre que dans des cas comme

a+++++b

qui pourrait être interprété comme l'un des éléments suivants

(a++) + (++b)
(a++) + +(+b)
a + +(+(++b))
a + +(+(+(+b)))

que ce serait confus.

Mais dans le cas de

a++b

la seule façon valide d'interpréter ceci, pour autant que je puisse dire, c'est

a + +b

Pourquoi est-ce que a++b travail ?

58voto

Digital Plane Points 11741

L'analyseur syntaxique Javascript est gourmand (il fait correspondre l'opérateur valide le plus long à chaque fois), il obtient donc l'option ++ opérateur de a++b , faire :

(a++) b

qui n'est pas valide. Lorsque vous mettez des espaces a + + b le parseur l'interprète comme ceci :

(a) + (+b)

qui est valide et vaut trois.

Voir cet article de Wikipedia sur Grignotage maximal pour plus de détails.

12voto

Niet the Dark Absol Points 154811

C'est la lecture a++ il rencontre alors un b et ne sait pas quoi en faire.

7voto

mlathe Points 1801

Ceci est dû à la différence entre les opérateurs unaires.

"a + + b" is the same as "a + (+b)"
"a++b"    is the same as "(a++) _ b"  <--- there is a missing operator where the _ is

3voto

Marc B Points 195501

Les règles de prépondérance de l'opérateur Javascript pour la ++ L'opérateur d'incrémentation n'a pas d'associativité gauche-droite. Cela signifie que a++b peut être interprété comme a++ b ou a ++b en fonction de l'implémentation particulière. Quoi qu'il en soit, il s'agit d'une erreur de syntaxe, car vous avez deux variables, un opérateur unaire, et rien qui relie les deux variables.

En termes pratiques :

a = 1
b = 2;

a++ b; -> 2 2
a ++b; -> 1 3

Qu'est-ce que 1 3 en tant que code JS ?

3voto

Michał Šrajer Points 9487

La plupart des analyseurs syntaxiques des langages de programmation essaient d'obtenir les plus longs morceaux de texte qui ont un sens, donc lorsque Javascript voit :

[a][][][][]

"variable a" - ça a du sens, voyons le prochain caractère :

[a][+][][]

"sera ajouté à la variable a" - ça a du sens, voyons le prochain caractère :

[a][+][+][]

"va post-incrémenter la variable a" - ça a du sens, voyons le prochain caractère,

[a][+][+][b]

Cela n'a pas de sens. J'ai deux expressions (a++) et (b) et aucun opérateur infixe entre elles.

Si vous le faites a+ +b il ne trouvera pas le ++ et cela fonctionnera comme a + + b .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X