Почему переменные возвращают предыдущее значение после увеличения в том же выражении?

Просто объясните, почему это происходит во 2-й строке:

int i=5; 
printf(" Before %d then operated %d and after %d", i, ++i, i); // Before 6 then operated 6 and after 5
printf("\n And now %d", i); //And now 6

Насколько я узнал, результат должен быть до 5, затем оперирован 6 и после 6. Я не мог объяснить, у кого я учусь.. Я новичок в C

протестировано в Borland C++ 5 и кодовых блоках...

2 ответа

Решение

Порядок оценки параметров функции не определен и определяется типом аргумента, соглашением о вызове вызываемой функции, оптимизацией, архитектурой и компилятором.

От стандарта C99:

6.5.2.2 Вызовы функций

Порядок вычисления обозначения функции, фактических аргументов и подвыражений внутри фактических аргументов не определен, но перед фактическим вызовом есть точка последовательности.


Просто чтобы добавить немного опыта (заимствовано здесь).
Следующий код:

int i=1;
printf("%d %d %d\n", i++, i++, i);

результаты в

2 1 3 - используя g++ 4.2.1 в Linux.i686
1 2 3 - с помощью SunStudio C++ 5.9 в Linux.i686
2 1 3 - используя g++ 4.2.1 на SunOS.x86pc
1 2 3 - с помощью SunStudio C++ 5.9 на SunOS.x86pc
1 2 3 - используя g++ 4.2.1 на SunOS.sun4u
1 2 3 - используя SunStudio C++ 5.9 в SunOS.sun4u

Вы, вероятно, думаете, что порядок оценки в printf слева направо Это не верно!

Порядок оценки параметров функции не определен.

В вашем конкретном примере кажется, что порядок справа налево.

Другие вопросы по тегам