Запятая оператор и пустое выражение
Я наткнулся на этот фрагмент кода 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 говорит: "(Пустое выражение оценивается на предмет его побочных эффектов.)" Таким образом, функция оценивается и действительно выходит за пределы. Там нет выхода из тюрьмы без карты.