提问人:vss2sn 提问时间:12/5/2022 更新时间:12/5/2022 访问量:53
与 C++ 中的 > 和 <运算符的临时字符串比较 [duplicate]
Temporary string comparison with > and < operators in C++ [duplicate]
问:
这些运算符不执行字典比较,并且似乎提供不一致的结果。
#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>()
答:
1赞
user17732522
12/5/2022
#1
字符文字是字符数组。您正在比较这些数组,在数组到指针衰减之后,这意味着您正在比较这些数组的第一个字节的地址。
每个字符文字可以引用不同的此类数组,即使它具有相同的值。并且无法保证其地址的顺序。
因此,您的测试的任何可能结果是允许的。/ 以及 /、/ 和 /。0
0
0
1
1
0
1
1
您可以通过始终使用 或 文字来避免字符串文字的所有 C 样式数组行为:std::string
std::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""s
std::string
sv
std::string_view
string_view
评论
strcmp
。