++ я + ++ я + ++ я в Java против C - PullRequest
       10

++ я + ++ я + ++ я в Java против C

5 голосов
/ 07 октября 2010
int i=2;
i = ++i + ++i + ++i;

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

Ответы [ 4 ]

26 голосов
/ 07 октября 2010

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;

В Си поведение неопределенного изменения переменной дважды без точки последовательности между ними.

17 голосов
/ 07 октября 2010

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

5 голосов
/ 07 октября 2010

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

РЕДАКТИРОВАТЬ: Я удивлен, что этот ответ на одно предложение был моим самым результативным ответом за вечер (по сравнению с дюжиной других ответов, которые я разместил, некоторые со страницами примеров кода). Такова жизнь.

4 голосов
/ 07 октября 2010

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

...