string s;
bool b[] = {s=="", s==s.c_str(), s.c_str()==""};
setzt
b[] = {true, true, false};
Warum ist b[2]falsch?
Wenn A==Bund A==C, sollte das nicht bedeuten B==C?
string s;
bool b[] = {s=="", s==s.c_str(), s.c_str()==""};
setzt
b[] = {true, true, false};
Warum ist b[2]falsch?
Wenn A==Bund A==C, sollte das nicht bedeuten B==C?
Antworten:
In diesem Ausdruck
s.c_str()==""
Es werden zwei Zeiger (Adressen) verglichen. Der erste ist der von zurückgegebene Zeiger s.c_str()und der zweite ist der Zeiger auf das erste Zeichen (Abschlusszeichen Null) des Zeichenfolgenliteral "".
Es ist offensichtlich, dass die Adressen unterschiedlich sind (denken Sie auch daran, dass das Zeichenfolgenliteral die statische Speicherdauer hat).
Um das erwartete Ergebnis zu erhalten, sollten Sie stattdessen schreiben
std::strcmp( s.c_str(), "" ) == 0
Wie für diese beiden Ausdrücke
s==""
und
s==s.c_str()
Dann werden Zeichenfolgen verglichen, da die Standardklasse std :: string den Operator == für den richtigen Operanden überladen hat.