У меня есть небольшой код, но я не мог понять, почему вывод такой.
Вот
#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 нет.