"a" == "a"
Esta expresión puede producir true
o false
; no hay garantías Los dos literales de cadena "a"
pueden ocupar el mismo espacio de almacenamiento o pueden existir en dos ubicaciones diferentes en la memoria.
Creo que el lenguaje más cercano en el Estándar C++ es: "Si todos los literales de cadena son distintos (es decir, se almacenan en objetos que no se superponen) se define la implementación" (C++ 11 §2.14.5/12). No hay otros requisitos o restricciones, por lo que el resultado no se especifica.
"a" != "b"
Esta expresión debe dió false
porque no hay manera de que estos dos cadenas literales pueden ocupar el mismo lugar en la memoria: "a"[0] != "b"[0]
.
Cuando se comparan las cadenas literales de esta manera, en realidad estás comparando los punteros a los elementos iniciales en las matrices.
Debido a que estamos comparando los punteros, las comparaciones relacionales (<
, >
, <=
y >=
) son aún más problemática que las comparaciones de igualdad (==
y !=
) porque sólo un conjunto restringido de comparaciones puntero se puede realizar utilizando el relacional comparaciones Dos punteros solo pueden compararse relacionalmente si son punteros en el mismo conjunto o punteros en el mismo objeto.
Si los dos "a"
literales de cadena ocupan la misma posición en la memoria, entonces "a" < "a"
sería bien definido y produciría false
, debido a que ambos punteros apuntan al elemento inicial ('a'
) de la misma matriz.
Sin embargo, si las dos cadenas literales "a"
ocupan diferentes ubicaciones en la memoria, el resultado de "a" < "a"
no está definido, ya que los dos punteros siendo el punto en objetos sin relación alguna comparación.
Dado que "a"
y "b"
no pueden ocupar la misma ubicación en la memoria, "a" < "b"
siempre tiene un comportamiento indefinido. Lo mismo es cierto para los otros operadores de comparación relacional.
Si lo hizo, por alguna razón, desea comparar relacionalmente dos literales de cadena y tener resultados bien definidos, puede utilizar el comparador std::less
, que proporciona un ordenamiento estricto-débil sobre todos los punteros. También hay std::greater
, std::greater_equal
y std::less_equal
comparadores.Dado que los literales de cadenas con los mismos contenidos pueden no ser iguales, no sé por qué uno querría hacer esto alguna vez, pero puede hacerlo.
¿Por qué tendrías que hacer esto? Para un falso garantizado, intente 'assert (! 'El mensaje va aquí"); ' – chris
@chris: Curiosidad para uno. También para una idea de implementación de clase enum. –
posible duplicado de [Diferencia de salida en gcc y turbo C] (http://stackoverflow.com/questions/3289354/output-difference-in-gcc-and-turbo-c) – kennytm