当使用 ==
运算符(或 !=
)将一个字符串文字与另一个字符串文字进行比较时,结果是否明确定义?
例如,以下是否保证成立?
assert("a" == "a");
assert("a" != "b");
请不要说“使用 std::string”之类的话。我只想知道这个具体案例。
最佳答案
"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
比较器。鉴于具有相同内容的字符串文字可能不相等,我不知道为什么有人会想要这样做,但你可以。
关于C++ 比较两个字符串文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11144118/