"a" == "a"
Это выражение может дать true
или false
; нет никаких гарантий. Два строковых литерала "a"
могут занимать одно и то же хранилище или могут существовать в двух разных местах памяти.
Я думаю, что самый близкий язык в стандарте C++: «Являются ли все строковые литералы различными (то есть, хранятся в объектах с неперекрывающимися объектами) - это реализация определена» (C++ 11 §2.14.5/12). Нет других требований или ограничений, поэтому результат остается неуказанным.
"a" != "b"
Это выражение должно давать false
, потому что нет никакого способа, что эти две строковые литералы могут занимать то же место в памяти: "a"[0] != "b"[0]
.
При сравнении строковых литералов, таким образом, вы действительно сравнивать указатели на исходные элементы в массивах.
Поскольку мы сравниваем указатели, реляционные сравнения (<
, >
, <=
и >=
) еще более проблематичным, чем сравнения равенства (==
и !=
), потому что только ограниченный набор указателей сравнения может быть выполнена с использованием реляционных сравнения. Два указателя могут быть реляционно сопоставлены только в том случае, если они оба указывают на один и тот же массив или указатели на один и тот же объект.
Если два "a"
строковых литералов занимают то же место в памяти, то "a" < "a"
будет хорошо определена и даст false
, потому что оба указателя указывают на начальный элемент ('a'
) одного и того же массива.
Однако, если два "a"
строковые литералы занимают различное места в памяти, результат "a" < "a"
не определен, так как два указатель сравнивает точку в совершенно не связанные между собой объекты.
Поскольку "a"
и "b"
никогда не могут занимать одно и то же место в памяти, "a" < "b"
всегда имеет неопределенное поведение. То же самое верно для других операторов сравнения реляций.
Если вы по какой-то причине хотите реляционно сравнить два строковых литерала и имеете четко определенные результаты, вы можете использовать сравнение std::less
, которое обеспечивает строго-слабый порядок над всеми указателями. Есть также std::greater
, std::greater_equal
, и std::less_equal
Сравнить цены.Учитывая, что строковые литералы с одним и тем же содержимым могут не сравниться с равными, я не знаю, почему это когда-либо хотелось бы сделать, но вы можете.
Зачем вам это нужно? Для гарантированного false попробуйте 'assert (!" Message here here ");' – chris
@chris: Любопытство для одного. Также для идеи реализации типа перечислимого типа. –
Возможный дубликат [Выходная разница в gcc и turbo C] (http://stackoverflow.com/questions/3289354/output-difference-in-gcc-and-turbo-c) – kennytm