Це питання може здатися німим, але чому для більшості мов програмування 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
. Тим НЕ менше, у всіх мовах програмування я знаю ( за винятком , можливо , деякі експериментальні esotheric мови), що має 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 означає істину, а все інше означає помилкове.