string s;
bool b[] = {s=="", s==s.c_str(), s.c_str()==""};
setzt
b[] = {true, true, false};
Warum ist b[2]
falsch?
Wenn A==B
und 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==B
und 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.