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++, и две из них:

  1. Каждая программа должна иметь ровно одну вызываемую функцию main() (в глобальном масштабе).
  2. Эта функция должна возвращать 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
Другие вопросы по тегам