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 :)
sumber
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.if true ; then ... ; fi
, di manatrue
perintah yang mengembalikan nol dan ini memberitahuif
untuk dijalankan...
.bool
tipe tetapi perbandingan / jika kondisi dll dapat memiliki nilai balik.Jawaban:
0
adalahfalse
karena mereka berdua nol unsur kesamaan semirings . Meskipun mereka adalah tipe data yang berbeda, masuk akal secara intuitif untuk mengkonversi di antara mereka karena mereka milik struktur aljabar isomorfik.0
adalah identitas untuk penjumlahan dan nol untuk perkalian. Ini berlaku untuk bilangan bulat dan rasional, tetapi tidak untuk angka floating-point IEEE-754:0.0 * NaN = NaN
dan0.0 * Infinity = NaN
.false
adalah identitas untuk Boolean xor (⊻) dan nol untuk Boolean dan (∧). Jika Boolean direpresentasikan sebagai {0, 1} —set bilangan bulat modulo 2 — Anda dapat menganggap ⊻ sebagai tambahan tanpa carry dan ∧ sebagai perkalian.""
dan[]
merupakan identitas untuk rangkaian, tetapi ada beberapa operasi yang masuk akal sebagai nol. Pengulangan adalah satu, tetapi pengulangan dan penyatuan tidak mendistribusikan, sehingga operasi ini tidak membentuk semiring.Konversi tersirat semacam itu sangat membantu dalam program kecil, tetapi dalam jumlah besar dapat membuat program lebih sulit untuk dipikirkan. Hanya satu dari banyak pengorbanan dalam desain bahasa.
sumber
nil
apakah daftar kosong[]
danfalse
nilai dalam Common Lisp; adakah kecenderungan untuk menggabungkan identitas dari tipe data yang berbeda?) Anda masih harus menjelaskan mengapa wajar untuk menganggap false sebagai identitas aditif dan benar sebagai identitas multiplikatif dan bukan sebaliknya. Apakah tidak mungkin dipertimbangkantrue
sebagai identifikasi untukAND
dan nol untukOR
?true
juga merupakan identitas dan nol semiring (Boolean dan / atau). Tidak ada alasan, konvensi appart, untuk mempertimbangkanfalse
lebih dekat ke 0 daripadatrue
.Karena matematika berhasil.
Secara tradisional, program C memiliki kondisi seperti
daripada
karena konsep nol yang setara dengan yang salah dipahami dengan baik.
sumber
Seperti yang orang lain katakan, matematika lebih dulu. Inilah sebabnya 0 adalah
false
dan 1 adalahtrue
.Matematika mana yang sedang kita bicarakan? Aljabar Boolean yang berasal dari pertengahan 1800-an, jauh sebelum komputer digital datang.
Anda juga bisa mengatakan bahwa konvensi tersebut keluar dari logika proposisional , yang bahkan lebih tua dari aljabar boolean. Ini adalah formalisasi dari banyak hasil logis yang diketahui dan cinta programmer (
false || x
samax
,true && x
samax
dan sebagainya).Pada dasarnya kita berbicara tentang aritmatika pada set dengan dua elemen. Pikirkan tentang penghitungan dalam biner. Aljabar Boolean adalah asal dari konsep ini dan landasan teoretisnya. Konvensi bahasa seperti C hanyalah aplikasi sederhana.
sumber
true = 1
. Itu tidak terlalu tepat, karenatrue != 0
yang tidak persis sama. Salah satu alasan (bukan satu-satunya) mengapa seseorang harus menghindari perbandingan sukaif(something == true) { ... }
.Saya pikir ini ada hubungannya dengan "warisan" dari elektronik, dan juga aljabar boolean, di mana
0
=off
,negative
,no
,false
1
=on
,positive
,yes
,true
strcmp mengembalikan 0 ketika string sama dengan hubungannya dengan implementasinya, karena apa yang sebenarnya dilakukannya adalah menghitung "jarak" antara dua string. Bahwa 0 juga dianggap salah hanyalah kebetulan.
mengembalikan 0 pada kesuksesan masuk akal karena 0 dalam hal ini digunakan berarti tidak ada kesalahan dan angka lainnya akan menjadi kode kesalahan. Menggunakan nomor lain untuk sukses akan kurang masuk akal karena Anda hanya memiliki satu kode sukses, sementara Anda dapat memiliki beberapa kode kesalahan. Anda menggunakan "Apakah itu berhasil?" sebagai pernyataan if statement dan mengatakan 0 = yes akan lebih masuk akal, tetapi ungkapan itu lebih tepat "Apakah ada yang salah?" dan kemudian Anda melihat bahwa 0 = tidak masuk akal. Berpikir
false/true
tidak masuk akal di sini, karena sebenarnyano error code/error code
.sumber
0
untuksuccess/no error
adalah satu-satunya hal yang masuk akal ketika bilangan bulat lainnya mewakili kode kesalahan. Itu0
juga terjadi untuk mewakilifalse
dalam kasus lain tidak terlalu penting, karena kita sama sekali tidak berbicara tentang benar atau salah;)strcmp()
menghitung jarak cukup baik. Jika sudah dipanggilstrdiff()
makaif (!strdiff())
akan sangat logis.Sebagaimana dijelaskan dalam artikel ini , nilai-nilai
false
dantrue
tidak boleh dikacaukan dengan bilangan bulat 0 dan 1, tetapi dapat diidentifikasi dengan unsur-unsur bidang Galois (bidang terbatas) dari dua elemen (lihat di sini ).Field adalah himpunan dengan dua operasi yang memenuhi aksioma tertentu.
Simbol 0 dan 1 secara konvensional digunakan untuk menunjukkan identitas aditif dan multiplikatif dari suatu bidang karena bilangan real juga merupakan bidang (tetapi bukan yang terbatas) yang identitasnya adalah angka 0 dan 1.
Identitas aditif adalah elemen 0 bidang, sehingga untuk semua x:
dan identitas multiplikatif adalah elemen 1 dari bidang, sehingga untuk semua x:
Bidang terbatas dari dua elemen hanya memiliki dua elemen ini, yaitu identitas aditif 0 (atau
false
), dan identitas multiplikatif 1 (atautrue
). Dua operasi bidang ini adalah XOR logis (+) dan logika AND (*).Catatan. Jika Anda membalik operasi (XOR adalah perkalian dan DAN adalah tambahan) maka perkalian tidak distributif atas penambahan dan Anda tidak memiliki bidang lagi. Dalam kasus seperti itu Anda tidak memiliki alasan untuk memanggil dua elemen 0 dan 1 (dalam urutan apa pun). Perhatikan juga bahwa Anda tidak dapat memilih operasi ATAU alih-alih XOR: tidak peduli bagaimana Anda mengartikan OR / DAN sebagai penambahan / perkalian, struktur yang dihasilkan bukan bidang (tidak semua elemen terbalik ada seperti yang dipersyaratkan oleh aksioma bidang).
Mengenai fungsi C:
strcmp
menghitung perbedaan antara dua string. 0 berarti tidak ada perbedaan antara dua string, yaitu bahwa dua string sama.Penjelasan intuitif di atas dapat membantu untuk mengingat interpretasi nilai-nilai pengembalian, tetapi bahkan lebih mudah untuk hanya memeriksa dokumentasi perpustakaan.
sumber
Anda harus mempertimbangkan bahwa sistem alternatif juga dapat menjadi keputusan desain yang dapat diterima.
Kerang: 0 status keluar benar, bukan nol salah
Contoh shell yang memperlakukan status keluar 0 sebagai true telah disebutkan.
Alasannya adalah bahwa ada satu cara untuk berhasil, tetapi banyak cara untuk gagal, jadi menggunakan 0 sebagai nilai khusus yang berarti "tidak ada kesalahan" adalah pragmatis.
Ruby: 0 sama seperti nomor lainnya
Di antara bahasa pemrograman "normal", ada beberapa pencilan, seperti Ruby, yang memperlakukan 0 sebagai nilai sebenarnya.
The pemikiran adalah bahwa hanya
false
dannil
harus palsu. Bagi banyak pemula Ruby, ini adalah gotcha. Namun, dalam beberapa kasus, bagus bahwa 0 diperlakukan sama seperti nomor lainnya.Namun, sistem seperti itu hanya berfungsi dalam bahasa yang mampu membedakan boolean sebagai tipe terpisah dari angka. Pada hari-hari awal komputasi, programmer yang bekerja dengan bahasa assembly atau bahasa mesin mentah tidak memiliki kemewahan seperti itu. Mungkin wajar untuk memperlakukan 0 sebagai keadaan "kosong", dan menetapkan sedikit ke 1 sebagai bendera ketika kode mendeteksi bahwa sesuatu terjadi. Dengan ekstensi, konvensi berkembang bahwa nol diperlakukan sebagai salah, dan nilai-nilai bukan nol kemudian dianggap benar. Namun, tidak harus seperti itu.
Java: Angka tidak bisa diperlakukan sebagai boolean sama sekali
Di Jawa,
true
danfalse
merupakan satu-satunya nilai boolean. Angka bukan boolean, dan bahkan tidak bisa dimasukkan ke boolean ( Spesifikasi Bahasa Jawa, Bagian 4.2.2 ):Aturan itu hanya menghindari pertanyaan sama sekali - semua ekspresi boolean harus ditulis secara eksplisit dalam kode.
sumber
if (thing === 0)
, itu tidak keren.0
adalahtrue
(karena setiap bilangan bulat lainnya) dalam bahasa dinamis. Saya kadang-kadang menangkap0
ketika mencoba menangkapNone
dengan Python, dan itu kadang-kadang bisa sangat sulit dikenali.if [ 0 ] ; then echo this executes ; fi
. Nilai data palsu adalah string kosong, dan kepalsuan yang dapat diuji adalah status pemutusan perintah yang gagal, yang diwakili oleh bukan- nol.Sebelum membahas kasus umum, kami dapat membahas contoh tanggapan Anda.
Perbandingan string
Hal yang sama berlaku untuk berbagai macam perbandingan, sebenarnya. Perbandingan semacam itu menghitung jarak antara dua objek. Ketika objek sama, jaraknya minimal. Jadi ketika "perbandingan berhasil", nilai adalah 0. Tapi sungguh, nilai kembali dari
strcmp
adalah tidak boolean, itu adalah jarak, dan bahwa apa perangkap programmer menyadari melakukanif (strcmp(...)) do_when_equal() else do_when_not_equal()
.Dalam C ++ kita bisa mendesain ulang
strcmp
untuk mengembalikanDistance
objek, yang menimpaoperator bool()
untuk mengembalikan true ketika 0 (tetapi Anda kemudian akan digigit oleh serangkaian masalah yang berbeda). Atau dalam plain C hanya memilikistreq
fungsi yang mengembalikan 1 ketika string sama, dan 0 sebaliknya.Panggilan API / kode keluar program
Di sini Anda peduli tentang alasan ada yang tidak beres, karena ini akan membuat keputusan salah. Ketika semuanya berhasil, Anda tidak ingin tahu apa-apa khususnya - niat Anda terwujud. Nilai pengembalian karenanya harus menyampaikan informasi ini. Ini bukan boolean, ini adalah kode kesalahan. Nilai kesalahan khusus 0 berarti "tidak ada kesalahan". Sisa rentang mewakili kesalahan berarti secara lokal yang harus Anda tangani (termasuk 1, yang sering berarti "kesalahan yang tidak ditentukan").
Kasus umum
Ini meninggalkan kita dengan pertanyaan: mengapa nilai boolean
True
danFalse
biasanya direpresentasikan dengan 1 dan 0, masing-masing?Nah, selain argumen subyektif "rasanya lebih baik begini", berikut adalah beberapa alasan (subyektif juga) yang dapat saya pikirkan:
analogi sirkuit listrik. Saat ini HIDUP untuk 1s, dan OFF untuk 0s. Saya suka memiliki (1, Ya, Benar, Aktif) bersama, dan (0, Tidak, Salah, Tidak Aktif), daripada campuran lainnya
inisialisasi memori. Ketika saya
memset(0)
banyak variabel (baik itu int, float, bools) saya ingin nilainya cocok dengan asumsi yang paling konservatif. Misalnya jumlah saya awalnya 0, predikat Salah, dll.Mungkin semua alasan ini terkait dengan pendidikan saya - jika saya diajarkan untuk mengasosiasikan 0 dengan True dari awal, saya akan memilih sebaliknya.
sumber
bool
sama sekali bukan tentang .int
kebool
dalam banyak bahasa pemrograman. Hal-hal perbandingan dan kesalahan gestion hanyalah contoh tempat di mana casting dengan cara lain daripada yang saat ini dilakukan akan masuk akal.Dari perspektif tingkat tinggi, Anda berbicara tentang tiga tipe data yang sangat berbeda:
Boolean. Konvensi matematika dalam aljabar Boolean adalah menggunakan 0 untuk
false
dan 1 untuktrue
, sehingga masuk akal untuk mengikuti konvensi itu. Saya pikir cara ini juga lebih masuk akal secara intuitif.Hasil perbandingan. Ini memiliki tiga nilai:
<
,=
dan>
(perhatikan bahwa tidak satupun dari mereka adalahtrue
). Bagi mereka masuk akal untuk menggunakan nilai -1, 0 dan 1, masing-masing (atau, lebih umum, nilai negatif, nol dan nilai positif).Jika Anda ingin memeriksa kesetaraan dan Anda hanya memiliki fungsi yang melakukan perbandingan umum, saya pikir Anda harus membuatnya eksplisit dengan menggunakan sesuatu seperti
strcmp(str1, str2) == 0
. Saya merasa menggunakan!
dalam situasi ini membingungkan, karena memperlakukan nilai non-boolean seolah-olah itu adalah boolean.Juga, ingatlah bahwa perbandingan dan kesetaraan tidak harus sama. Misalnya, jika Anda memesan orang berdasarkan tanggal lahirnya,
Compare(me, myTwin)
harus kembali0
, tetapiEquals(me, myTwin)
harus kembalifalse
.Keberhasilan atau kegagalan suatu fungsi, mungkin juga dengan detail tentang keberhasilan atau kegagalan itu. Jika Anda berbicara tentang Windows, maka jenis ini disebut
HRESULT
dan nilai bukan nol tidak selalu menunjukkan kegagalan. Bahkan, nilai negatif menunjukkan kegagalan dan keberhasilan non-negatif. Nilai keberhasilan sangat seringS_OK = 0
, tetapi bisa juga misalnyaS_FALSE = 1
, atau nilai-nilai lainnya.Kebingungan datang dari fakta bahwa tiga tipe data yang sangat berbeda secara logis sebenarnya direpresentasikan sebagai tipe data tunggal (integer) dalam C dan beberapa bahasa lain dan bahwa Anda dapat menggunakan integer dalam suatu kondisi. Tapi saya pikir tidak masuk akal untuk mendefinisikan ulang boolean untuk menggunakan beberapa jenis non-boolean dalam kondisi yang lebih sederhana.
Juga, pertimbangkan tipe lain yang sering digunakan dalam kondisi di C: sebuah pointer. Di sana, itu wajar untuk memperlakukan
NULL
-pointer (yang diwakili sebagai0
) sebagaifalse
. Jadi, mengikuti saran Anda juga akan membuat bekerja dengan pointer lebih sulit. (Meskipun, secara pribadi, saya lebih suka membandingkan pointer secara eksplisitNULL
, daripada memperlakukannya sebagai boolean.)sumber
Nol bisa salah karena sebagian besar CPU memiliki bendera NOL yang dapat digunakan untuk bercabang. Ini menghemat operasi perbandingan.
Mari kita lihat alasannya.
Beberapa psuedocode, karena audiens mungkin tidak membaca majelis
c- sumber panggilan loop sederhana menggoyang 10 kali
beberapa orang berpura-pura berkumpul untuk itu
c- sumber panggilan loop sederhana lain menggeliat 10 kali
beberapa majelis berpura-pura untuk kasus ini
beberapa sumber c lagi
dan majelis
lihat seberapa pendek itu?
beberapa sumber c lagi
dan perakitan (mari kita asumsikan kompiler yang sedikit pintar yang dapat mengganti == 0 tanpa perbandingan)
Sekarang mari kita coba konvensi true = 1
beberapa sumber c #define TRUE 1 int foo = TRUE; if (foo == TRUE) wibble ()
dan majelis
lihat seberapa pendek kasus dengan nol benar?
CPU benar-benar awal memiliki set kecil bendera yang melekat pada Akumulator.
Untuk memeriksa apakah a> b atau a = b umumnya membutuhkan instruksi pembanding.
Mari kita nyatakan kembali ini. Pada beberapa CPU lama, Anda tidak harus menggunakan instruksi pembanding untuk akumulator yang sama dengan ZERO, atau akumulator yang kurang dari nol.
Sekarang apakah Anda tahu mengapa nol mungkin salah?
Harap dicatat ini adalah kode psuedo dan tidak ada set instruksi nyata yang terlihat seperti ini. Jika Anda tahu perakitan, Anda tahu saya menyederhanakan banyak hal di sini. Jika Anda tahu apa-apa tentang desain kompiler, Anda tidak perlu membaca jawaban ini. Siapa pun yang tahu apa-apa tentang loop membuka gulungan atau prediksi cabang, kelas lanjutan ada di ujung lorong di kamar 203.
sumber
if (foo)
danif (foo != 0)
harus menghasilkan kode yang sama, dan kedua, Anda menunjukkan bahwa bahasa assembly yang Anda gunakan sebenarnya memiliki operan boolean eksplisit dan tes untuk mereka. Misalnyajz
artinyajump if zero
. Dengan kata lainif (a == 0) goto target;
. Dan kuantitasnya bahkan tidak sedang diuji secara langsung; kondisi dikonversi dengan bendera boolean yang disimpan dalam kata mesin khusus. Sebenarnya lebih seperticpu.flags.zero = (a == 0); if (cpu.flags.zero) goto target;
jz
instruksi tetapi tidakjnz
? (atau serangkaian instruksi kondisional asimetris lainnya)Ada banyak jawaban yang menunjukkan bahwa korespondensi antara 1 dan true diperlukan oleh beberapa properti matematika. Saya tidak dapat menemukan properti seperti itu dan menyarankan itu murni konvensi sejarah.
Diberi bidang dengan dua elemen, kami memiliki dua operasi: penjumlahan dan perkalian. Kami dapat memetakan operasi Boolean di bidang ini dalam dua cara:
Secara tradisional, kami mengidentifikasi Benar dengan 1 dan Salah dengan 0. Kami mengidentifikasi DAN dengan * dan XOR dengan +. Jadi OR adalah penjenuhan.
Namun, kami dapat dengan mudah mengidentifikasi Benar dengan 0 dan Salah dengan 1. Kemudian kami mengidentifikasi OR dengan * dan XNOR dengan +. Jadi AND adalah penjenuhan tambahan.
sumber
Anehnya, nol tidak selalu salah.
Secara khusus, konvensi Unix dan Posix adalah untuk mendefinisikan
EXIT_SUCCESS
sebagai 0 (danEXIT_FAILURE
sebagai 1). Sebenarnya itu bahkan konvensi standar C !Jadi untuk kerang Posix dan keluar (2) syscalls, 0 berarti "berhasil" yang secara intuitif lebih benar daripada salah.
Secara khusus, shell
if
ingin proses kembaliEXIT_SUCCESS
(yaitu 0) untuk mengikuti cabang "lalu" nya!Dalam Skema (tetapi tidak dalam Common Lisp atau dalam MELT ) 0 dan nil (yaitu
()
dalam Skema) benar, karena satu-satunya nilai palsu adalah#f
Saya setuju, saya nitpicking!
sumber
C digunakan untuk pemrograman tingkat rendah yang dekat dengan perangkat keras, area di mana Anda kadang-kadang perlu beralih antara operasi bitwise dan logis, pada data yang sama. Diperlukan untuk mengubah ekspresi numerik menjadi boolean hanya untuk melakukan tes akan mengacaukan kode.
Anda dapat menulis hal-hal seperti:
daripada
Dalam satu contoh terisolasi itu tidak begitu buruk, tetapi harus melakukan itu akan menjengkelkan.
Demikian juga, operasi converse. Ini berguna untuk hasil operasi boolean, seperti perbandingan, untuk hanya menghasilkan 0 atau 1: Misalkan kita ingin mengatur bit ketiga dari beberapa kata berdasarkan pada apakah
modemctrl
operator mendeteksi bit:Di sini kita harus memiliki
!= 0
, untuk mengurangi hasil&
ekspresi biwise menjadi0
atau1
, tetapi karena hasilnya hanya bilangan bulat, kita terhindar dari keharusan menambahkan beberapa pemeran yang mengganggu untuk selanjutnya mengubah boolean ke bilangan bulat.Meskipun C modern sekarang memiliki
bool
tipe, C tetap mempertahankan keabsahan kode seperti ini, baik karena itu adalah hal yang baik, dan karena kerusakan besar dengan kompatibilitas ke belakang yang akan disebabkan sebaliknya.Exmaple lain di mana C adalah slick: menguji dua kondisi boolean sebagai saklar empat arah:
Anda tidak bisa mengambil ini dari programmer C tanpa perlawanan!
Terakhir, C terkadang berfungsi sebagai sejenis bahasa rakitan tingkat tinggi. Dalam bahasa assembly, kami juga tidak memiliki tipe boolean. Nilai boolean hanya sedikit atau nol dibandingkan nilai bukan nol di lokasi memori atau register. Bilangan bulat nol, nol boolean, dan alamat nol semuanya diuji dengan cara yang sama dalam set instruksi bahasa assembly (dan mungkin bahkan floating point zero). Kemiripan antara C dan bahasa assembly berguna, misalnya ketika C digunakan sebagai bahasa target untuk mengkompilasi bahasa lain (bahkan yang memiliki boolean yang sangat diketik!)
sumber
Nilai boolean atau kebenaran hanya memiliki 2 nilai. Benar dan salah.
Ini tidak boleh direpresentasikan sebagai bilangan bulat, tetapi sebagai bit (0 dan 1).
Mengatakan bilangan bulat lain selain 0 atau 1 tidak salah adalah pernyataan yang membingungkan. Tabel kebenaran berhubungan dengan nilai kebenaran, bukan bilangan bulat.
Dari nilai kebenaran prospektif, -1 atau 2 akan memecah semua tabel kebenaran dan logika boolean yang dikaitkan dengannya.
Sebagian besar bahasa biasanya memiliki
boolean
tipe yang ketika dilemparkan ke tipe angka seperti integer mengungkapkan false untuk dilemparkan sebagai nilai integer 0.sumber
TRUE
atauFALSE
. Tidak pernah saya katakan - mungkin saya lakukan, tetapi itu tidak dimaksudkan - bilangan bulat itu benar atau salah, saya bertanya tentang mengapa mereka mengevaluasi ke mana saja ketika dilemparkan ke boolean.Pada akhirnya, Anda berbicara tentang melanggar bahasa inti karena beberapa API jelek. API jelek bukan hal baru, dan Anda tidak bisa memperbaikinya dengan melanggar bahasa. Ini adalah fakta matematika bahwa 0 salah dan 1 benar, dan bahasa apa pun yang tidak menghargai ini rusak secara fundamental. Perbandingan tiga arah adalah niche dan tidak memiliki bisnis yang hasilnya dikonversi secara implisit
bool
karena menghasilkan tiga hasil yang mungkin. API C lama hanya memiliki penanganan kesalahan yang mengerikan, dan juga sembelih karena C tidak memiliki fitur bahasa yang diperlukan untuk tidak memiliki antarmuka yang mengerikan.Perhatikan bahwa saya tidak mengatakan bahwa untuk bahasa yang tidak memiliki konversi boolean integer-> implisit.
sumber
+
simbol menunjukkan OR. Jadi misalnyaabc + a'b'c
artinya(a and b and c) or (a and (not b) and (not c))
.