Запятая оператор и пустое выражение - PullRequest
8 голосов
/ 23 марта 2011

Я наткнулся на этот фрагмент кода 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.

Ответы [ 3 ]

6 голосов
/ 24 марта 2011

Имеющаяся у меня C-спецификация (C99 TC3) гласит:

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

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

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

3 голосов
/ 23 марта 2011

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

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

1 голос
/ 23 марта 2011

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

...