Apakah spesifikasi C ++ mendefinisikan:
- keberadaan operator 'kurang dari' untuk parameter boolean, dan jika demikian,
- hasil dari permutasi 4 parameter?
Dengan kata lain, apakah hasil dari operasi berikut ditentukan oleh spesifikasi?
false < false
false < true
true < false
true < true
Pada pengaturan saya (Centos 7, gcc 4.8.2), kode di bawah ini mengeluarkan apa yang saya harapkan (mengingat sejarah C yang menyatakan false sebagai 0 dan true 1):
false < false = false
false < true = true
true < false = false
true < true = false
Sementara saya cukup yakin kebanyakan kompiler (semua?) Akan memberikan output yang sama, apakah ini diatur oleh spesifikasi C ++? Atau apakah kompiler yang membingungkan, tetapi memenuhi spesifikasi yang diizinkan untuk memutuskan bahwa benar kurang dari salah?
#include <iostream>
const char * s(bool a)
{
return (a ? "true" : "false");
}
void test(bool a, bool b)
{
std::cout << s(a) << " < " << s(b) << " = " << s(a < b) << std::endl;
}
int main(int argc, char* argv[])
{
test(false, false);
test(false, true);
test(true, false);
test(true, true);
return 0;
}
std::min
padastd::vector<bool>
sebagai&&
.p <= q
berartip implies q
kapanp
danq
dari tipe bool!<=
mungkin secara tidak sengaja dibaca sebagai leftarrow, dan bahwa "hanya jika" (yaitu, "menyiratkan" secara material ") rightarrow kadang-kadang dikeset atau secara informal ditulis dengan cara yang sama=>
(yaitu, dengan poros berlipat ganda menyerupai=
) . Leftarrow bahkan kadang-kadang dibaca sebagai "jika," meskipun saya percaya ini jauh lebih jarang daripada penggunaan rightarrow untuk "hanya jika."Jawaban:
TL; DR:
Operasi didefinisikan dengan baik sesuai dengan standar rancangan C ++.
Detail
Kita dapat melihat bahwa dengan masuk ke draft standar C ++ bagian
5.9
Operator relasional yang mengatakan ( penekanan tambang ke depan ):dan bool adalah tipe arithematic dari 3.9.1 tipe fundamental
dan
dan
true
danfalse
adalah boolean literals dari2.14.6
Boolean literals:Kembali ke bagian
5.9
untuk melihat mekanisme operator relasional lebih lanjut, dikatakan:yang konversi aritmatika biasa dibahas dalam bagian
5
yang mengatakan:dan bagian
4.5
mengatakan:dan demikian pula ungkapannya:
menggunakan aturan ini menjadi:
sumber
Nilai Boolean tunduk pada promosi integer biasa, dengan
false
didefinisikan sebagai0
dantrue
didefinisikan sebagai1
. Itu membuat semua perbandingan didefinisikan dengan baik.sumber
false
didefinisikan sebagai0
dantrue
didefinisikan1
dalam standar (bukan hanya oleh praktik umum) perlu bukti untuk mendukungnya.bool
tipe, bahkan sebelum ada C ++, hasil dari operasi boolean didefinisikan sebagai0
false dan1
true. Saya tidak akan terkejut jika Anda dapat menemukannya di K + R.<
(kurang dari),>
(lebih besar dari),<=
(kurang dari atau sama dengan), dan>=
(lebih besar dari atau sama dengan) akan menghasilkan 1 jika hubungan yang ditentukan benar dan 0 jika itu adalah salah. Hasilnya bertipeint
. "enum bool { false = 0, true = 1}
adalah legal tetapi tidak mendefinisikan suatuoperator<
.Menurut Standar C ++ (5.9 Operator relasional)
dan
dan (3.9.1 Jenis fundamental)
dan (4,5 promosi integral)
Jadi, dalam semua contoh Anda true dikonversi ke int 1 dan false dikonversi ke int 0
Ungkapan-ungkapan ini
sepenuhnya setara dengan
sumber
Boolean
false
setara denganint 0
, dan booleantrue
setara denganint 1
. Jadi ini menjelaskan mengapa ekspresifalse < true
=>0 < 1
adalah satu-satunya yang mengembalikantrue
.sumber