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