Mengapa b [2] salah?

11
string s;
bool b[] = {s=="",  s==s.c_str(),  s.c_str()==""};

set

b[] = {true, true, false};

mengapa b[2]salah?

Jika A==Bdan A==C, bukankah itu berarti B==C?

NoComprende
sumber
Saya melihat kesalahan saya sekarang dan saya punya perasaan deja vu karena ini bukan pertama kalinya saya bingung membandingkan pointer.
NoComprende

Jawaban:

14

Dalam ungkapan ini

s.c_str()==""

ada dibandingkan dua petunjuk (alamat). Yang pertama adalah pointer yang dikembalikan oleh s.c_str()dan yang kedua adalah pointer ke karakter pertama (mengakhiri karakter nol) dari string literal "".

Jelas bahwa alamatnya berbeda (ingat juga bahwa string literal memiliki durasi penyimpanan statis).

Untuk mendapatkan hasil yang diharapkan, Anda harus menulis

std::strcmp( s.c_str(), "" ) == 0

Adapun dua ungkapan ini

s==""

dan

s==s.c_str()

kemudian ada string yang dibandingkan karena std :: string kelas standar telah membebani operator == untuk operan yang tepat.

Vlad dari Moskow
sumber
Apakah standar menjamin pointer menjadi berbeda, dalam kasus terakhir? Saya mengerti mereka bisa.
Jeffrey
Hanya dapat menambahkan bahwa itu harus UB. "perbandingan dengan string literal menghasilkan perilaku yang tidak ditentukan"
Roout
@Jeffrey Ini menjamin karena setidaknya string kosong. :) Tetapi bagaimanapun juga std :: string menggunakan salinan argumen konstruktornya.
Vlad dari Moskow
1
@Roout - "UB" berarti perilaku yang tidak terdefinisi ". Ini berarti bahwa definisi bahasa tidak memberi tahu Anda apa perilaku dari program ** . Program dengan perilaku yang tidak ditentukan bukan program C ++ yang valid." Perilaku yang tidak ditentukan "berarti bahwa ada beberapa alternatif, dan standar tidak memberi tahu Anda yang mana dari yang akan dipilih. Program ini valid, dan implementasinya dapat memilih salah satu alternatif.
Pete Becker
@PeteBecker, sebuah program dengan UB masih merupakan program C ++ yang valid (setidaknya dalam arti berhasil mengkompilasi dan dapat dijalankan).
troli813