Kapan sebaiknya Anda menggunakan bools di C ++?

34

Kami memiliki tugas untuk kelas kami di mana kami harus membuat permainan Tic-tac-toe . Orang-orang suka menyulitkan diri mereka sendiri, jadi mereka menulis permainan rumit yang termasuk menu. Di akhir permainan, Anda harus memiliki opsi untuk bermain lagi atau keluar dari program. Saya menggunakan intvariabel untuk itu, tapi saya perhatikan beberapa teman sekelas menggunakan BOOL.

Apakah ini lebih efisien? Apa bedanya, antara menyimpan jawaban yang seharusnya hanya menyimpan dua nilai intdaripada menyimpannya dalam bool? Apa tujuan pasti dari variabel-variabel ini?

Bugster
sumber
32
Tidak yakin tentang efisiensi, tetapi tujuan dari intadalah untuk menyimpan bilangan bulat dan tujuan dari booladalah untuk menyimpan nilai boolean ( trueatau false). Menggunakan boolIMO mencerminkan penggunaannya jauh lebih baik daripada menggunakan int.
George Duckett
12
Bahkan, sebelum C ++ dan C99, C89 tidak memiliki tipe Boolean. Pemrogram sering kali akan typedef int Boolmenjelaskan bahwa mereka menggunakan boolean. Dukungan C ++ terintegrasi untuk boolke dalam bahasa, seperti yang dilakukan C99 dengan _Boolkata kunci (agak jelek) .
Charles Salvia
Ini bukan tentang "tahu kapan harus menggunakan bool", ini tentang mengapa kita memiliki nama yang berbeda untuk tipe yang serupa (seperti length_t) dan mengapa penting bagi kompiler untuk memeriksa tipe.
Abyx
Terkadang jawabannya hanya 'rasa'. Saya yakin jika Anda menulis ulang tugas Anda yang sama sekarang saat ini akan ada beberapa hal yang berbeda seperti urutan parameter fungsi dan nama-nama mereka. Mengapa Anda tidak menuliskannya dengan urutan parameter atau nama yang sama? Ini karena Anda tidak melakukannya atau itu tidak terlalu penting dan Anda hanya menulis apa pun

Jawaban:

82

Saat memilih jenis variabel dan nama variabel, Anda ingin niat Anda sejelas mungkin. Jika Anda memilih jenis bool(boolean), jelas hanya ada dua nilai yang dapat diterima: trueatau false. Jika Anda menggunakan tipe int(integer), tidak jelas lagi bahwa maksud variabel itu hanya bisa 1 atau 0 atau nilai apa pun yang Anda pilih untuk maksud truedan false. Plus sizeof(int)biasanya akan kembali menjadi 4 byte, sementara sizeof(bool)akan mengembalikan 1.

Andrew T Finnell
sumber
7
Sepakat. Saya pikir niat desain lebih penting. Hanya sesekali Anda perlu menimpanya.
ChrisF
9
Untuk menyatakan kembali poin @ AndrewFinnel: Bool lebih mendokumentasikan diri. Variabel yang Anda tetapkan ke 0 atau 1 bisa berupa penghitung; variabel yang Anda setel ke true atau false jelas merupakan sebuah bendera.
Scott C Wilson
2
Bools mencegah penyalahgunaan variabel untuk penggunaan lain. Integer dapat diatur ke nilai selain 0 atau 1 untuk membuat status tambahan yang mungkin tidak disadari oleh kode Anda.
Michael Shopsin
+1. Itu membuat maksud / opsi menjadi jelas. Anda bisa menggunakan metode apa pun yang Anda suka untuk menyimpan nilai termasuk string dengan nilai "ya" atau "tidak", tetapi Anda harus memilih salah satu yang paling masuk akal. Dalam hal ini, itu adalah boolean.
Craige
Saya pikir booleans di C ++ berukuran sama dengan ints, 4 byte.
DogDog
53

Tampaknya dalam semua (sampai sekarang) jawaban yang dikumpulkan tidak ada yang menangkap fakta bahwa OP berbicara tentang BOOLtidak bool.

Karena pertanyaan ini ditandai C ++, harus dicatat bahwa:

  • intadalah bilangan bulat yang berkisar dari INT_MINhingga INT_MAX- makro <climits>yang nilainya tergantung pada arsitektur mesin hosting. Dalam C ++ nilai-nilai ini juga dapat diakses seperti std::numeric_limits<int>::min()dan ...:max()masing - masing). Perilaku operator boolean diterapkan untuk intmemperlakukan 0sebagai salah dan yang lainnya benar .
  • BOOLhanyalah sebuah petunjuk yang menyarankan perilaku boolean untuk int. Ini didefinisikan <cstddef>sebagai

    #define BOOL int
    #define TRUE 1
    #define FALSE 0
  • BOOLjadi tidak lebih dari gula sintaksis, untuk apa-oleh kompiler-itu tidak lebih dari sebuah int. Ini adalah sesuatu yang digunakan programmer C, tetapi programmer C ++ harus menghindari, karena C ++ memilikinya bool.

  • booladalah jenis bahasa yang tidak terpisahkan yang nilai-nilai yang didukungnya adil truedan false. Ketika dikonversi int truemenjadi 1 dan falsemenjadi 0.

