Pertanyaan ini mungkin terdengar bodoh, tetapi mengapa 0
harus dievaluasi false
dan nilai [integer] lainnya true
kebanyakan 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 0
mengevaluasi true
dan 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 strcmp
sebagai contoh: setiap programmer yang mencoba C karena bahasa pertamanya mungkin tergoda untuk menulis kode berikut:
if (strcmp(str1, str2)) { // Do something... }
Karena strcmp
pengembalian 0
yang mengevaluasi false
ketika string sama, apa yang coba dilakukan oleh programmer awal gagal total dan dia umumnya tidak mengerti mengapa pada awalnya. Telah 0
dievaluasi untuk true
sebaliknya, fungsi ini bisa digunakan dalam ekspresi yang paling sederhana - satu di atas - ketika membandingkan kesetaraan, dan pemeriksaan yang tepat untuk -1
dan 1
akan 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
, 0
dan 1
. Itu bisa sangat berguna. Bayangkan ada operator pesawat ruang angkasa di C ++ dan kami menginginkannya std::string
(well, sudah ada compare
fungsinya, 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 0
dievaluasi 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 0
ketika 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 yes
mengevaluasi false
dalam suatu if
kondisi, sementara semua no
kasus dievaluasi true
. Ada banyak situasi ketika "itu berfungsi" mewakili satu kasus sementara "itu tidak berfungsi" mewakili banyak kemungkinan penyebab. Jika kita berpikir seperti itu, 0
mengevaluasi true
dan sisanya false
akan jauh lebih masuk akal.
Kesimpulan
Kesimpulan saya adalah pada dasarnya pertanyaan asli saya: mengapa kita merancang bahasa mana 0
adalah false
dan 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 true
perintah yang mengembalikan nol dan ini memberitahu if
untuk dijalankan ...
.
bool
tipe 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.