Ноль часто означает успех, потому что ноль - единственное целочисленное значение, которое оценивается как ложное.Все другие целочисленные значения имеют значение true, и они предназначены для различных кодов ошибок.
Это может показаться немного странным и логически инвертированным, но поскольку успех - это просто успех, а ошибки могут отличаться, часто выбирают вышеуказанное соглашение.
На самом деле это наиболее рациональное соглашение, если возвращаемое значение функции используется не только как индикатор успеха / неудачи, но и как код ошибки.Если код ошибки сохранен, скажем, в дополнительном выходном параметре, то возвращение 1
для успеха и 0
для сбоя имеет больше смысла.
Представьте, каково будет условие в случае 0
быть успешным:
if (errcode = func()) {
/* error handling */
}
против более громоздкого:
if ((errcode = func()) != 1) {
/* error handling */
}