Aspek penting adalah lebih aman terhadap kesalahan pemrograman:

BOOL a = FALSE;  // in fact int a = 0;
a = 5; //now a == 5 -- what does it mean?;

tidak mungkin dikodekan dengan tipe bool yang tepat:

bool a = false;
a = 5; // error: no bool(const int&) available.

Menggunakan BOOLalih-alih boolhanya kebiasaan buruk yang diwarisi dari masa lalu yang gemilang tidak ada yang benar-benar masih bisa dilupakan, sehingga menciptakan masalah lama untuk hari esok yang kurang mulia.

Guru bahasa harus serius memikirkannya!

Emilio Garavaglia
sumber
9
BOOL bukan bagian dari bahasa C ++ atau C. BOOL dengan huruf besar adalah cara boolean yang paling umum diimplementasikan dalam C, kembali di masa lalu ketika C tidak memiliki tipe boolean. Misalnya, Windows API akan mendefinisikan BOOL. Lebih lanjut, tidak ada yang tahu bagaimana BOOL didefinisikan, beberapa aplikasi mungkin mendefinisikannya sebagai bit-field satu bit panjang. Anda tidak dapat berasumsi bahwa itu selalu sama dengan int hanya karena beberapa perpustakaan tertentu mendefinisikannya seperti itu.
1
+1. Mungkin dia benar - benar bermaksud BOOL dan bukan bool. Mungkin BOOL dapat diimplementasikan dengan cara yang berpotensi berbeda, meskipun Codereview kemungkinan tidak tahu jika dia menanyakan pertanyaan semacam ini. Dia melihat bahwa itu didefinisikan sebagai int, jadi dia secara alami bertanya mengapa dia tidak bisa menggunakan int.
Neil
1
@Lundin: secara umum Anda benar, tetapi pertimbangkan bahwa ini adalah jawaban yang meninggalkan ruang lingkup pertanyaan, di mana OP berbicara tentang BOOL dan kesetaraan int.
Emilio Garavaglia
Meski begitu, gagasan untuk menggunakan BOOL atau bool untuk menandakan niat masih berlaku.
Andrew T Finnell
1
@ zvrba: benar, tapi ini karena cara MS memutuskan untuk mengimplementasikan bool dalam kompilernya sendiri. Ini hanya valid untuk kompiler MS yang bekerja untuk prosesor Intel. Perhatikan bahwa, untuk platform Intel, setiap tipe integral yang lebih pendek dari 32 bit memerlukan penutup input atau output. Tetapi char [] masih digunakan dan tidak selalu selalu digantikan oleh int []
Emilio Garavaglia
6

Tipe Bool lebih kecil dari tipe Int, sehingga menggunakan lebih sedikit ruang dalam memori. Bergantung pada sistem yang Anda kompilasi pada / untuk, Int bisa 4 - 8 byte, sedangkan Bool adalah 1 byte (seperti yang dapat dilihat dalam artikel MSDN ini )

Padukan ini dengan beberapa aspek KISS dan desain program yang bagus, dan menjadi jelas mengapa lebih baik menggunakan bool untuk menyimpan variabel yang hanya akan memiliki 2 nilai.

Mengapa terlalu mempersulit hal-hal dengan objek yang dapat menyimpan berbagai nilai, ketika Anda yakin bahwa Anda hanya perlu menyimpan 1 dari 2 nilai yang berbeda?

Apa yang terjadi dalam sistem yang menggunakan int, jika Anda menyimpan 75 di sana? Jika Anda telah menambahkan persyaratan tambahan

if (value >= 0 )
  return true;  //value is greater than 0, thus is true
else
  return false; //value is 0 or smaller than 0, thus is false

atau

if (value == 0)
  return false;  //value is greater than 0, thus is true
else if (value == 1)
  return true; //value is 0 or smaller than 0, thus is false

maka Anda dilindungi untuk situasi ini. Tetapi jika Anda belum melakukannya, maka Anda tidak.

Anda juga dapat memiliki case (tergantung pada bagaimana Anda mengubah nilai int) di mana Anda memiliki buffer overrun, dan nilai "reset" kembali ke 0 atau batas bawah int Anda (yang bisa berada di suatu tempat di wilayah -127 hingga −9.223.372.036.854.775.808, tergantung pada arsitektur target Anda ) apa yang terjadi pada kode Anda?

