¿Por qué es b [2] falso?


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

conjuntos

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

¿Por qué es b[2]falso?

Si A==By A==C, ¿no debería implicar eso B==C?



Ahora veo mi error y tengo la sensación de deja vu, ya que no es la primera vez que me confundo al comparar punteros.
NoComprende

Respuestas:


14

En esta expresion

s.c_str()==""

Se comparan dos punteros (direcciones). El primero es el puntero devuelto por s.c_str()y el segundo es el puntero al primer carácter (terminando el carácter cero) del literal de cadena "".

Es evidente que las direcciones son diferentes (tenga en cuenta también que el literal de cadena tiene la duración del almacenamiento estático).

Para obtener el resultado esperado, debe escribir en su lugar

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

En cuanto a estas dos expresiones

s==""

y

s==s.c_str()

entonces hay cadenas comparadas porque la clase estándar std :: string ha sobrecargado el operador == para el operando correcto.


¿La norma garantiza que los punteros sean diferentes, en el último caso? Entiendo que pueden ser.
Jeffrey

Solo puedo agregar que debería ser UB. "comparación con resultados literales de cadena en comportamiento no especificado"
Roout

@ Jeffrey Garantiza porque al menos la cadena está vacía. :) Pero en cualquier caso, la clase std :: string utiliza una copia de un argumento de su constructor.
Vlad desde Moscú

1
@Roout - "UB" significa comportamiento indefinido ". Significa que la definición del lenguaje no le dice cuál es el comportamiento del programa ** . Un programa con comportamiento indefinido no es un programa válido de C ++." Comportamiento no especificado "significa que hay varias alternativas, y la norma no le dice cuál de los será elegido el programa es válido, y la puesta en práctica pueden elegir cualquiera de las alternativas..
Pete Becker

@PeteBecker un programa con UB sigue siendo un programa C ++ válido (al menos en el sentido de que se compila correctamente y se puede ejecutar).
trolley813
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.