Этот вопрос может показаться глупым, но почему 0
оценки false
и любое другое [целочисленное] значение для true
большинства языков программирования составляют?
Сравнение строк
Поскольку вопрос кажется немного слишком простым, я объясню немного подробнее: во-первых, это может показаться очевидным любому программисту, но почему бы не появиться язык программирования - на самом деле может быть, но не любой Я использовал - где 0
вычисляет true
и все другие [целочисленные] значения false
? Это одно замечание может показаться случайным, но у меня есть несколько примеров, где это могло бы быть хорошей идеей. Прежде всего, давайте возьмем пример трехстороннего сравнения строк, я возьму в strcmp
качестве примера C : любой программист, пытающийся использовать C в качестве своего первого языка, может испытывать желание написать следующий код:
if (strcmp(str1, str2)) { // Do something... }
Так как strcmp
возвращает, 0
которое оценивает, false
когда строки равны, то, что пытался сделать начинающий программист, с треском проваливается, и он, как правило, сначала не понимает, почему. Если бы 0
оценены , чтобы true
вместо того, чтобы эта функция могла быть использована в наиболее простом выражении - один выше - при сравнении равенства, а соответствующие проверки на -1
и 1
было бы сделано только тогда , когда это необходимо. Мы бы рассматривали тип возвращаемого значения bool
( как мы думаем ) большую часть времени.
Кроме того, давайте введем новый тип sign
, который просто принимает значения -1
, 0
и 1
. Это может быть очень удобно. Представьте себе, что в C ++ есть оператор космического корабля, и мы его хотим std::string
(ну, там уже есть compare
функция, но оператор космического корабля более интересен). Декларация в настоящее время будет следующей:
sign operator<=>(const std::string& lhs, const std::string& rhs);
Если бы это 0
было оценено true
, оператор космического корабля даже не существовал бы, и мы могли бы объявить operator==
так:
sign operator==(const std::string& lhs, const std::string& rhs);
Это operator==
бы обрабатывало трехстороннее сравнение одновременно и могло бы использоваться для выполнения следующей проверки, в то же время имея возможность проверить, какая строка лексикографически превосходит другую при необходимости:
if (str1 == str2) { // Do something... }
Старая обработка ошибок
Теперь у нас есть исключения, так что эта часть относится только к старым языкам, где такого не существует (например, C). Если мы посмотрим на стандартную библиотеку C (и POSIX), то увидим, что функции maaaaany возвращаются в 0
случае успеха и любое целое число в противном случае. Я, к сожалению, видел, как некоторые люди делают такие вещи:
#define TRUE 0
// ...
if (some_function() == TRUE)
{
// Here, TRUE would mean success...
// Do something
}
Если мы думаем о том, как мы думаем в программировании, мы часто имеем следующую модель рассуждений:
Do something
Did it work?
Yes ->
That's ok, one case to handle
No ->
Why? Many cases to handle
Если думать об этом снова, это имело бы смысл ставить только нейтральное значение, 0
, к yes
(и это, как функции C работают), в то время как все остальные значения могут быть там , чтобы решить многие случаи no
. Тем не менее, во всех языках программирования, которые я знаю (за исключением, может быть, некоторых экспериментальных эзотерических языков), который yes
оценивается false
как if
условие, а все no
случаи - как условие true
. Есть много ситуаций, когда «это работает» представляет один случай, в то время как «это не работает» представляет много вероятных причин. Если мы думаем об этом таким образом, то иметь 0
оценку true
и все остальное false
имело бы гораздо больше смысла.
Заключение
По сути, мой вывод - это мой первоначальный вопрос: почему мы разрабатывали языки там, где 0
есть false
и другие значения true
, принимая во внимание мои несколько приведенных выше примеров и, может быть, некоторые другие, о которых я не думал?
Продолжение: Приятно видеть, что есть много ответов с множеством идей и как можно больше причин для этого. Мне нравится, насколько ты увлечен этим. Изначально я задавал этот вопрос от скуки, но, поскольку вы кажетесь настолько страстным, я решил пойти немного дальше и спросить об обосновании логического выбора для 0 и 1 на Math.SE :)
if true ; then ... ; fi
, где true
- это команда, которая возвращает ноль, и это указывает if
на выполнение ...
.
bool
типа , но сравнения / , если условия и т.д. могут иметь любое возвращаемое значение.
strcmp()
плохой пример для истины или ложи, так как он возвращает 3 разных значения. И вы будете удивлены, когда начнете использовать оболочку, где 0 означает true, а все остальное означает false.