Подтвердить что ты не робот

В основной функции программы на С++ что означает `return 0` и что означает?

Возможный дубликат:
Какова правильная декларация основного?

Не ссылаясь на какой-либо код в частности, я ищу объяснение приведенного ниже примера:

#include <iostream>

int main()
{
    std::cout << "Hello world" << std::endl;
    return 0;
}

Я не понимаю, что делает return 0. Не могли бы вы объяснить это на простом английском языке?

4b9b3361

Ответ 1

Это определяет статус выхода процесса. Несмотря на то, что он является int, в Unix-подобных системах, значение всегда находится в диапазоне 0-255 (см. Выход и статус выхода), В системах Microsoft вы можете использовать 32-разрядные целые числа со знаком в качестве кодов выхода, которые вы можете проверить с помощью %ERRORLEVEL%. Для портативности я рекомендую придерживаться диапазона 0-255.

Вот тривиальный пример:

$ cat -n exit_code.cpp 
     1  int main()
     2  {
     3      return 42;
     4  }
     5  

Сборка:

$ make exit_code
g++ exit_code.cpp -o exit_code

Запуск (в bash):

$ ./exit_code

Проверьте статус выхода:

$ echo $?
42

Обычно статус нуля означает успех и ненулевой сбой. Это может быть полезно в сценариях оболочки и т.д., Чтобы указать уровень сбоя, если таковой имеется:

$ ./exit_code
exit_status=$?
if [[ ${exit_status} ]] ; then
    echo "The process failed with status ${exit_status}."
else
    echo "Success!"
fi
The process failed with status 42.

Следуя комментариям ниже...

В стандартном С++ header <cstdlib> определены следующие макросы:

#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1

Тем не менее, Exit Status в разделе GNU C Документация библиотеки, описывающая те же макросы, sagely:

Заметка о переносимости: некоторые не-POSIX-системы используют разные соглашения для значений статуса выхода. Для большей переносимости вы можете использовать макросы EXIT_SUCCESS и EXIT_FAILURE для обычного значения статуса для успеха и отказа соответственно. Они объявлены в файле stdlib.h.

Ответ 2

Общие return ing

Каждая функция имеет тип возврата.

В приведенном ниже примере тип void, который является "неполным типом" без значений; используя это как возвращаемый тип, означает, что функция не возвращает значение:

void foo() {
   std::cout << "Hello world\n";
}

Однако в приведенном ниже примере возвращаемый тип int:

int foo() {
   return 3;
}

Оператор return определяет, какое значение вызовет функция foo. Таким образом, std::cout << foo() приведет к печати "3" на стандартный вывод.


return от main, в частности

Когда функция, о которой идет речь, оказывается "основной" функцией или точкой входа в программу, она немного более специфична, потому что "возвращаемое значение" "основной" функции считается программой "код выхода", — он сообщает вызывающей среде (например, сеанс терминала), было ли выполнение программы считаться успешным. Он должен быть int, а значение 0 означает "все пошло нормально":

Стоит отметить, что вы действительно можете полностью опустить return 0; в "главную" функцию, поскольку она будет включена неявно. Это не поможет вам, однако, если вы хотите return 1; или какое-то другое значение, и оно не вступает в игру с другими функциями.


Цитирование

[C++11: 3.6.1/5]: Оператор возврата в main имеет эффект оставляя основную функцию (уничтожая любые объекты с автоматическим время хранения) и вызов std::exit с возвращаемым значением как аргумент. Если управление достигает конца main, не встречая return, эффект заключается в выполнении return 0;

[C++11: 18.5/8]:

       [[noreturn]] void exit(int status)

