Hari ini saat menulis beberapa kode Visual C ++ saya telah menemukan sesuatu yang mengejutkan saya. Tampaknya C ++ mendukung ++ (increment) untuk bool, tetapi tidak - (decrement). Apakah ini hanya keputusan acak, atau ada alasan di balik ini?
Ini mengkompilasi:
static HMODULE hMod = NULL;
static bool once = false;
if (!once++)
hMod = LoadLibrary("xxx");
Ini tidak:
static HMODULE hMod = NULL;
static bool once = true;
if (once--)
hMod = LoadLibrary("xxx");
++once
danonce++
bekerja dengan gcc, tetapi bukan penurunannya.bool
sudah tidak digunakan lagi, souce .std::exchange(once,false)
(note: not atomic), jika Anda menginginkan sesuatu yang tidak usang.Jawaban:
Itu berasal dari sejarah menggunakan nilai integer sebagai boolean.
Jika
x
adalahint
, tetapi saya menggunakannya sebagai boolean karenaif(x)...
peningkatan itu berarti bahwa apa pun nilai kebenarannya sebelum operasi, itu akan memiliki nilai kebenarantrue
setelahnya (kecuali overflow).Namun, tidak mungkin untuk memprediksi hasil dari
--
pengetahuan yang diberikan hanya dari nilai kebenaranx
, karena dapat menghasilkanfalse
(jika nilai integral adalah 1) atautrue
(jika nilai integral adalah yang lain - terutama ini termasuk 0 [false
] dan 2 atau lebih [true
]).Jadi sebagai tangan pendek
++
bekerja, dan--
tidak.++
diizinkan pada bools untuk kompatibilitas dengan ini, tetapi penggunaannya tidak digunakan lagi dalam standar.Ini mengasumsikan bahwa saya hanya menggunakan
x
sebagai boolean, yang berarti bahwa overflow tidak dapat terjadi sampai saya melakukannya++
cukup sering untuk menyebabkan overflow itu sendiri. Bahkan dengan char sebagai tipe yang digunakan danCHAR_BITS
sesuatu yang rendah seperti 5, itu 32 kali sebelum ini tidak berfungsi lagi (itu masih cukup argumen karena itu adalah praktik yang buruk, saya tidak membela praktiknya, hanya menjelaskan mengapa itu berhasil) untuk 32-bitint
kami tentu saja harus menggunakan++
2 ^ 32 kali sebelum ini menjadi masalah. Dengan--
meskipun itu hanya akan menghasilkanfalse
jika saya mulai dengan nilai 1 untuktrue
, atau dimulai dengan 0 dan digunakan++
tepat sekali sebelumnya.Ini berbeda jika kita mulai dengan nilai yang hanya sedikit di bawah 0. Memang, dalam kasus seperti ini kita mungkin ingin
++
menghasilkanfalse
nilai pada akhirnya seperti:Namun, contoh ini diperlakukan
x
sebagai diint
mana - mana kecuali bersyarat, jadi itu setara dengan:Yang berbeda hanya menggunakan
x
sebagai boolean.sumber
<limits.h>
header danCHAR_BIT
makro. Sebelum itu, saya kira secara teoritis mungkin ada implementasi di manachar
lebih sempit dari 8 bit, tetapi sejauh yang saya tahu tidak ada. Secara khusus, K & R1 (diterbitkan pada tahun 1978) mencantumkan 4 contoh implementasi, yang semuanya memiliki 8-bit atau 9-bitchar
.CHAR_BIT >= 8
. Standar tidak membuat tunjangan untuk target yang sulit. (Anda dapat memiliki penerapan yang tidak sesuai, tentu saja.)ANSI ISO IEC 14882 2003 (c ++ 03):
5.2.6-2
Dan tidak mengherankan ...
5.3.2-2
Juga 5.6.2-1 dan 5.3.2-1 menyebutkan bahwa ++ untuk bools harus benar dan Lampiran D-1 menyatakan bahwa ++ pada bools sudah tidak digunakan lagi.
sumber
Karena alasan sejarah, ini didukung. Tapi perhatikan bahwa ... Penggunaan operand tipe bool dengan operator ++ tidak digunakan lagi, lihat Bagian 5.3.2 di C ++ Standard (n3092)
5.3.2 Peningkatan dan penurunan [expr.pre.incr]
sumber
sumber