Java гарантирует ( §15.7.1 ), что он будет оцениваться слева направо, давая 12. В частности, ++
имеет более высокий приоритет, чем +
. Сначала он связывает их, затем связывает операции сложения слева направо
i = (((++i) + (++i)) + (++i));
§15.7.1 говорит, что левый операнд вычисляется первым, а §15.7.2 говорит, что оба операнда вычисляются перед операцией. Таким образом, он оценивает как:
i = (((++i) + (++i)) + (++i));
i = ((3 + (++i)) + (++i)); // i = 3;
i = ((3 + 4) + (++i)); // i = 4;
i = (7 + (++i)); // i = 4;
i = (7 + 5); // i = 5;
i = 12;
В Си поведение неопределенного изменения переменной дважды без точки последовательности между ними.