Undefined или неуказанное поведение?
Я читал эту статью, и они используют следующий пример, чтобы объяснить поведение undefined:
// PROGRAM 1
#include <stdio.h>
int f1() { printf ("Geeks"); return 1;}
int f2() { printf ("forGeeks"); return 1;}
int main()
{
int p = f1() + f2();
return 0;
}
Однако, похоже, это порядка, в котором оцениваются подвыражения, и согласно стандарту C (Приложение J.1) это неопределенное поведение, а не поведение undefined:
Неопределенное поведение: Порядок, в котором оцениваются подвыражения, и порядок, в котором побочные эффекты имеют место, кроме как указано для функции-вызова(), & &, ||,?:, и запятая операторы (6.5)
Поскольку я очень новичок в чтении официальных спецификаций, мне интересно, не понял ли я пример или документацию. Я знаю, что это может показаться очень педантичным, но я заинтересован в том, чтобы правильно изучить эти продвинутые темы.
Ответы
Ответ 1
Ссылка, которую вы указали в вопросе, приведен неверный пример поведения undefined. Оценка f1
и f2
в f1() + f2()
будет неуказана. Обратите внимание, что стандарт говорит о побочных эффектах и порядке оценки
Порядок оценки подвыражений и порядок , в котором происходят побочные эффекты [...]
Побочные эффекты (вывод на stdout) при оценке f1
и f2
не связаны, и они не вызывают поведения undefined.
Это не отличается от приведенного ниже примера
int a = 1;
int b = 1, c;
c = a + b;
Порядок оценки a
и b
не указан в выражении a + b
.