Проверка возвращаемого значения функции без оператора return - PullRequest
2 голосов
/ 10 июля 2011

Используя приведенный ниже пример, объясните, почему иногда не требуется возвращать оператор?Функция имеет тип возврата, но оператор возврата отсутствует.Между тем, программа компилируется и работает нормально.

Пожалуйста, помогите мне лучше понять это

      5 
      6 char* handleInput() {
      8     fgets(buffer, 1024, stdin);
      9 **//    return buffer;**       <---- COMMENTED RETURN
     10 }
     11 
     12 void main() {
     14         char* ptr = handleInput();
     15         int flag = atoi(ptr);    
     16         if (flag < 0) break;    
     17         printf("You entered: %s\n", ptr);
     20 }

Ответы [ 3 ]

10 голосов
/ 10 июля 2011

В основном то, что возвращается - немая удача.Вы получаете то, что происходит в регистре процессора, когда он возвращается.Если, например, возвращаемое значение будет в AX, а char* окажется в AX, вам повезло.Я считаю, что это неопределенное поведение;то есть спецификации языка C не говорят, что вам следует , так что это остается за компиляторомЯ удивлен, что современный компилятор по крайней мере не выдаст вам предупреждение.

1 голос
/ 10 июля 2011

C99 6.9.1 / 12 «Определения функций» гласит:

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

C90 6.6.6.4 Стандарт «выражение return» говорит что-то с эффектом simialr:

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

Таким образом, возврат из функции без возврата чего-либо из функции разрешен, но вызывающей функции не разрешено использовать «результат» вызова функции. Это неопределенное поведение, и, как упоминалось в других ответах, вы можете получить «ожидаемые» результаты с неопределенным поведением, но это только случайно.

Я полагаю, что обоснование этого заключается в том, что предстандартный C по умолчанию имеет тип возврата int для функций, если функция не была явно объявлена ​​(или если в объявлении опущен тип возврата), и это продолжало оставаться поддерживается, когда C был стандартизирован. Многие из этих функций были предназначены для вызова только для побочных эффектов, которые они вызывали, и возвращаемое значение не ожидалось и не было предоставлено.

Пара примечаний:

  • gcc предупредит об этом, если используется опция -Wall. MSVC предупреждает об этом по умолчанию.
  • вы должны получить сообщение об ошибке компилятора о строке if (flag < 0) break;, поскольку break не находится в цикле или переключателе.
  • main() должен вернуть int, а не void (-Wall также предупредит об этом). Конечно, вы также должны явно возвращать некоторое значение ...
0 голосов
/ 10 июля 2011

Не использовать 'return' в функции, объявленной для возврата значения, по меньшей мере, плохая практика. Большинство компиляторов должны генерировать предупреждение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...