Ниже приведен код, который я запускаю в ubuntu 13.10. Код: -
#include<stdio.h>
main()
{
int i=10,j=10;
i=i++ + ++j;
printf("i=%d j=%d\n",i,j);
j=++i + j++;
printf("i=%d j=%d\n",i,j);
}
Вывод: -
i=21 j=11
i=22 j=33
Логически, согласно правилам ans должно быть: -
i=22 j=11
i=23 j=35
И когда я запускаю этот код в ubuntu 12.10, я получаю правильный ответ, т.е. выше ans. Пожалуйста, объясните, что происходит ??
Это - типичный результат неопределенного или зависящего от реализации поведения. Когда Ваше выражение изменяет переменную на обоих сайтах уравнения (среди многих других ситуаций), Вы в основном делаете его неправильно. Просто, потому что это "работает" с одним релизом компилятора, не означает, что это даст тот же ответ в следующем выпуске. Прочитайте спецификацию языка тщательно для наблюдения, какие вещи являются неопределенными или зависящими от реализации, и избегают их. Никакой ответ не "корректен", они не определены. Различные ответы могут даже быть инициированы различной оптимизацией того же компилятора.
<час>На практике, необходимо использовать флаги предупреждения компилятора и инструмент статического анализа как valgrind или Очистить для установки флага этих видов вещей. И пока Вы не понимаете значение условий как "Lvalue", и "Rvalue", просто с помощью таблицы приоритета оператора не действительно достаточен для понимания то, что продолжает часть из пред/сообщение фиксация incre/decre операторы.