Итак, возвращаем 0 в функцию (не main) false и возвращаем 1 или что-либо, кроме 0 означает успех.
Почему в функции main() мы помещаем 0, что означает отсутствие ошибок, когда 1 в других функциях означает, что он успешно работал, спасибо.
Итак, возвращаем 0 в функцию (не main) false и возвращаем 1 или что-либо, кроме 0 означает успех.
Почему в функции main() мы помещаем 0, что означает отсутствие ошибок, когда 1 в других функциях означает, что он успешно работал, спасибо.
0
и 1
(или любое ненулевое число) преобразуются в булевы значения false
и true
в контексте, где происходит преобразование в bool
, например. в if(
here
) ...
. Это используется в вашей программе.
Возвращаемое значение из main
используется по-другому, оно возвращается в оболочку, называемую программой. В контексте оболочки значение интерпретируется по-разному. Там 0
традиционно означает "нет ошибки", а значения больше нуля указывают ошибки, и само значение содержит некоторые подсказки относительно того, какая ошибка произошла. Возьмите этот фрагмент из man grep
:
EXIT STATUS
The grep utility exits with one of the following values:
0 One or more lines were selected.
1 No lines were selected.
>1 An error occurred.
Возврат определенного номера по умолчанию не означает ничего.
Разработчик решает, что возвращает метод и что означает возвращаемое значение.
main
возвращает код выхода и 0
без ошибок, которые являются прямолинейными, и есть гораздо более возможные возвращаемые значения, которые просто 0
и 1
.
Нет стандарта, по которому значение представляет ошибку и представляет собой успех. Однако, традиционно, C/С++/Unix предпочитает использовать 0 как успешный и ненулевой для отказа, потому что ненулевое значение может использоваться как код ошибки для представления различных причин сбоев.
Подумайте об этом так:
По традиции, никакая функция никогда не возвращает логическое значение, указывающее на успех. Вместо этого тип возврата - это либо номер ошибки, либо некоторый указатель на объект.
Теперь, если код ошибки возвращается и ошибки не возникает, естественно, ошибка не возвращается. Это значение нуля, когда возвращается main()
. Следовательно, if(main())
означает нечто вроде if(error)
.
Аналогично, если возвращается указатель объекта и возникает ошибка, ни один объект не может быть возвращен, что снова указывается нулем (= нулевой указатель). Итак, if(getObject())
означает что-то вроде if(/*getObject() actually returned something*/)
.
Итак, хотя это выглядит неправильно, это не так. Это просто, что ничто никогда не возвращает верный логический результат.
Возвращаемое значение для себя ничего не значит, разработчики решают, означает ли это значение ошибка или нет.
Но посмотрите коды ошибок и их обработку.
int MyFunctionWhichCanFail(...)
{
/*some code*/
return ERROR_CODE;
}
int FunctionWhichWorksWithFunctionWhichCanFail()
{
if (MyFunctionWhichCanFail(...))
{
//some error handling
}
//other stuff
}
В этом случае можно встретить много разных ошибок, поэтому код ошибки - очень хороший вариант, в случае возможного результата неудача/успех лучше использовать bool
.
Также хочу отметить, что в большинстве систем нуль определяется как ERROR_SUCCESS
(или какое-то другое ключевое слово, что означает успех).