string s;
bool b[] = {s=="", s==s.c_str(), s.c_str()==""};
imposta
b[] = {true, true, false};
perché è b[2]
falso?
Se A==B
e A==C
, ciò non dovrebbe implicare B==C
?
string s;
bool b[] = {s=="", s==s.c_str(), s.c_str()==""};
imposta
b[] = {true, true, false};
perché è b[2]
falso?
Se A==B
e A==C
, ciò non dovrebbe implicare B==C
?
Risposte:
In questa espressione
s.c_str()==""
vengono confrontati due puntatori (indirizzi). Il primo è il puntatore restituito da s.c_str()
e il secondo è il puntatore al primo carattere (terminando il carattere zero) del valore letterale della stringa ""
.
È evidente che gli indirizzi sono diversi (tenere presente anche che la stringa letterale ha la durata di memorizzazione statica).
Per ottenere il risultato atteso dovresti invece scrivere
std::strcmp( s.c_str(), "" ) == 0
Per quanto riguarda queste due espressioni
s==""
e
s==s.c_str()
quindi ci sono stringhe confrontate perché la classe standard std :: string ha l'operatore sovraccaricato == per l'operando giusto.