Почему переменные возвращают предыдущее значение после увеличения в том же выражении?
Просто объясните, почему это происходит во 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
слева направо Это не верно!
Порядок оценки параметров функции не определен.
В вашем конкретном примере кажется, что порядок справа налево.