1 = ложь и 0 = правда? - PullRequest
       5

1 = ложь и 0 = правда?

24 голосов
/ 25 июня 2011

Я наткнулся на функцию is_equals () в c API на работе, которая возвращает 1 для неравных таблиц sql (false) и 0 для равных (true). Я понял это только после запуска тестовых примеров в моем коде, один для положительного примера и один для отрицательного, и оба они потерпели неудачу, что сначала имело мало смысла. Код в API не содержит ошибок, поскольку выходные данные были правильно записаны в его документации.

Мои вопросы - есть ли перевернутые миры / параллельные вселенные / языки кодирования, где это логическое НОТ нормально? Разве 1 ​​обычно не правда? Кодер API делает ошибку?

Ответы [ 6 ]

35 голосов
/ 25 июня 2011

Обычно функции сравнения возвращают 0 на «равно», так что они также могут возвращать отрицательное число для «меньше чем» и положительное число для «больше чем».strcmp() и memcmp() работают следующим образом.

Однако идиоматично для нуля быть ложным и ненулевым быть истинным, потому что так работают операторы управления потоком Си и логические логические операторы.Таким образом, возможно, что возвращаемые значения, выбранные для этой функции, хороши, но это ошибка name функции (она должна просто называться compare() или подобной).

14 голосов
/ 25 июня 2011

Этот перевернутый мир характерен для ошибок процесса.Переменная оболочки $? сообщает о возвращаемом значении предыдущей программы для выполнения из оболочки, поэтому легко определить, успешно ли выполняется программа или нет:

$ false ; echo $?
1
$ true ; echo $?
0

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

Конкретным примером является программа aa-status, поставляемая с AppArmor инструмент обязательного контроля доступа :

   Upon exiting, aa-status will set its return value to the
   following values:

   0   if apparmor is enabled and policy is loaded.

   1   if apparmor is not enabled/loaded.

   2   if apparmor is enabled but no policy is loaded.

   3   if the apparmor control files aren't available under
       /sys/kernel/security/.

   4   if the user running the script doesn't have enough
       privileges to read the apparmor control files.

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

5 голосов
/ 25 июня 2011

Нет веской причины для 1 быть истинным и 0 быть ложным;это просто способ, которым вещи всегда записывались.Таким образом, с логической точки зрения, функция в вашем API не является «неправильной», по сути.

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

5 голосов
/ 25 июня 2011

Я подозреваю, что он просто следует стандарту Linux / Unix для , возвращая 0 в случае успеха .

Действительно ли действительно говорят "1"является ложным, а "0" является истинным?

3 голосов
/ 25 июня 2011

Вполне возможно, что это ошибка первоначального автора, однако представление о том, что 1 истинно, а 0 ложно, не является универсальной концепцией.В сценарии оболочки 0 возвращается в случае успеха, а любой другой номер в случае неудачи.В других языках, таких как Ruby, только nil и false считаются ложными, а любое другое значение считается истинным, поэтому в Ruby и 1, и 0 будут считаться истинными.

2 голосов
/ 25 июня 2011

Я не уверен, правильно ли я отвечаю на вопрос, но вот знакомый пример:

Тип возврата GetLastError() в Windows отличен от нуля, если произошла ошибка, или ноль в противном случае. Обратное обычно верно для возвращаемого значения функции, которую вы вызвали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...