Цитата из Блог Эрика Липперта :
Оценка арифметического выражения контролируется тремя наборами правил: правилами приоритета, правилами ассоциативности и правилами порядка.
Правила приоритета описывают, как заключить в нижеследующее выражение выражение, когда выражение смешивает разные типы операторов.
Правила ассоциативности описывают, как должно быть заключено в нижеследующее выражение, когда выражение имеет связку одного и того же оператора.
Порядок правил оценки описывает порядок, в котором оценивается каждый операнд в выражении.
blockquote>Более высокий приоритет приводит к группировке операндов с помощью оператора и не означает оценку операндов. Это порядок оценки, который определяет последовательность оценки подвыражений в выражении.
Обновление:
Как я вижу, многие программисты считают, что оператор
a = ++a * ( ++a + 5);
будет вызывать неопределенное поведение. Да, он будет вызывать UB, если нет гарантии порядка оценки операндов оператора.
Но это не так в контексте языка Java-программирования. Он имеет четко определенное поведение в java (а также в C #). Спецификация языка Java гласит, что:
15.7. Порядок оценки
Язык программирования Java гарантирует, что операнды операторов, по-видимому, оцениваются в определенном порядке оценки, а именно слева направо.
blockquote>Пример 15.7.1-1. Левый операнд оценивается сначала
В следующей программе оператор
*
имеет левый операнд, который содержит назначение переменной и правый операнд, содержащий ссылку к той же переменной. Значение, созданное ссылкой, будет отражать тот факт, что назначение произошло первым.class Test1 { public static void main(String[] args) { int i = 2; int j = (i=3) * i; System.out.println(j); } }
Эта программа производит вывод:
9
Не разрешено для оценка оператора
blockquote>*
для получения 6 вместо 9 .Но, по-прежнему спецификация java четко заявляет, что не писать такие коды:
Рекомендуется, чтобы код не опирался на эту спецификацию. Код обычно более ясен, когда каждое выражение содержит не более одного побочного эффекта, как его внешнюю операцию, и когда код не зависит от того, какое именно исключение возникает из-за оценки выражений слева направо.
BLOCKQUOTE>