c оценка и передача параметров функции

У меня есть небольшой код, но я не мог понять, почему вывод такой.
Вот

#include  int f(int i, int j, int k); int main(int argc, char const *argv[]) { int a; printf("enter a\n"); scanf("%d",&a); f(a,a++,a++); printf("%d \n",a ); return 0; } int f(int i, int j, int k) { printf("function arguments \n"); printf("%d %d %d\n",i,j,k ); } 

вход: 4
выход: 6 5 4

Принятый ответ в отмеченном дубликате неверен.


 f(a,a++,a++); 

Причины Неопределенное поведение . Он пытается изменить аргумент a без промежуточной точки. Кроме того, важно отметить, что порядок оценки аргументов функции Unspecified . Может быть:

  • Слева направо или
  • Право налево или
  • Любой магический порядок, который выбирает компилятор.

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


В GCC Если вы скомпилируете свою программу на строгих уровнях предупреждения, компилятор даст вам эту диагностику:

prog.c: 10: 18: ошибка: операция с ‘a’ может быть неопределенной [-Werror = sequence-point]
prog.c: 10: 18: ошибка: операция с ‘a’ может быть неопределенной [-Werror = sequence-point]


Ссылка:

C99 Стандарт §6.5.2.2:
Параграф 10:

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

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

f(a,a++,a++); похоже на неопределенное поведение, потому что:

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

Когда вы используете неопределенное поведение, требований стандарта C нет.