Pourquoi b [2] est-il faux?

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

ensembles

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

pourquoi est b[2]faux?

Si A==Bet A==C, cela ne devrait-il pas impliquer B==C?

NoComprende
la source
Je vois mon erreur maintenant et j'ai un sentiment de déjà-vu car ce n'est pas la première fois que je me trompe en comparant des pointeurs.
NoComprende

Réponses:

14

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.

Vlad de Moscou
la source
La norme garantit-elle que les pointeurs sont différents, dans le dernier cas? Je comprends qu'ils peuvent l'être.
Jeffrey
Je peux seulement ajouter que ce devrait être UB. "comparaison avec des résultats littéraux de chaîne dans un comportement non spécifié"
Roout
@Jeffrey Il garantit car au moins la chaîne est vide. :) Mais en tout cas la classe std :: string utilise une copie d'un argument de son constructeur.
Vlad de Moscou
1
@Roout - "UB" signifie un comportement indéfini ". Cela signifie que la définition du langage ne vous indique pas quel est le comportement du programme ** . Un programme avec un comportement indéfini n'est pas un programme C ++ valide." Un comportement non spécifié "signifie que il existe plusieurs alternatives, et la norme ne vous dit pas laquelle sera choisie. Le programme est valide et l'implémentation peut choisir n'importe laquelle des alternatives.
Pete Becker
@PeteBecker un programme avec UB est toujours un programme C ++ valide (au moins dans le sens où il se compile avec succès et peut être exécuté).
trolley813