2012-05-30 3 views
3
int i=9; 
System.out.println(--i + ++i); 

sortie lors de l'exécution: 17
La valeur finale de i est la suivante: 9sortie d'expression (-I + ++ i) en java

Mais selon l'associativité et de préséance règles en java ,, ++ je devrais être exécuté d'abord ie de droite à gauche qui donne 10 et puis - i donne 9 .. en ajoutant les deux, la réponse devrait être 19 ... Pour autant que j'ai connu un tel code donne un comportement indéfini en C/C++ mais en Java, les règles sont strictement définies et il n'y a pas de concept de points de séquence. Alors, quelqu'un peut-il clarifier le problème car je suis vraiment confus à ce sujet ?? Également dans certains livres, il a été mentionné que les opérateurs post-incrément et post-décrémentation sont associatifs LTR. Mais dans d'autres livres, il est donné tout incrément et décrément (à la fois post et pré) sont associatifs RTL .. !! Quelqu'un peut-il donner une priorité d'opérateur et une table d'associativité correctes pour Java?

+0

double possible de [++ i + ++ i + ++ je dans Java vs C] (http://stackoverflow.com/questions/3879176/iii-in-java-vs-c) et surtout [cette réponse] (http://stackoverflow.com/a/3879280/829571) . – assylias

Répondre

1

premier -I devient 8 puis ++ i devient 9.so answr est 17.

int i =9; 

--i =8, now i is 8 
++i=9 ,++ makes 9 

so finally (8+9)=17 and i=9. 
9

Pouvez-vous indiquer où dans le langage Java Spécification il est dit que associativité à droite à -la gauche? Il ne l'est pas, il est gauche à droite (à l'exception de multiples affectations - par exemple x = y = 4). Voir la section JLS 15.7.1, utilement intitulée "Évaluer l'opérande à gauche en premier". D'où la réponse est correcte:

--i + ++i 

premier --i est évalué. Cela décrémente i (qui est maintenant 8) et renvoie la valeur post-décrément (8). Ceci est ensuite ajouté à ++i ce qui équivaut à increment-and-get (donc le RHS évalue à 9).

Il est similaire à

AtomicInteger i = new AtomicInteger(9); 
i.decrementAndGet() + i.incrementAndGet(); 

Voulez-vous attendre à ce à évaluer r-l aussi?

+2

Ajout de la citation directe JLS. –

+0

Il confond probablement l'associativité de l'infixe + et du pré-incrément ++. Ce livre (http://introcs.cs.princeton.edu/java/11precedence/) indique que pre-increment ++ est de droite à gauche. – nhahtdh

+0

Merci beaucoup Louis! –

2

évaluation d'expression va de gauche à droite

(--i + ++i) 

--i = 8 //i becames 8 here 
++i = 9 // i becames 9 here again 
8+9 = 17 
0

La sortie est correcte:

D'abord, --i est exécuté en premier , donc i devient 8 puis ++i est exécuté. Maintenant, i est 8 alors ++ je deviens 9, puis le milieu + qui devient 8 + 9 = 17.

Java fait de l'associativité de gauche à droite.

0

(-I + ++ i)

L'évaluation commence de gauche à droite.

first (
second --i // 8 
third + // addition operator 
fourth ++i // 9 
fifth ) 

8 + 9 = 17 
0

int i=9; System.out.println(--i + ++i);

comme nous le savons, la priorité d'augmentation et de diminution est plus élevé que l'opérateur arithmétique « + », donc « ++ » et « - » est évalué en premier. et maintenant l'associativité de l'opérateur unaire est de droite à gauche, donc d'après cela, il faut d'abord évaluer l'opérateur '++'. mais avant l'évaluation, il existe un autre concept de liaison, il liera l'expression comme ((--i)+(++i)) et maintenant selon l'opérateur(), dont l'associativité est de gauche à droite, il évaluera d'abord (--i) puis (8+ (++i)) et i=8. maintenant il va évaluer (++ i) puis (8+9) et i=9, et donc finalement répondre être (8+9) = 17.

1

L'évaluation commence de gauche à droite. Do --i qui devient 8 et ++i qui évalue à 9 et l'addition est fait qui donne 17.

+0

Cela a déjà été répondu et expliqué, alors quelle était votre intention de le faire à nouveau? – Tom

-1

évaluation d'expression va de gauche à droite

i=9; 
First --i than i=9-1, i=8 
After ++i than i=8+1, i=9 
--i + ++i = 17 
+0

Cela a déjà été répondu et expliqué, alors quelle était votre intention de le faire à nouveau? – Tom

+0

Pas d'intention spécifique, il suffit de donner ... –

Questions connexes