Этот вопрос может показаться глупым, но почему 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.