2010-10-07 6 views
5

Можно создать дубликат:
How do we explain the result of the expression (++x)+(++x)+(++x)?++ я + ++ + ++ я я в Java против C

int i=2; 
i = ++i + ++i + ++i; 

Что является более правильным? Результат Java 12 или C = 13. Или, если не вопрос правильности, просьба уточнить. Спасибо.

+13

Это странно; когда я компилирую его в C, мой компилятор танцует, как неопределенный цыпленок. –

+1

почему -1? Это не вопрос? В любом случае @Strilanc, какой компилятор вы используете? – Manny

+3

Если вы действительно видите это в своем коде, я думаю, что лучше реорганизовать это! – romaintaz

ответ

16

Нет ничего более правильного. Он фактически не определен и называется «Ошибка последовательности». http://en.wikipedia.org/wiki/Sequence_point

+1

Спасибо, я просвещен термином «Ошибка последовательности в последовательности». – Manny

+1

+1, очень приятно. – JoshD

+15

Он хорошо определен на Java. –

4

В C это неопределенное поведение. Нет правильного.

5

Результат Java имеет смысл для меня, потому что операторы дают результат, которого вы ожидаете, но никакая серьезная программа не должна содержать такого утверждения.

EDIT: Я рад, что этот ответ на один из предложений был моим самым высоким набранным ответом на вечер (по сравнению с десятком других ответов, которые я опубликовал, некоторые со страницами образцов кода). Такова жизнь.

26

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, это неопределенное поведение, чтобы изменить переменную дважды без точки последовательности между ними.

+0

Незначительный вопрос - действительно ли здесь справа налево? В этом примере может ли другой порядок дать другой результат? Я полагаю, что это более уместно для таких утверждений, как 'i = (i * = 2) + (i * = 3) + (i * = 4);', где порядок имеет значение. – Kobi

+0

Спасибо, @Potatoswatter. –

+0

@ Kobi, на самом деле, но я надеюсь, что объяснение более простых случаев помогает людям работать над более сложными. –