В основной функции программы на С++ что означает `return 0` и что означает?
Возможный дубликат:
Какова правильная декларация основного?
Не ссылаясь на какой-либо код в частности, я ищу объяснение приведенного ниже примера:
#include <iostream>
int main()
{
std::cout << "Hello world" << std::endl;
return 0;
}
Я не понимаю, что делает return 0
. Не могли бы вы объяснить это на простом английском языке?
Ответы
Ответ 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" означает "успех", а любой другой код сигнализирует об ошибке...