Почему возврат 0 необязателен? - PullRequest
11 голосов
/ 10 ноября 2010

Почему, если я пишу

int main() 
{ 
    //... 
}

, мне не нужно писать return 0; в конце функции main?Компилятор делает это для меня?

Я использую GCC / C99.

Ответы [ 4 ]

19 голосов
/ 10 ноября 2010

C99 и C ++ особый случай: функция main возвращает 0, если управление достигает конца без явного возврата.Это только относится к функции main.

Соответствующий бит спецификации C99 равен 5.1.2.2.3 для main особого случая

5.1.2.2.3 Завершение программы

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

6.9.1 / 12

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

Вы можете проверить это с помощью gcc:

int foo ( void ) { }
int main( void ) { }

C89 mode (ошибки дляобе функции):

sandiego:$ gcc src/no_return.c -std=c89 -Wall 
src/no_return.c: In function ‘main’:
src/no_return.c:2: warning: control reaches end of non-void function
src/no_return.c: In function ‘foo’:
src/no_return.c:1: warning: control reaches end of non-void function

Режим C99 (основной - это особый случай):

sandiego:$ gcc src/no_return.c -std=c99 -Wall
src/no_return.c: In function ‘foo’:
src/no_return.c:1: warning: control reaches end of non-void function
14 голосов
/ 10 ноября 2010

Самый последний C (в настоящее время это C99 с некоторыми изменениями) возвращает 0 из main по умолчанию, если нет явного оператора return в конце функции, и управление вытекает из конца функции (см. 5.1.2.2.3 в C99 TC3 ).Это потому, что чаще всего в любом случае можно написать такую ​​форму возврата.

В C89 вам нужно что-то вернуть туда - у него нет такого неявного возврата.Но компилятор ни в коем случае не обязан диагностировать такую ​​ошибку (см. 3.6.6.4 в C89 и 6.9.1 / 12 в *1009* C99 TC3 ).

2 голосов
/ 10 ноября 2010

Да. main в C - это особая функция, которая имеет некоторые дополнительные правила. См. Параграф в стандарте C99 о его прекращении ниже. По сути, это говорит о том, что если вы выходите из функции без возврата значения, это эквивалентно, как если бы вы дали возвращаемое значение 0. Это специально для main, делая это с другими функциями, где вызывающая функция ожидает, что возвращаемое значение может (и будет) вызывать сбой вашей программы.

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

0 голосов
/ 10 ноября 2010

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

Обратите внимание, что C99 требует, чтобы функции, которые объявляют не-1004 * возвращаемые типы, всегда завершались нажатием оператора return.Так что, если вы компилируете, используя режим C99 вашего компилятора, этот код приведет к ошибке во время компиляции.

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