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==Bi A==Cczy 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==Bi A==Cczy 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.