Comma-оператор и выражение void

Я наткнулся на этот fragment кода 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: Это не пример реальной жизни.

Мой вопрос: « Является ли поведение fragmentа кода хорошо определенным в C и C ++? »

Мой прием:

В C поведение хорошо определено, поскольку 6.5.17 говорит

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

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

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

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

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

Аналогично в C

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

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

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

C spec, который у меня есть (C99 TC3), говорит

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

Значение выражения, которое называется «оцененным как выражение void», отбрасывается. Поэтому в случае C нет неопределенного поведения. Возможно, он отличается от старого C (некоторые детали, если я правильно помню).

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

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

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

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