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?



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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.