与 C++ 中的 > 和 <运算符的临时字符串比较 [duplicate]

Temporary string comparison with > and < operators in C++ [duplicate]

提问人:vss2sn 提问时间:12/5/2022 更新时间:12/5/2022 访问量:53

问:

这些运算符不执行字典比较,并且似乎提供不一致的结果。

#include <iostream>
int main () {
    std::cout << ("70" < "60") << '\n';
    std::cout << ("60" < "70") << '\n';
    return 0;
}

#include <iostream>
int main() {
    std::cout << ("60" < "70") << '\n';
    std::cout << ("70" < "60") << '\n';
    return 0;
}

两者都打印

1
0

这同样适用于 。但是,提供了正确的词典比较。这种行为的原因是什么? 上面显示的比较是否比较了 char 数组的地址?std::less<>()std::less<std::string>()

C++ 字符串 运算符 临时 字符数组

评论

1赞 Nicol Bolas 12/5/2022
"比较 char 数组的地址“ 这就是字符串文字(或多或少)。
1赞 Sam Varshavchik 12/5/2022
因为字符串文字是字符指针,这比较的是随机内存地址。
0赞 Evg 12/5/2022
这些运算符不执行字典比较 - 为什么要这样做?
0赞 marcinj 12/5/2022
好消息是两个数组之间的比较在 C++20 中已弃用,因此您应该在现代 C++ 编译器中看到警告。阅读警告是一个好习惯。
0赞 Pete Becker 12/5/2022
对于 C 样式字符串的字典比较,请使用 strcmp

答:

1赞 user17732522 12/5/2022 #1

字符文字是字符数组。您正在比较这些数组,在数组到指针衰减之后,这意味着您正在比较这些数组的第一个字节的地址。

每个字符文字可以引用不同的此类数组,即使它具有相同的值。并且无法保证其地址的顺序。

因此,您的测试的任何可能结果是允许的。/ 以及 /、/ 和 /。00011011


您可以通过始终使用 或 文字来避免字符串文字的所有 C 样式数组行为:std::stringstd::string_view

#include <iostream>

using namespace std::string_literals;

int main () {
    std::cout << ("70"s < "60"s) << '\n';
    std::cout << ("60"s < "70"s) << '\n';
    return 0;
}

这使用标准库中的用户定义的字符串文字,从字符串文字中立即形成 s。 可以代替 S 使用。(将产生更少的性能成本,特别是没有动态分配。operator""sstd::stringsvstd::string_viewstring_view