main () возвращает целое число?
В настоящее время я читаю, что функции в C++. В нем говорится, что они являются "артефактами, которые позволяют вам разделить содержимое вашего приложения на функциональные блоки, которые могут быть вызваны в последовательности по вашему выбору. Функция, когда она вызывается, обычно возвращает значение вызывающей функции".
Затем он говорит, что main() распознается компилятором как отправная точка вашего приложения на C++ и должен возвращать int (целое число).
Я не знаю, что означает "должен вернуть целое число". Из моего (крайне ограниченного опыта) int main () - это запуск вашего приложения. Но что означает "должен вернуть int"? Это также переплетается со мной, не понимая, "как правило, возвращает значение вызывающей функции"
5 ответов
Как и в математике, в C++ функции возвращают значения. Все функции в C++ должны точно указывать, какой тип значения они возвращают, и каждая функция должна возвращать только один тип вещи. В некоторых случаях этот "один тип вещей" может быть ничем, что обозначается в C++ ключевым словом void
,
Каждая функция должна объявить, что она возвращает. Это делается через объявление функции. Вот несколько примеров:
int foo();
void bar();
string baz();
int main();
4 объявления функций. foo
возвращает int
, bar
ничего не возвращает, baz
возвращает string
(который объявлен в стандартной библиотеке C++), и main
возвращает int.
Каждая функция должна не только объявлять, что она возвращает, но и возвращать вещи такого типа. Если ваша функция возвращает void
тогда вы можете написать:
void bar()
{
return;
}
... или просто ничего не делать
void bar()
{
}
Если ваша функция возвращает что-либо кроме void
тогда вы должны иметь return
утверждение, которое возвращает этот тип вещи:
int foo()
{
return 42;
}
Если вы объявляете функцию, возвращающую один тип вещи, но затем пытаетесь вернуть другой тип вещи, то либо должен быть способ неявного преобразования того, что вы пытаетесь преобразовать, в то, что объявлена функция для возврата. Если нет возможности неявного преобразования, ваша программа не будет компилироваться. Рассматривать:
int foo()
{
return "foobar rulez!";
}
Вот, foo
объявлено о возвращении int
, но я пытаюсь вернуть строку (не string
из стандартной библиотеки, но в старом стиле C const char*
строка. `" Фубар Рулез!" здесь называется строковым литералом.)
Можно написать код, обеспечивающий неявное преобразование, о котором я упоминал ранее, но если вы точно не знаете, зачем вам это нужно, лучше не путаться во всем этом прямо сейчас.
Что вы делаете со значениями, которые возвращаются из функций? Опять же, как и в математике, вы можете использовать эти значения где-то еще в вашей программе.
#include <cstdlib>
#include <iostream>
int foo()
{
return 42;
}
int main()
{
int answer = foo();
std::cout << "The answer to Life, the Universe and Everything is...\n"
<< answer << "!\n";
return 0;
}
Очевидно, что вы ничего не можете сделать со значением, которое возвращается из функции, которая возвращает void
, потому что функция, которая возвращает void
на самом деле ничего не возвращает. Но эти виды функций полезны для выполнения каких-то задач на стороне.
#include <cstdlib>
#include <iostream>
int theAnswer = 0;
void DeepThought()
{
theAnswer = 42;
}
int foo()
{
return theAnswer;
}
int main()
{
DeepThought();
int answer = foo();
std::cout << "The answer to Life, the Universe and Everything is...\n"
<< answer << "!\n";
return 0;
}
Хорошо, вернемся ко всему этому бизнесу с main
,
main
это функция в C++. Есть несколько вещей о main
которые делают его особенным по сравнению с другими функциями в C++, и две из них:
- Каждая программа должна иметь ровно одну вызываемую функцию
main()
(в глобальном масштабе). - Эта функция должна возвращать
int
Есть еще одна вещь о main
это немного особенное и, возможно, сбивает с толку. Вам на самом деле не нужно писать return
заявление в main
* даже если объявлено, что оно возвращает int
, Рассматривать:
int main()
{
}
Обратите внимание, что здесь нет возврата. Это законно и допустимо в C++ для main
, но main
это единственная функция, где это разрешено. Все остальные функции должны иметь явное return
заявление, если они не вернутся void
,
Так что насчет возвращаемого значения из main()
? Когда вы запускаете программу на компьютере с Windows или Linux, программа возвращает значение операционной системе. Что это значение означает, зависит от программы, но в целом значение 0
означает, что программа работала без проблем. Значение, отличное от 0
часто означает, что программа не работает, и точное значение на самом деле является кодом того, что пошло не так.
Скрипты и другие программы могут использовать эти возвращаемые значения, чтобы решить, что делать дальше. Например, если вы написали программу для переименования файла MP3 на основе номера исполнителя и дорожки, ваша программа может вернуться 0
если это сработало, 1
если он не мог понять художника, и 2
если он не может выяснить номер дорожки. Вы можете вызвать эту функцию в сценарии, который переименовывает, а затем перемещает файлы. Если вы хотите, чтобы ваш скрипт завершил работу, если произошла ошибка при переименовании файла, он может проверить эти возвращаемые значения, чтобы увидеть, работает ли он или нет.
- нет явного оператора возврата в
main
: В случаях, когдаmain
не имеет явногоreturn
определено для возврата значения0
,
Хотя это может выглядеть так, когда вы программируете на C или C++, main
это на самом деле не "первое, что происходит". Как правило, где-то в кишечнике библиотеки времени выполнения C или C++ есть вызов main
, которая запускает вашу программу. Когда ваша программа закончена и возвращается из main
, он вернет значение (в C++, если вы что-то не указали, компилятор автоматически добавит return 0
), и это возвращаемое значение используется для обозначения "успеха" программы.
В Unix/Linux и т. Д. Это используется как $?
, так что вы можете echo $?
после запуска программы, чтобы увидеть, что был "результат" - 0 означает "все прошло хорошо", другие значения используются для "сбой". В окнах есть ERRORLEVEL
переменная в пакетных сценариях и т. д., которую можно использовать для просмотра результата последней команды.
Редактировать: если ваш код вызывает другую программу, например, через CreatProcess в Windows, или fork()/exec()
в стиле Unix OS (или функции времени выполнения C spawn
и братьев и сестер почти в любой ОС), возвращаемое значение из main
новый процесс завершается и становится доступным для процесса владения. Конец Редактировать.
Так как даже в C++ main
является функцией стиля "C", если вы изменяете тип возвращаемого значения, оно по-прежнему имеет то же имя, поэтому компоновщик / компилятор не может "обнаружить", что он имеет неправильный тип возвращаемого значения, и некоторые странные вещи произойдут, если вы объявите void main()
, std::string main()
или же float main()
или что-то кроме int main()
- он все равно скомпилируется, но что происходит в коде вызова main
будет неопределенным поведением - это означает, что "может случиться почти все".
Да, main
всегда должен возвращать int
, это может быть использовано, чтобы показать, если программа работает успешно, обычно 0
представляет успех, ненулевое значение представляет некоторый вид отказа.
Например, в Linux вы можете вызывать вашу программу в скрипте bash, а в этом скрипте запускать различные команды для возврата статуса вашей программы.
Это то, как вы сообщаете операционной системе о состоянии завершения программы, независимо от того, была она успешно запущена или нет. Например, в Linux вы можете использовать следующую команду:
echo $?
получить статус выхода из программы, которая запускалась ранее.
Это означает, что в подписи main()
тип возврата int
:
int main();
int main(int argc, char const *argv[]);
Теперь, какое значение вы бы вернули из main()
есть вопрос. Ну, возвращаемое значение на самом деле является состоянием выхода, которое указывает среде выполнения, является ли main()
выполняется успешно или неудачно.
В Linux я обычно возвращаюсь EXIT_SUCCESS
или же EXIT_FAILURE
в зависимости от случаев. Это макросы, определяемые <cstdlib>
,
int main()
{
//code
if ( some failure condition )
return EXIT_FAILURE;
//code
return EXIT_SUCCESS;
}
Согласно документу:
#define EXIT_SUCCESS /*implementation defined*/
#define EXIT_FAILURE /*implementation defined*/
Макросы EXIT_SUCCESS и EXIT_FAILURE расширяются до интегрального выражения и показывают состояние выполнения программы.
Constant Explanation EXIT_SUCCESS successful execution of a program EXIT_FAILURE unsuccessful execution of a program