Perché b [2] è falso?


11
string s;
bool b[] = {s=="",  s==s.c_str(),  s.c_str()==""};

imposta

b[] = {true, true, false};

perché è b[2]falso?

Se A==Be A==C, ciò non dovrebbe implicare B==C?



Vedo il mio errore ora e ho la sensazione di deja vu in quanto non è la prima volta che mi confondo confrontando i puntatori.
NoComprende,

Risposte:


14

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.


Lo standard garantisce che i puntatori siano diversi, nell'ultimo caso? Capisco che possano essere.
Jeffrey,

Posso solo aggiungere che dovrebbe essere UB. "confronto con stringhe letterali si traduce in un comportamento non specificato"
Roout

@Jeffrey Garantisce che almeno la stringa è vuota. :) Ma in ogni caso la classe std :: string usa una copia di un argomento del suo costruttore.
Vlad da Mosca,

1
@Roout - "UB" significa comportamento indefinito ". Significa che la definizione della lingua non ti dice quale sia il comportamento del programma ** . Un programma con comportamento indefinito non è un programma C ++ valido." Comportamento non specificato "significa che ci sono diverse alternative e lo standard non ti dice quale di questi sarà scelto, il programma è valido e l'implementazione può scegliere una delle alternative
Pete Becker,

@PeteBecker un programma con UB è ancora un programma C ++ valido (almeno nel senso che si compila correttamente e può essere eseguito).
trolley813
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.