Я наткнулся на этот фрагмент кода 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 ++? "
Мой дубль:
В Си поведение хорошо определено, потому что 6.5.17
говорит
Левый операнд оператора запятой оценивается как void выражение ; после оценки есть точка последовательности
В C ++ 03 поведение хорошо определено, потому что 5.18
говорит
Пара выражений, разделенных запятой, оценивается слева направо, а значение левого выражения равно отброшено .
Однако C ++ 03 (в разделе 6.6.3
) также говорит, что
Вывод из конца функции эквивалентен возврату без значения; это приводит к неопределенному поведению в функции, возвращающей значение.
Аналогично в C
Если управление достигает конца (}
) не пустой функции (кроме main()
), поведение не определено.
Итак, принимая во внимание все эти моменты, я не могу судить о реальном поведении. Что вы, люди, думаете?
P.S .: Если вы считаете, что вопрос бесполезен, и у вас есть более важные дела, помогите себе: D.