string s;
bool b[] = {s=="", s==s.c_str(), s.c_str()==""};
zestawy
b[] = {true, true, false};
dlaczego b[2]
fałsz?
Jeśli A==B
i A==C
czy nie powinno to oznaczać B==C
?
string s;
bool b[] = {s=="", s==s.c_str(), s.c_str()==""};
zestawy
b[] = {true, true, false};
dlaczego b[2]
fałsz?
Jeśli A==B
i A==C
czy nie powinno to oznaczać B==C
?
Odpowiedzi:
W tym wyrażeniu
s.c_str()==""
porównywane są dwa wskaźniki (adresy). Pierwszy to wskaźnik zwracany przez, s.c_str()
a drugi to wskaźnik do pierwszego znaku (kończącego znak zero) literału łańcucha ""
.
Oczywiste jest, że adresy są różne (należy również pamiętać, że literał łańcuchowy ma statyczny czas przechowywania).
Aby uzyskać oczekiwany wynik, powinieneś napisać zamiast tego
std::strcmp( s.c_str(), "" ) == 0
Co do tych dwóch wyrażeń
s==""
i
s==s.c_str()
następnie porównywane są łańcuchy, ponieważ standardowa klasa std :: string przeciąża operator == dla właściwego operandu.