Подтвердить что ты не робот

1 = false и 0 = true?

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

$ 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.

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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