Запятая оператор и пустое выражение

Я наткнулся на этот фрагмент кода 1

int return_printChar1()
{
    // code
    // oops! no return statement
}
int return_printChar2()
{
    // code
    return printf("Return");
}
int main()
{  
   int i;
   // some more code
   i = return_printChar2();
   if((return_printChar1(),i))
   {
      printf ("Gotcha");
   }
}

1: Это не пример из реальной жизни.

У меня вопрос: "Хорошо ли определено поведение фрагмента кода в C и C++?"

Мой дубль:

В C поведение хорошо определено, потому что 6.5.17 говорит

Левый операнд оператора запятой оценивается как пустое выражение; после его оценки есть точка последовательности

В C++03 поведение хорошо определено, потому что 5.18 говорит

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

Однако C++03 (в разделе 6.6.3) также говорит, что

Выпуск из конца функции эквивалентен возврату без значения; это приводит к неопределенному поведению в функции, возвращающей значение.

Точно так же в C

Если контроль достигает конца (}) непустой функции (кроме main()) поведение не определено.

Поэтому, принимая во внимание все эти моменты, я не могу судить о реальном поведении. Что вы, люди, думаете?

PS: Если вы считаете, что вопрос бесполезен, и у вас есть более важные дела, помогите себе: D.

3 ответа

Решение

У меня есть спецификация C (C99 TC3)

Если}, который завершает функцию, достигнут, и вызывающая сторона использует значение вызова функции, поведение не определено.

Значение выражения, которое называется "оценивается как пустое выражение", отбрасывается. Таким образом, в случае C не существует неопределенного поведения. Возможно, в старом Си все было иначе (некоторые детали, если я правильно помню).

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

Это неопределенное поведение.

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

Это явно не определено. C99 §6.3.2.2 говорит: "(Пустое выражение оценивается на предмет его побочных эффектов.)" Таким образом, функция оценивается и действительно выходит за пределы. Там нет выхода из тюрьмы без карты.

Другие вопросы по тегам