Нужно ли возвращать ноль из main, и как может быть полезно возвращаемое значение из main? - PullRequest
5 голосов
/ 25 сентября 2010

Я знаю, что в C89 всегда принято возвращать целочисленное значение 0 из main в программе на C, например:

int main() {

    /* do something useful here */

    return 0;
}

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

Полагаю, это полезный результат возврата, если вы связываете вывод этой программы с вводом другой, но я не уверен. Я никогда не находил это полезным, или, может быть, я просто не понимаю, каково это намерение.

Мои вопросы:

  1. Всегда ли необходимо возвращать ноль из программы на C?
  2. Чем полезно возвращаемое значение из main()?

Ответы [ 7 ]

5 голосов
/ 25 сентября 2010

При написании сценариев (например, в Bash или CMD.exe в Windows) некоторые команды можно объединить в цепочку с помощью && и ||операторы.

Канонически, a && b будет работать b, если результат a равен нулю, и a || b будет выполняться b, если a вернул ненулевое значение.

Это полезно, если вы хотите условно выполнить команду, если предыдущая преуспела.Например, вы хотите удалить файл, если он содержит слово foo.Тогда вы будете использовать:

grep foo myfile && rm myfile

grep возвращает 0 при совпадении, иначе ненулевое значение.

2 голосов
/ 25 сентября 2010

Возвращение 0 - это соглашение. Когда программа возвращает 0, можно предположить, что она работала нормально, фактически не глядя на то, что сделала программа (хм: D).

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

Итак, отвечая на ваши вопросы:

  1. Для программы на C вы должны вернуть либо EXIT_SUCCESS, либо EXIT_FAILURE. Но вы можете вернуть EXIT_FAILURE даже если ваша программа работала нормально.
  2. Если вы не возвращать 0 (EXIT_SUCCESS), вполне возможно, что другие программы примут вашу программу не удалось.

С C ++ и C есть замечательный ответ

Что должно вернуть main () в C и C ++?

1 голос
/ 25 сентября 2010

В современном C aka C99 (не уверен в C89) все три окончания main эквивалентны:

  • только что заканчивается main в последнем }
  • return 0
  • exit(0)

Идея, лежащая в основе всего этого, состоит (как уже упоминалось) в предоставлении статуса возврата вызывающей программе.

1 голос
/ 25 сентября 2010

Возвращаемое значение является «результатом» выполнения программы, а 0 используется для указания успешного завершения, а ненулевое возвращаемое значение указывает на сбой или неожиданное завершение.

Возвращаемое значение неЭто не имеет значения для системы, когда вы вызываете свою программу нормально, но это может иметь две цели.Одним из них является отладка.В MSVC, наиболее часто используемом компиляторе для C ++, вы видите, что программы возвращают значение после его завершения.Это может быть полезно, чтобы увидеть, «как и почему» ваша программа закрылась.

Другое использование - это когда ваше приложение вызывается из других программ, где возвращаемое значение может указывать на успех или передавать результат.

0 голосов
/ 06 января 2017

Мы можем вернуть любое целое число от main(). Теперь по умолчанию функция main() возвращает 0, если мы явно не упоминаем функцию main() для возврата какого-либо определенного значения.

return 0 фактически напоминает, что программа успешно завершилась без каких-либо ошибок, хотя это не правило, но так оно и работает.

И если мы явно возвращаем ненулевое число, то, хотя программа работает правильно, но внутренне это фактически означает, что программа завершилась с некоторыми ошибками или программа завершилась с неожиданным результатом. Это может быть полезно, если другая программа называется в наших текущих программах возвращаемое значение, используя '&&' или '||' в нашей командной строке.

Вы также можете проверить значение возврата вашей ранее выполненной программы в Linux, используя эту команду:

echo $?
0 голосов
/ 25 сентября 2010

Вы должны использовать EXIT_SUCCESS, когда программа завершилась правильно, и EXIT_FAILURE, если это не так. EXIT_SUCCESS равен нулю, а ноль переносим для любой операционной системы, в то время как EXIT_FAILURE изменяется, например, с UNIX на Windows. Эти константы определены в заголовке stdlib.h.

#include <stdlib.h>

int main()
{

    int toret = EXIT_SUCCESS;

    if ( !( /* do something useful here */ ) ) {
        toret = EXIT_FAILURE;
    }

    return toret;
}

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

Как сказал @Benoit, код завершения сообщает операционной системе, когда операция прошла успешно или нет. Если код выхода означает сбой, вы можете прервать выполнение пакетной программы, так как она вряд ли сработает.

Например, компилятор может иметь нулевой код завершения, если компиляция прошла успешно, и любое другое значение, если компиляция не удалась. В Windows к этому можно обратиться через переменную операционной системы «errorlevel»:

gcc helloworld.cpp -ohelloworld.exe
goto answer%errorlevel%
:answer0
copy helloworld.exe c:\users\username\Desktop
echo Program installed
goto end
:answer1
echo There were errors. Check your source code.
:end
echo Now exiting...

Этот пакетный файл Windows "устанавливает" helloworld.exe на рабочий стол, когда компиляция прошла успешно. Поскольку вы можете запускать пакетные файлы двойным щелчком, это позволяет избежать касания командной строки для компиляции.

Конечно, примите во внимание, что лучше управлять интегрированными средами (если код выхода не существует, они не смогут работать правильно). Также обратите внимание, что make является лучшим в этой области:

https://en.wikipedia.org/wiki/Make_(software)

У также должны быть коды выхода для правильной работы.

0 голосов
/ 25 сентября 2010

Привет, как вы сказали, это в основном, если программа используется как часть более широкой сети программ. Возврат нуля в программную среду позволяет сети знать, что все прошло нормально (как вы сказали), однако вы также можете вернуть 1, 2, 3 ... (в зависимости от того, какая ошибка произошла), чтобы ваша сеть кода знала, что что-то пошло не так Эквивалентно, у вас может быть выход (0) или выход (1) в конце вашей «основной» программы, чтобы сделать то же самое. Вы можете найти это полезным: http://en.wikipedia.org/wiki/Exit_status Надеюсь, это поможет. Jack

...