Функция exit() имеет дополнительное поведение в этом международном стандарте:

  • Во-первых, объекты с продолжительностью хранения потоков и связаны с текущим потоком.
    Затем уничтожаются объекты со статическим временем хранения и вызываются функции, зарегистрированные путем вызова atexit. См. 3.6.3 для порядка разрушений и вызовов. (Автоматические объекты не уничтожаются в результате вызова exit().)
    Если элемент управления оставляет зарегистрированную функцию, вызванную exit, потому что функция не предоставляет обработчик для вызванного исключения, terminate() должен вызываться (15.5.1).
  • Затем все открытые потоки C (опосредуемые сигнатурами функций, объявленными в <cstdio>), с неписаными буферизованными данными очищаются, все открытые потоки C закрываются, а все файлы, созданные вызовом tmpfile(), удаляются.
  • Наконец, управление возвращается в среду хоста. Если статус равен нулю или EXIT_SUCCESS, возвращается форма завершения успешного завершения статуса. Если статус EXIT_FAILURE, возвращается форма выполнения неудачного завершения статуса. В противном случае возвращаемый статус определяется реализацией.

Bootnote

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

Ответ 3

Используется, потому что вы можете использовать свою программу в качестве инструмента командной строки. Если есть еще один процесс, ожидающий выхода вашей программы, вы можете выбрать 0, если все будет успешным, -1, если была ошибка или любая другая константа, в соответствии с тем, что вы хотите сообщить.

Ответ 4

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

Операционная система - босс, программа - это вы. И все return 0 действительно сообщает операционной системе, что все прошло хорошо.

Ответ 5

В окнах вы можете проверить возвращаемое значение следующим образом (в пакете script):

MyAppTest.exe
@if "%ERRORLEVEL%" == "0" goto success
 echo Failure
 goto end
:success
 echo Success
:end

Ответ 6

Возврат из main() имеет тот же эффект, что и вызов std::exit() и передача возвращаемого значения в качестве параметра status.

Поведение std::exit подробно описано в разделе 18.5 ([support.start.term]) и описывает код состояния:

Наконец, управление возвращается в среду хоста. Если статус равен нулю или EXIT_SUCCESS, возвращается форма завершения успешного завершения статуса. Если статус EXIT_FAILURE, возвращается форма определения неудачного завершения статуса. В противном случае возвращаемый статус определяется реализацией.

Ответ 7

return используется для выхода из функции. Возврат значения 0 просто позволяет ему выйти с кодом: 0. Кроме того, возврат с 0 утверждает успешный выход приложения.

Ответ 8

0 - целое число.

Ваша основная функция должна вернуть целое число.

Просто посмотрите:

int main()

int означает целое число и return в этом случае возвращает 0: целое число для завершения программы.

Обычно для ошибки вы должны вернуть 1; 0 - это традиционное значение для успеха.

Ответ 9

Зависит от операционной системы, но код выхода 0 означает успех в UNIX, VMS и Windows

Ответ 10

Возвращаемое значение из основной функции возвращается вызывающему приложению или процессу (много раз это оболочка script). Возвращаемое значение используется для сигнализации статуса выхода приложения.

Нет никаких упрощенных правил в отношении того, каково должно быть возвращаемое значение, но по соглашению возвращаемое значение нуля означает нормальный выход приложения. Любое ненулевое значение означает аномальный выход приложения.

Ответ 11

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

Для простого приложения, которое не имеет кодов статуса или ошибок, большинство людей return 0 для обычного выхода приложения (обычно успеха) и return 1, если приложение. не выполняется должным образом.

Ответ 12

В современной операционной системе каждая программа выйдет с определенным "кодом выхода".

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ № 1: Фактическая спецификация этой концепции (наличия кода выхода вообще отсутствует) вообще не выходит за рамки любой спецификации языка программирования. Итак: ЛЮБОЙ, спрашивая меня снова о ссылке на стандарт, может, пожалуйста, отступить в себя и подумать о лучшем ответе на данный момент.

DISPLAIMER NO 2: Фактические значения этих кодов выхода не указаны в не актуальной "спецификации языка программирования", поскольку это выходит за рамки "спецификации языка программирования".

До тех пор, практика показала, что код выхода "0" означает "успех", а любой другой код сигнализирует об ошибке...