Неверное возвращаемое значение в основной функции? - PullRequest
2 голосов
/ 25 июня 2019

Ранее я читал, что 0 на языке C означает false, а 1 - true. И заметили, что функция main возвращает 0, но почему это так? в случае, если весь мой код выполнен успешно, он должен вернуть true (1). Другой связанный вопрос, я все еще не могу понять, кто может использовать возвращаемое значение? поскольку никакая другая функция не вызывала основную функцию внутри моей программы, поэтому никто не может знать, хорошо ли работала моя программа или нет. Я немного смущен.

Ответы [ 4 ]

8 голосов
/ 25 июня 2019

Ваша логика имела бы смысл, если бы возвращаемое значение main было интерпретировано как логическое значение, но это не так.Возврат из первоначального вызова на main подобен вызову функции exit: он сообщает о состоянии завершения системе, в которой вы работаете.

Стандарт C определяет 3 переносимых состояния выхода:

  • 0, указывающее на успех
  • EXIT_SUCCESS, также указывающее на успех
  • EXIT_FAILURE, указывающее на ошибку

(Последние двамакросы, определенные в <stdlib.h>.)

В Unix допускается любое 8-битное значение (0 .. 255).Все ненулевые значения интерпретируются как коды ошибок.Не существует универсального соглашения о том, что означает любое число, просто то, что 0 представляет успех, а что-то еще - своего рода сбой.

Что касается того, кто может использовать возвращаемое значение: В Unix родительский процесс может использоватьwait или waitpid для получения статуса завершения завершенного дочернего элемента.


В стандартной библиотеке C функции, выполняющие действие, обычно не возвращают состояние true / false.(Тесты, такие как islower или isdigit, делают, но у них нет других эффектов.) Например, remove (который удаляет файл) возвращает 0 в случае успеха и -1 в случае ошибки.Это также общий шаблон с системными вызовами Unix.Например, open возвращает дескриптор файла (неотрицательное целое число) в случае успеха и -1 в случае ошибки.

7 голосов
/ 25 июня 2019

Это по сути то, что @Brandon уже сказал в комментариях.

main должен возвращать код выхода / ошибки программы. В соглашении Unix 0 используется для указания без ошибок (значение ошибки - «ложь»). А затем положительные значения используются для указания того, что произошла ошибка и какая это была ошибка.

2 голосов
/ 26 июня 2019

Существует разница между тем, что язык C считает true (не ноль) или false (ноль), и тем, какие значения операционная система использует для указать нормальное завершение программы.

Чтобы быть точным, программы на C должны завершиться с кодом EXIT_SUCCESS для нормального завершения программы или EXIT_FAILURE для аварийного завершения. EXIT_SUCCESS будет отображаться в любом коде, используемом базовой платформой для обозначения успеха, который может быть или не быть 0.

2 голосов
/ 25 июня 2019

Это действительно вопрос, который вы задаете программе, когда она заканчивается.

Дело 1:

Вы потерпели неудачу?

Дело 2:

Вы прошли?

В первом случае "хорошая программа" вернет false (он же ноль)

Во втором случае «хорошая программа» вернет истину (иначе ненулевую).

Консенсус заключается в использовании варианта 1, т. Е. «Вы потерпели неудачу?». Поэтому безотказная программа возвращает ноль, чтобы сказать «Я не ошибся».

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

...