Pertanyaan ini mungkin terdengar bodoh, tetapi mengapa 0harus dievaluasi falsedan nilai [integer] lainnya truekebanyakan bahasa pemrograman?
Perbandingan string
Karena pertanyaannya tampak agak terlalu sederhana, saya akan menjelaskan diri saya sedikit lagi: pertama-tama, mungkin tampak jelas bagi setiap programmer, tetapi mengapa tidak akan ada bahasa pemrograman - mungkin sebenarnya ada, tetapi tidak ada Saya menggunakan - di mana 0mengevaluasi truedan semua nilai [integer] lainnya false? Satu komentar itu mungkin tampak acak, tapi saya punya beberapa contoh di mana itu mungkin ide yang bagus. Pertama-tama, mari kita ambil contoh perbandingan tiga arah string, saya akan mengambil C strcmpsebagai contoh: setiap programmer yang mencoba C karena bahasa pertamanya mungkin tergoda untuk menulis kode berikut:
if (strcmp(str1, str2)) { // Do something... }
Karena strcmppengembalian 0yang mengevaluasi falseketika string sama, apa yang coba dilakukan oleh programmer awal gagal total dan dia umumnya tidak mengerti mengapa pada awalnya. Telah 0dievaluasi untuk truesebaliknya, fungsi ini bisa digunakan dalam ekspresi yang paling sederhana - satu di atas - ketika membandingkan kesetaraan, dan pemeriksaan yang tepat untuk -1dan 1akan telah dilakukan hanya bila diperlukan. Kami akan menganggap tipe pengembalian sebagai bool(dalam pikiran kami maksud saya) sebagian besar waktu.
Selain itu, mari kita perkenalkan tipe baru sign,, yang hanya mengambil nilai -1, 0dan 1. Itu bisa sangat berguna. Bayangkan ada operator pesawat ruang angkasa di C ++ dan kami menginginkannya std::string(well, sudah ada comparefungsinya, tetapi operator pesawat ruang angkasa lebih menyenangkan). Deklarasi saat ini akan menjadi yang berikut:
sign operator<=>(const std::string& lhs, const std::string& rhs);
Telah 0dievaluasi true, operator pesawat ruang angkasa bahkan tidak ada, dan kami bisa menyatakan operator==seperti itu:
sign operator==(const std::string& lhs, const std::string& rhs);
Ini operator==akan menangani perbandingan tiga arah sekaligus, dan masih dapat digunakan untuk melakukan pemeriksaan berikut sambil masih dapat memeriksa string mana yang secara leksikografis lebih unggul dari yang lain ketika dibutuhkan:
if (str1 == str2) { // Do something... }
Penanganan kesalahan lama
Kami sekarang memiliki pengecualian, jadi bagian ini hanya berlaku untuk bahasa lama di mana tidak ada hal seperti itu (C misalnya). Jika kita melihat pustaka standar C (dan juga POSIX satu), kita dapat melihat dengan pasti bahwa fungsi maaaaany kembali 0ketika berhasil dan bilangan bulat apa pun sebaliknya. Saya sedih melihat beberapa orang melakukan hal-hal semacam ini:
#define TRUE 0
// ...
if (some_function() == TRUE)
{
// Here, TRUE would mean success...
// Do something
}
Jika kita memikirkan bagaimana kita berpikir dalam pemrograman, kita sering memiliki pola penalaran berikut:
Do something
Did it work?
Yes ->
That's ok, one case to handle
No ->
Why? Many cases to handle
Jika kita memikirkannya lagi, masuk akal untuk menempatkan satu-satunya nilai netral 0,, ke yes(dan begitulah fungsi C bekerja), sementara semua nilai lain dapat berada di sana untuk menyelesaikan banyak kasus no. Namun, dalam semua bahasa pemrograman saya tahu (kecuali mungkin beberapa bahasa esoterik eksperimental), yang yesmengevaluasi falsedalam suatu ifkondisi, sementara semua nokasus dievaluasi true. Ada banyak situasi ketika "itu berfungsi" mewakili satu kasus sementara "itu tidak berfungsi" mewakili banyak kemungkinan penyebab. Jika kita berpikir seperti itu, 0mengevaluasi truedan sisanya falseakan jauh lebih masuk akal.
Kesimpulan
Kesimpulan saya adalah pada dasarnya pertanyaan asli saya: mengapa kita merancang bahasa mana 0adalah falsedan nilai-nilai lain yang true, mengambil dalam account beberapa contoh saya di atas dan mungkin beberapa lagi saya tidak memikirkan?
Tindak lanjut: Sangat menyenangkan melihat ada banyak jawaban dengan banyak ide dan sebanyak mungkin alasan untuk menjadi seperti itu. Saya suka bagaimana Anda tampaknya bersemangat tentang hal itu. Saya awalnya mengajukan pertanyaan ini karena bosan, tetapi karena Anda tampak bersemangat, saya memutuskan untuk melangkah sedikit lebih jauh dan bertanya tentang alasan di balik pilihan Boolean untuk 0 dan 1 di Math.SE :)
if true ; then ... ; fi, di mana trueperintah yang mengembalikan nol dan ini memberitahu ifuntuk dijalankan ....
booltipe tetapi perbandingan / jika kondisi dll dapat memiliki nilai balik.
strcmp()bukan contoh yang baik untuk benar atau salah, karena mengembalikan 3 nilai yang berbeda. Dan Anda akan terkejut ketika Anda mulai menggunakan shell, di mana 0 berarti benar dan yang lainnya berarti salah.