Namun, jika Anda menggunakan bool, Anda bisa menggunakan sesuatu seperti ini:

if(continueBool == true)
  return true;
else
  return false;

Atau bahkan:

return (continueBool== true) ? true : false;

atau bahkan:

return continueBool;

Bergantung pada kompiler Anda, mungkin ada optimisasi yang dapat dilakukan pada kode yang menggunakan Bools untuk menyimpan nilai true / false yang dipetakan. Padahal, mungkin tidak ada optimasi yang dapat dilakukan untuk Ints yang digunakan untuk menyimpan nilai true / false yang dipetakan.

Kita juga harus ingat bahwa C ++ (bersama dengan C, Assembly dan FORTRAN) digunakan untuk menulis kode yang sangat efisien, kecil dan cepat. Jadi, akan lebih baik menggunakan Bool dalam hal ini - terutama jika Anda ditandai pada penggunaan variabel, memori, cache atau waktu prosesor.

Pertanyaan serupa adalah: mengapa saya menyimpan integer (nilai) dalam float? Jawaban: Anda tidak boleh, karena tidak ada gunanya.

Singkat cerita: Sebagai guru / tutor / dosen / profesor Anda untuk membahas ukuran berbagai jenis nilai dengan Anda (jika Anda melewatkannya), dan mengapa mereka penting dalam Pengembangan Perangkat Lunak.

Saya harap ini membantu sebagai titik awal (saya juga berharap itu tidak dianggap sebagai hal yang terlalu besar)

Jamie Taylor
sumber
4
Penggunaan if () award yang tidak perlu. Cukup tulis return value >= 0;untuk contoh pertama.
zvrba
Saya tidak yakin pada tingkat pemahaman OP tentang sintaksis. Kadang-kadang bermanfaat untuk menjadi sedikit lebih bertele-tele dari biasanya - terutama karena OP menyebutkan bahwa itu adalah tugas
Jamie Taylor
2
Bukan untuk tidak setuju - tetapi hanya untuk menunjukkan bahwa menghemat tiga byte dengan memilih bool di atas int tidak akan membuat perbedaan nyata pada sebagian besar program. Jangan khawatir tentang efisiensi sampai Anda benar-benar memiliki masalah kinerja!
James Anderson
@ James: juga dalam banyak kasus Anda tidak akan menyimpan tiga byte karena variabel berikutnya, kecuali bool atau char lain, mungkin akan disejajarkan dengan batas empat byte.
JeremyP
1

Tujuannya di sini adalah kejelasan niat. Jenis kembali adalah bagian dari antarmuka fungsi dan boolmemberitahu Anda lebih banyak tentang apa yang diharapkan dari fungsi daripada sebuah inttidak.

Bahkan BOOLlebih ekspresif daripada int, meskipun itu jenis yang sama itu setidaknya menunjukkan niat Anda.

Namun, tidak satupun dari mereka yang saya rekomendasikan:

enum class UiCmd {QUIT, START_GAME};
kamikaze
sumber
-1

Dalam pemrograman Anda ingin mewakili sesuatu dari kehidupan nyata dalam kode. Meskipun int dan bool dapat melakukan hal yang sama, ide subyacent sama sekali berbeda: ketika menggunakan bool jawabannya mungkin ya atau tidak; dan itu saja, itulah tujuannya. Dengan bilangan bulat, Anda mungkin mewakili jumlah tanpa titik desimal. Dan dengan semangat yang sama, mengapa Anda memilih integer ketika double dapat melakukan hal yang sama? Jika integer lebih masuk akal daripada dobel saat memodelkan masalah, maka Anda dapat memilih int.

fjrg76
sumber
1
ini tampaknya tidak menawarkan sesuatu yang substansial atas poin yang dibuat dan dijelaskan dalam jawaban teratas di sini yang diposting sekitar 6 tahun yang lalu
agas
-2

Karena pada akhirnya, Anda akan mengubah bilangan bulat Anda menjadi boolean: "jika (i = 1) maka mainkan game lain". Dalam situasi ini (i = 1) dikonversi menjadi benar atau salah: a boolean.

Pieter B
sumber
sangat tergantung pada mesin yang Anda jalankan dan kompiler yang terlibat. Anda mungkin terkejut mengetahui daripada mainframe IBM, flag karakter tunggal dengan "Y" atau "N" adalah cara paling efisien untuk mengimplementasikan logika boolean.
James Anderson
4
Dari catatan, if (i = 1)mungkin hal yang sangat salah untuk dimiliki dalam kode seseorang.