Почему мы следуем противоположным соглашениям при возвращении из main ()? - PullRequest
4 голосов
/ 03 марта 2010

Я прошел это и это ,

но вопрос, который я здесь задаю, заключается в том, почему 0 считается Success?

Мы всегда ассоциируем 0 с false, не так ли?

Ответы [ 5 ]

20 голосов
/ 03 марта 2010

Потому что есть больше неудачных случаев, чем успешных.

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

Для функций в вашем коде это отличается, потому что вы тот, кто определяет интерфейс, и, таким образом, можете просто использовать bool, если этого достаточно. Для main существует один фиксированный интерфейс для возвратов, и могут быть программы, которые просто сообщают об успехе / неудаче, но другие требуют более точного сообщения об ошибках. Чтобы удовлетворить их всех, у нас будет несколько случаев ошибок.

5 голосов
/ 03 марта 2010

Мне нужно немного поспорить с ответом Йоханнеса. Истинный 0 используется для успеха, потому что есть только 1 успешный результат, в то время как может быть много неудачных результатов. Но мой опыт показывает, что коды возврата имеют меньшее отношение к причинам для сбоя, чем уровням сбоя.

Еще во времена пакетного программирования обычно существовали соглашения для кодов возврата, которые позволяли автоматизировать весь поток выполнения. Таким образом, код возврата 4 может быть предупреждением, но следующая работа может продолжаться; 8 может означать, что поток работ должен остановиться; 12 может означать, что произошло что-то катастрофическое, и пожарная служба должна быть уведомлена.

Аналогичным образом, пакеты будут выделять некоторый диапазон кодов возврата, чтобы общий поток пакетов мог переходить. Например, если программа обновления вернула XX, пакет может пропустить шаг резервного копирования, поскольку ничего не изменилось.

Коды возврата как причины сбоя не так уж полезны, конечно, не так много, как файлы журналов, дампы ядра, предупреждения консоли и тому подобное. Я никогда не видел систему, которая возвращает XX, потому что "такой-то и такой-то файл не найден", например.

3 голосов
/ 03 марта 2010

Как правило, возвращаемые значения для любой данной программы, как правило, представляют собой список (перечисление) возможных значений, таких как Success или конкретные ошибки. Как «список», этот список обычно начинается с 0 и считается сверху. (Кроме того, по этой причине код ошибки Microsoft 0 равен ERROR_SUCCESS).

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

Это просто самый простой способ разрешить наиболее распространенное возвращаемое значение по умолчанию. Это полностью отделено от идеи boolean.

1 голос
/ 03 марта 2010

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

  • Отрицательное число указывает на возникшую ошибку. Значение отрицательного числа указывает (мы надеемся) тип ошибки.
  • Ноль указывает на успех (общий успех)
  • Положительное число указывает тип успеха (в некоторых бизнес-кейсах существуют разные вещи, которые запускают успешное дело .... это указывает, какое успешное дело произошло).
0 голосов
/ 03 марта 2010

Меня тоже это смутило, когда я впервые начал программировать. Я решил это, сказав: 0 означает отсутствие проблем.

...