Menggunakan nilai-nilai boolean dalam C
C doesn't memiliki built-in tipe boolean. Apa's cara terbaik untuk menggunakan mereka dalam C?
653
16
C doesn't memiliki built-in tipe boolean. Apa's cara terbaik untuk menggunakan mereka dalam C?
Dari yang terbaik hingga yang buruk:
Opsi 1 (C99)
Pilihan 2
3
4
Penjelasan
Jika anda ragu-ragu, pergi dengan #1!
Beberapa pemikiran tentang boolean dalam C:
I'm cukup tua, jadi saya hanya menggunakan plain
int karena saya tipe boolean tanpa typedefs atau khusus mendefinisikan atau enums untuk true/false nilai-nilai. Jika anda mengikuti saran saya di bawah ini pada pernah membandingkan terhadap boolean konstanta, maka anda hanya perlu menggunakan 0/1 untuk menginisialisasi bendera pula. Namun, pendekatan seperti itu mungkin dianggap terlalu reaksioner di zaman modern. Dalam kasus itu, salah satu pasti harus menggunakan
<stdbool.h>` sejak itu setidaknya memiliki keuntungan yang standar.Apapun boolean konstanta yang disebut, gunakanlah hanya untuk inisialisasi. Jangan pernah menulis sesuatu seperti
Ini selalu dapat diganti dengan yang lebih jelas
Perhatikan bahwa ini dapat benar-benar wajar dan maklum akan membaca dengan suara keras.
Memberikan anda boolean variabel positif nama-nama, yaitu
penuh
dan bukannotfull
. Yang terakhir mengarah ke kode yang sulit untuk dibaca dengan mudah. Bandingkandengan
Kedua mantan pasangan baca secara alami, sementara
!notfull
canggung untuk membaca bahkan saat itu, dan menjadi jauh lebih buruk secara lebih kompleks ekspresi boolean.Boolean argumen umumnya harus dihindari. Mempertimbangkan fungsi yang didefinisikan seperti ini
Dalam tubuh fungsi, hal ini sangat jelas apa argumen berarti sejak itu telah nyaman, dan mudah-mudahan bermakna, nama. Tapi, panggilan situs yang terlihat seperti
Di sini, it's pada dasarnya tidak mungkin untuk mengatakan apa parameter berarti tanpa selalu melihat pada definisi fungsi atau deklarasi, dan itu akan jauh lebih buruk lagi jika anda menambahkan lebih banyak parameter boolean. Saya sarankan baik
atau
Dalam kedua kasus, sebut situs sekarang terlihat seperti
yang pembaca memiliki setidaknya kesempatan untuk memahami tanpa pengerukan definisi
foo
.Boolean dalam C adalah bilangan bulat: nol untuk salah dan non-nol untuk benar.
Lihat juga Boolean tipe data, bagian C, C++, Objective-C, AWK.
Berikut ini adalah versi yang saya gunakan:
Karena palsu hanya memiliki satu nilai, tetapi benar logis bisa memiliki banyak nilai-nilai, tetapi teknik set true untuk menjadi apa compiler akan digunakan untuk sebaliknya palsu.
Ini mengurus masalah seseorang coding sesuatu yang akan datang ke ini:
Saya pikir kita semua akan setuju bahwa itu bukan praktik yang baik, tapi untuk satu kali biaya untuk melakukan "benar = !palsu" kita menghilangkan masalah itu.
[EDIT] Pada akhirnya saya digunakan:
untuk menghindari tabrakan nama dengan skema lain yang mendefinisikan
benar
dansalah
. Tapi konsep tetap sama.[EDIT] Untuk menunjukkan konversi dari integer ke boolean:
Yang pertama (paling kanan) ! mengkonversi non-nol integer ke 0, kemudian yang kedua (paling kiri) ! mengkonversi 0 untuk
myfalse
nilai. Aku akan meninggalkan itu sebagai latihan bagi pembaca untuk mengkonversi integer nol.[Sunting / SUNTING sumber] Itu adalah gaya saya untuk menggunakan eksplisit menetapkan nilai enum ketika nilai tertentu diperlukan bahkan jika nilai default akan sama. Contoh: Karena palsu harus nol saya menggunakan
false = 0,
daripadafalse,
Jika anda menggunakan C99 compiler ini memiliki built-in dukungan untuk bool jenis:
http://en.wikipedia.org/wiki/Boolean_data_type
Hal pertama yang pertama. C, yaitu ISO/IEC 9899 memiliki tipe boolean untuk 19 tahun. Itu adalah cara lama dari diharapkan panjang pemrograman C karir dengan amatir/akademik/profesional bagian dikombinasikan ketika mengunjungi pertanyaan ini. Saya tidak melampaui bahwa dengan hanya mungkin 1-2 tahun. Itu berarti bahwa selama waktu yang rata-rata pembaca telah belajar apa-apa sama sekali tentang C, C benar-benar telah boolean tipe data.
Untuk datatype,
#include <stdbool.h>
, dan menggunakanbenar
,false
danbool
. Atau tidak seperti itu, dan menggunakan_Bool
,1
dan0
sebagai gantinya.Ada berbagai berbahaya saran dalam jawaban ini thread. Aku akan mengatasinya:
Ini adalah tidak-tidak, karena pembaca kasual - siapa yang tidak belajar C dalam 19 tahun - akan berharap bahwa
bool
mengacu pada aktualbool
tipe data dan akan bersikap sama, tapi itu doesn't! MisalnyaDengan C99
bool
/_Bool
,b
akan diatur kepalsu
iffa
adalah nol, danbenar
jika tidak. Dengantypedef
di tempat,double
akan dipaksa untuk sebuahint
- jika nilai ganda isn't dalam rentangint
, yang perilaku tidak terdefinisi.Secara alami hal yang sama berlaku untuk jika
benar
dansalah
itu dinyatakan dalam sebuahenum
.Apa yang bahkan lebih berbahaya menyatakan
karena sekarang semua nilai-nilai selain 1 dan 0 yang tidak valid, dan nilai tersebut akan ditugaskan untuk variabel dari jenis, perilaku akan sepenuhnya tidak terdefinisi.
Oleh karena itu iff anda tidak dapat menggunakan C99 untuk beberapa alasan yang tak bisa dijelaskan, untuk variabel boolean yang harus anda gunakan:
int
dan nilai0
dan1
as -; dan dengan hati-hati apakah domain konversi dari nilai-nilai lain ini dengan double negasi!!
BOOL
,BENAR
danSALAH
!C memiliki tipe boolean: bool (setidaknya untuk yang terakhir 10(!) tahun)
Termasuk stdbool.h dan benar/palsu akan bekerja seperti yang diharapkan.
Sesuatu nol dievaluasi ke true pada operasi boolean, sehingga anda hanya bisa
dan menggunakan konstanta.
Hanya untuk melengkapi jawaban yang lain dan beberapa klarifikasi, jika anda diperbolehkan untuk menggunakan C99.
Beberapa preferensi saya:
_Bool
ataubool
? Keduanya baik-baik saja, tapibool
terlihat lebih baik daripada kata kunci_Bool
.bool
dan_Bool
adalah:palsu
ataubenar
. Menetapkan0
atau1
bukanpalsu
ataubenar
adalah valid, tetapi lebih sulit untuk membaca dan memahami logika aliran.Beberapa info dari standar:
_Bool
TIDAKunsigned int
, tapi ini bagian dari kelompok unsigned integer types. Hal ini cukup besar untuk menampung nilai-nilai0
atau1
.bool
benar
dansalah
tapi pasti bukan ide yang baik. Kemampuan ini dianggap usang dan akan dihapus di masa depan._Bool
ataubool
, jika scalar nilai ini sama dengan0
atau membandingkan ke0
maka akan0
, jika tidak hasilnya adalah1
:_Bool x = 9;
9
diubah menjadi1
ketika ditugaskan untukx
._Bool
adalah 1 byte (8 bit), biasanya programmer tergoda untuk mencoba untuk menggunakan bit lainnya, tapi tidak dianjurkan, karena satu-satunya jaminan yang diberikan adalah bahwa hanya satu bit yang digunakan untuk menyimpan data, tidak seperti jenischar
yang memiliki 8 bit yang tersedia.@Thomas Matthews: ekspresi Kondisional dianggap benar jika mereka adalah non-nol, tapi C standar mengharuskan operator logis diri kembali baik 0 atau 1.
@Tom: #define TRUE !PALSU adalah buruk dan benar-benar sia-sia. Jika file header membuat jalan ke disusun kode C++, maka dapat menyebabkan masalah:
Beberapa compiler akan menghasilkan peringatan tentang int => bool konversi. Kadang-kadang orang-orang menghindari hal ini dengan melakukan:
untuk memaksa ekspresi menjadi C++ bool. Tapi jika anda #define TRUE !PALSU, anda berakhir dengan:
yang akhirnya melakukan int-untuk-bool perbandingan yang dapat memicu peringatan pula.
Itu adalah ini:
Anda dapat menggunakan char, atau yang lain kecil jumlah wadah untuk itu.
Pseudo-code
Anda bisa menggunakan _Bool, tapi yang mengembalikan nilai harus berupa bilangan bulat (1 untuk true, 0 untuk false). Namun, Hal's dianjurkan untuk mencakup <stdbool.h> dan menggunakan bool seperti dalam C++, seperti dikatakan dalam jawaban ini dari daniweb forum, serta jawaban ini, ini lain stackoverflow pertanyaan:
Jika anda menggunakan c99 anda dapat menggunakan _Book jenis yang merupakan bagian dari c99 I. e ada #meliputi' yang diperlukan. Anda tidak perlu memperlakukannya seperti int meskipun, di mana 1 = true dan 0 = false. Anda kemudian dapat menentukan BENAR dan SALAH.
Anda hanya dapat menggunakan #define petunjuk sebagai berikut:
Dan penggunaan sebagai berikut:
dan begitu..di