Как уже говорилось в других ответах, использование 0 для успеха оставляет все ненулевое значение для неудачи.Часто (хотя и не всегда) это означает, что отдельные ненулевые значения используются для указания типа сбоя.Итак, как уже было сказано, в этой ситуации вы должны думать о нем как о коде ошибки, а не о флаге успеха / неудачи.
И в такой ситуации мне совершенно не нравится видеть выражение типа if(!Method())
который на самом деле является тестом на успех.Я также обнаружил, что это может вызвать момент, когда я задаюсь вопросом: проверяет ли это утверждение на успех или провал.По моему мнению, поскольку это не простое логическое возвращение, его не следует писать как единое целое.
В идеале, поскольку возвращение используется в качестве кода ошибки, автор этой функции должен был предоставить перечисление (или, по крайней мере, набор определений), которые можно использовать вместо необработанных чисел.Если так, то я бы всегда предпочел переписать тест как что-то вроде if(Method() == METHOD_SUCCESS)
.Если автор этого не предоставил, но у вас есть документация по значениям кода ошибки, рассмотрите возможность создания собственного перечисления или определения и использования этого.
Если ничего другого, я бы написал это как if(Method() == 0)
, потому что тогдапо крайней мере, читателю должно быть ясно, что метод не возвращает простое логическое значение и что ноль имеет особое значение.
Хотя это соглашение часто используется, оно, конечно, не единственноеодин.Я видел соглашения, которые отличают успех и неудачу, используя положительные и отрицательные значения.Это, в частности, происходит, когда функция возвращает счетчик при успешном завершении, но должен возвращать что-то, что не соответствует значению при сбое (часто -1).Я также видел варианты с использованием чисел без знака, где (unsigned int)-1
(он же 0xffffffff) представлял ошибку.И, возможно, есть другие, о которых я даже не могу придумать.
Поскольку нет единого правильного способа сделать это, разные авторы в разное время изобрели разные схемы.
И, конечно,все это без упоминания того, что исключения предлагают (среди прочего) совершенно другой способ предоставления информации, когда функция имеет ошибку.