Por que b [2] é falso?


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

conjuntos

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

porque é b[2]falso?

Se A==Be A==C, isso não deveria implicar B==C?



Agora vejo meu erro e tenho uma sensação de déjà vu, pois não é a primeira vez que me confundo comparando indicadores.
NoComprende 17/10/19

Respostas:


14

Nessa expressão

s.c_str()==""

são comparados dois ponteiros (endereços). O primeiro é o ponteiro retornado por s.c_str()e o segundo é o ponteiro para o primeiro caractere (terminando o caractere zero) da string literal "".

É evidente que os endereços são diferentes (lembre-se também de que a string literal tem a duração do armazenamento estático).

Para obter o resultado esperado, você deve escrever

std::strcmp( s.c_str(), "" ) == 0

Quanto a essas duas expressões

s==""

e

s==s.c_str()

há seqüências comparadas porque a classe padrão std :: string sobrecarregou o operador == para o operando certo.


O padrão garante que os ponteiros sejam diferentes, no último caso? Eu entendo que eles podem ser.
Jeffrey

Só é possível adicionar que ele deve ser UB. "comparação com resultados literais de strings em comportamento não especificado"
Roout 17/10/19

@ Jeffrey É garantido porque pelo menos a string está vazia. :) Mas, em qualquer caso, a classe std :: string usa uma cópia de um argumento de seu construtor.
Vlad de Moscou

11
@Roout - "UB" significa comportamento indefinido ". Isso significa que a definição de linguagem não informa qual é o comportamento do programa ** . Um programa com comportamento indefinido não é um programa C ++ válido." Comportamento não especificado "significa que existem várias alternativas, e o padrão não lhe dizer qual desses será escolhido o programa é válido, ea implementação pode escolher qualquer uma das alternativas..
Pete Becker

@PeteBecker um programa com UB ainda é um programa C ++ válido (pelo menos no sentido de compilar com êxito e poder ser executado).
trolley813
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.