Уточняющий возврат 0 и 1

Итак, возвращаем 0 в функцию (не main) false и возвращаем 1 или что-либо, кроме 0 означает успех.

Почему в функции main() мы помещаем 0, что означает отсутствие ошибок, когда 1 в других функциях означает, что он успешно работал, спасибо.

Ответ 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.

Ответ 2

Возврат определенного номера по умолчанию не означает ничего.

Разработчик решает, что возвращает метод и что означает возвращаемое значение.

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

Ответ 3

Нет стандарта, по которому значение представляет ошибку и представляет собой успех. Однако, традиционно, C/С++/Unix предпочитает использовать 0 как успешный и ненулевой для отказа, потому что ненулевое значение может использоваться как код ошибки для представления различных причин сбоев.

Ответ 4

Подумайте об этом так:

По традиции, никакая функция никогда не возвращает логическое значение, указывающее на успех. Вместо этого тип возврата - это либо номер ошибки, либо некоторый указатель на объект.

Теперь, если код ошибки возвращается и ошибки не возникает, естественно, ошибка не возвращается. Это значение нуля, когда возвращается main(). Следовательно, if(main()) означает нечто вроде if(error).

Аналогично, если возвращается указатель объекта и возникает ошибка, ни один объект не может быть возвращен, что снова указывается нулем (= нулевой указатель). Итак, if(getObject()) означает что-то вроде if(/*getObject() actually returned something*/).

Итак, хотя это выглядит неправильно, это не так. Это просто, что ничто никогда не возвращает верный логический результат.

Ответ 5

Возвращаемое значение для себя ничего не значит, разработчики решают, означает ли это значение ошибка или нет.

Но посмотрите коды ошибок и их обработку.

int MyFunctionWhichCanFail(...)
{
    /*some code*/
    return ERROR_CODE;
}

int FunctionWhichWorksWithFunctionWhichCanFail()
{
    if (MyFunctionWhichCanFail(...))
    {
        //some error handling
    }

    //other stuff
}

В этом случае можно встретить много разных ошибок, поэтому код ошибки - очень хороший вариант, в случае возможного результата неудача/успех лучше использовать bool.

Также хочу отметить, что в большинстве систем нуль определяется как ERROR_SUCCESS (или какое-то другое ключевое слово, что означает успех).