Подтвердить что ты не робот

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)

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

4b9b3361

Ответ 1

Ссылка, которую вы указали в вопросе, приведен неверный пример поведения undefined. Оценка f1 и f2 в f1() + f2() будет неуказана. Обратите внимание, что стандарт говорит о побочных эффектах и порядке оценки

Порядок оценки подвыражений и порядок , в котором происходят побочные эффекты [...]

Побочные эффекты (вывод на stdout) при оценке f1 и f2 не связаны, и они не вызывают поведения undefined.

Это не отличается от приведенного ниже примера

int a = 1;
int b = 1, c;

c = a + b;

Порядок оценки a и b не указан в выражении a + b.