string s;
bool b[] = {s=="", s==s.c_str(), s.c_str()==""};
ensembles
b[] = {true, true, false};
pourquoi est b[2]
faux?
Si A==B
et A==C
, cela ne devrait-il pas impliquer B==C
?
string s;
bool b[] = {s=="", s==s.c_str(), s.c_str()==""};
ensembles
b[] = {true, true, false};
pourquoi est b[2]
faux?
Si A==B
et A==C
, cela ne devrait-il pas impliquer B==C
?
Réponses:
Dans cette expression
s.c_str()==""
on compare deux pointeurs (adresses). Le premier est le pointeur renvoyé par s.c_str()
et le second est le pointeur sur le premier caractère (caractère zéro de terminaison) du littéral de chaîne ""
.
Il est évident que les adresses sont différentes (gardez également à l'esprit que le littéral de chaîne a la durée de stockage statique).
Pour obtenir le résultat attendu, vous devez plutôt écrire
std::strcmp( s.c_str(), "" ) == 0
Quant à ces deux expressions
s==""
et
s==s.c_str()
puis il y a des chaînes comparées car la classe standard std :: string a surchargé l'opérateur == pour l'opérande de droite.