вывод выражения в (--i + ++ i) в java

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

вывод при выполнении: 17
Конечное значение i: 9

Но в соответствии с правилами ассоциативности и приоритета в java сначала нужно выполнить ++ i, т.е. справа налево, что дает 10, а затем --i дает 9 .. добавляя оба, ответ должен быть 19 ... Насколько Я знал, что такой код дает неопределенное поведение в C / C ++, но в java правила строго определены и нет концепции точек последовательности. Итак, может ли кто-нибудь прояснить проблему, поскольку я действительно смущен этим? Также в некоторых книгах упоминалось, что операторы пост-инкремента и пост-декремента являются ассоциативными LTR. Но в некоторых других книгах все приращения и убывания (как после, так и до) являются ассоциативными RTL .. !! Может ли кто-нибудь дать правильную таблицу приоритетов операторов и ассоциативности для java?


person Dean Mathew    schedule 30.05.2012    source источник
comment
возможный дубликат ++ i + ++ i + ++ i в Java против C и особенно этот ответ.   -  person assylias    schedule 30.05.2012


Ответы (8)


Можете ли вы указать, где в Спецификации языка Java говорится, что ассоциативность написана справа налево? Это не так, это слева направо (за исключением нескольких заданий - например, x = y = 4). См. Раздел JLS 15.7.1, полезно под названием «Сначала вычислить левый операнд». Следовательно, ответ правильный:

--i + ++i

Сначала оценивается --i. Это уменьшает i (который теперь равен 8) и возвращает значение пост-декремента (8). Затем это добавляется к ++i, что эквивалентно приращению и получению (так что RHS оценивается как 9).

Это похоже на

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

Ожидаете ли вы, что это тоже будет оценено р-1?

person oxbow_lakes    schedule 30.05.2012
comment
Вероятно, он путает ассоциативность infix + и pre-increment ++. В этой книге (introcs.cs.princeton.edu/java/11precedence) говорится, что pre-increment ++ - справа налево. - person nhahtdh; 30.05.2012
comment
Извини ! я не понял !! Согласно (introcs.cs.princeton.edu/java/11precedence) предварительная Операторы inc и pre dec имеют одинаковый приоритет и выше, чем '+'. Следовательно, следует оценивать до + и от RTL (поскольку RTL ассоциативен). - person Dean Mathew; 30.05.2012

Оценка выражения идет слева направо

(--i + ++i)

--i = 8 //i becames 8 here
++i = 9 // i becames 9 here again
8+9 = 17 
person Chandra Sekhar    schedule 30.05.2012

сначала --i становится 8, а затем ++ i становится 9, поэтому ответ равен 17.

int i =9;

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

so finally (8+9)=17 and i=9.
person Samir Mangroliya    schedule 30.05.2012

Оценка начинается слева направо. Выполните --i, который становится 8, и ++i, который оценивается как 9, и выполняется сложение, которое дает 17.

person Haftom Gebremeskel    schedule 05.02.2017
comment
На этот вопрос уже был дан ответ и объяснение, так что вы намеревались сделать это снова? - person Tom; 05.02.2017

Вывод правильный:

Сначала выполняется --i, поэтому i становится 8, затем выполняется ++i. Теперь i равно 8, поэтому ++i становится 9, затем средний +, который становится 8 + 9 = 17.

Java выполняет ассоциативность слева направо.

person Buhake Sindi    schedule 30.05.2012

(--i + ++i)

Оценка начинается слева направо.

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

8 + 9 = 17
person Kumar Vivek Mitra    schedule 30.05.2012

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

как мы знаем, приоритет увеличения и уменьшения выше, чем у арифметического оператора «+», поэтому сначала вычисляются «++» и «-». и теперь ассоциативность унарного оператора справа налево, поэтому в соответствии с этим он должен сначала оценить оператор '++'. но перед оценкой существует другая концепция связывания, поэтому выражение будет связываться как ((--i)+(++i)), и теперь, согласно оператору (), ассоциативность которого слева направо, он будет сначала оценивать (--i), а затем (8+ (++i)) и i=8. теперь он будет оценивать (++ i), затем (8+9) и i=9, и, наконец, ответ будет (8+9) = 17.

person Nitya    schedule 13.06.2016

Оценка выражения идет слева направо

i=9;
First --i than i=9-1, i=8
After ++i than i=8+1, i=9
--i + ++i  = 17
person Icon Technology    schedule 05.02.2017
comment
На этот вопрос уже был дан ответ и объяснение, так что вы намеревались сделать это снова? - person Tom; 05.02.2017