"a" == "a"
这个表达式可能会产生true
or false
;没有任何保证。他们俩"a"
字符串文字可能占用相同的存储空间,也可能存在于内存中的两个不同位置。
我认为 C++ 标准中最接近的语言是:“所有字符串文字是否不同(即存储在非重叠对象中)是实现定义的”(C++11 §2.14.5/12)。没有其他要求或限制,因此结果未指定。
"a" != "b"
这个表达式必须产生false
因为这两个字符串文字不可能在内存中占据相同的位置:"a"[0] != "b"[0]
.
当您以这种方式比较字符串文字时,您实际上是在比较指针与数组中的初始元素。
因为我们正在比较指针,所以关系比较(<
, >
, <=
, and >=
)比相等比较(==
and !=
)因为使用关系比较只能执行一组有限的指针比较。仅当两个指针都是指向同一数组的指针或指向同一对象的指针时,才可以进行关系比较。
如果两个"a"
字符串文字在内存中占据相同的位置,然后"a" < "a"
将是明确定义的并且会产生false
,因为两个指针都指向初始元素('a'
)同一个数组。
然而,如果两个"a"
字符串文字占用不同的内存中的位置,结果"a" < "a"
未定义,因为被比较的两个指针指向完全不相关的对象。
Because "a"
and "b"
永远不能占据内存中的同一位置,"a" < "b"
总是有未定义的行为。其他关系比较运算符也是如此。
如果您出于某种原因想要比较两个字符串文字并获得明确定义的结果,则可以使用std::less
比较器,它对所有指针提供严格弱排序。还有std::greater
, std::greater_equal
, and std::less_equal
比较者。鉴于具有相同内容的字符串文字可能不相等,我不知道为什么有人会想要这样做,但你可以。