Mengapa operator --
tidak ada untuk bool sedangkan untuk operator++
?
Saya mencoba di C ++, dan saya tidak tahu apakah pertanyaan saya berlaku untuk bahasa lain. Saya akan senang mengetahui juga.
Saya tahu , saya bisa menggunakan operator ++
dengan bool. Itu membuat bool sama dengan true.
bool b = false;
b++;
// Now b == true.
Mengapa kita tidak bisa menggunakan operator --
dengan cara yang berlawanan?
bool b = true;
b--;
// Now b == false;
Ini tidak terlalu berguna, tetapi saya ingin tahu.
Jawaban:
Di masa lalu dari C, tidak ada tipe boolean. Orang-orang menggunakan
int
untuk menyimpan data boolean, dan sebagian besar berhasil. Nol itu salah dan yang lainnya benar.Ini berarti jika Anda mengambil
int flag = 0;
dan kemudian apakahflag++
nilainya akan benar. Ini akan berfungsi tidak peduli berapa nilai bendera itu (kecuali jika Anda sering melakukannya, itu berguling dan Anda kembali ke nol, tetapi mari abaikan itu) - menambah bendera ketika nilainya 1 akan memberikan 2, yang masih benar.Beberapa orang menggunakan ini untuk menetapkan tanpa syarat nilai boolean menjadi true. Saya tidak yakin itu menjadi idiomatik , tetapi dalam beberapa kode.
Ini tidak pernah berhasil
--
, karena jika nilainya lebih dari 1 (yang bisa jadi), nilainya tetap tidak salah. Dan jika itu sudah salah (0
) dan Anda melakukan operator penurunan di atasnya, itu tidak akan tetap salah.Ketika memindahkan kode dari C ke C ++ di masa-masa awal, sangat penting bahwa kode C yang termasuk dalam C ++ masih bisa berfungsi. Dan dalam spesifikasi untuk C ++ (bagian 5.2.6 (pada halaman 71)) berbunyi:
Ini lagi disebutkan dalam bagian 5.3.2 (untuk operator awalan - 5.2.6 pada postfix)
Seperti yang Anda lihat, ini sudah usang (Lampiran D dalam dokumen, halaman 709) dan tidak boleh digunakan.
Tapi itu sebabnya. Dan kadang-kadang Anda dapat melihat kode. Tapi jangan lakukan itu.
sumber
Untuk mengatasi sebagian kode legacy yang digunakan
int
atau mirip dengan tipe booleannya.sumber
Untuk memahami signifikansi historis dari pertanyaan ini, Anda harus mempertimbangkan kasus Therac-25. Therac-25 adalah perangkat medis yang mengirimkan radiasi kepada pasien kanker. Itu terganggu dengan praktik pemrograman yang buruk yang berkontribusi terhadap rekam jejak keselamatan yang buruk (dengan beberapa kematian dikaitkan dengannya).
http://courses.cs.vt.edu/professionalism/Therac_25/Therac_1.html
(buka bagian bawah halaman 3)
Therac-25 menggunakan sesuatu yang mirip dengan
operator++
pada abool
. Namun, bahasa pemrograman yang mereka gunakan bukan C ++, dan tipe datanya tidakbool
. Berbeda dengan jaminan di C ++, tipe integer biasa terus naik. Tipe data mereka setara denganuint8_t
.C ++ memutuskan untuk mempertahankan
operator++
sekitar bagi orang-orang yang terbiasa dengan pemrograman seperti ini, tetapi alih-alih menambah nilainya, ia hanya menetapkannya menjaditrue
untuk mencegah hal-hal seperti ini.Perhatikan bahwa
operator++(bool)
sudah usang.http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3797.pdf
Lampiran D dari C ++ 14:
sumber
bool
tipe. Saya hanya mencoba memberikan contoh sejarah ketika orang benar-benar memprogram dengan cara ini.