Mengenai jenis boolean di C
Tipe boolean diperkenalkan cukup terlambat dalam bahasa C, pada tahun 1999. Sebelum itu, C tidak memiliki tipe boolean tetapi sebaliknya digunakan int
untuk semua ekspresi boolean. Oleh karena itu semua operator logis seperti > == !
dll mengembalikan int
nilai 1
atau 0
.
Itu adalah kebiasaan untuk aplikasi untuk menggunakan jenis buatan seperti typedef enum { FALSE, TRUE } BOOL;
, yang juga bermuara pada int
jenis -sized.
C ++ memiliki tipe boolean yang jauh lebih baik, dan eksplisit bool
, yang tidak lebih besar dari 1 byte. Sedangkan tipe atau ekspresi boolean dalam C akan berakhir sebagai 4 byte dalam kasus terburuk. Beberapa cara kompatibilitas dengan C ++ diperkenalkan di C dengan standar C99. C kemudian mendapat tipe boolean _Bool
dan juga header stdbool.h
.
stdbool.h
menyediakan beberapa kompatibilitas dengan C ++. Header ini mendefinisikan makro bool
(ejaan yang sama dengan kata kunci C ++) yang diperluas ke _Bool
, tipe yang merupakan tipe integer kecil, kemungkinan besar 1 byte. Demikian pula, tajuk menyediakan dua makro true
dan false
, ejaan yang sama dengan kata kunci C ++, tetapi dengan kompatibilitas ke belakang untuk program C yang lebih tua . Oleh karena itu true
dan false
berkembang ke 1
dan 0
di C dan tipenya int
. Makro ini sebenarnya bukan tipe boolean seperti kata kunci C ++ yang sesuai.
Demikian pula, untuk tujuan kompatibilitas ke belakang, operator logis di C masih kembali int
ke hari ini, meskipun C saat ini mendapat tipe boolean. Sementara di C ++, operator logis mengembalikan a bool
. Dengan demikian ekspresi seperti sizeof(a == b)
akan memberikan ukuran int
dalam C, tetapi ukuran dari bool
dalam C ++.
Mengenai operator bersyarat ?:
Operator bersyarat ?:
adalah operator aneh dengan beberapa keanehan. Ini adalah kesalahan umum untuk percaya bahwa itu 100% setara dengan if() { } else {}
. Tidak terlalu.
Ada titik urutan antara evaluasi operan 1 dan 2 atau 3. The ?:
Operator dijamin hanya mengevaluasi baik 2 atau operan-3, sehingga tidak dapat menjalankan efek samping dari operan yang tidak dievaluasi. Kode suka true? func1() : func2()
tidak akan dieksekusi func2()
. Sejauh ini baik.
Namun , ada aturan khusus yang menyatakan bahwa operan ke-2 dan ke-3 harus secara implisit dipromosikan dan diseimbangkan satu sama lain dengan konversi aritmatika yang biasa . ( Aturan promosi tipe implisit dalam C dijelaskan di sini ). Ini berarti bahwa operan ke-2 atau ke-3 akan selalu setidaknya sebesar int
.
Jadi tidak masalah itu true
dan false
kebetulan mengetikkan int
C karena ungkapan itu akan selalu memberikan setidaknya ukuran suatu int
masalah.
Bahkan jika Anda akan menulis ulang ekspresi itu masih akan mengembalikan ukuran sebuah !sizeof(a ? (bool)true : (bool)false)
int
Ini karena jenis promosi implisit melalui konversi aritmatika yang biasa.
sizeof(true)
dansizeof(false)
juga 4: ide.geeksforgeeks.org/O5jvuN