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;
В C, это неопределенное поведение, чтобы изменить переменную дважды без точки последовательности между ними.
Это странно; когда я компилирую его в C, мой компилятор танцует, как неопределенный цыпленок. –
почему -1? Это не вопрос? В любом случае @Strilanc, какой компилятор вы используете? – Manny
Если вы действительно видите это в своем коде, я думаю, что лучше реорганизовать это! – romaintaz