C++中字母和字符串的比较

4
为什么要这段代码
if ("j" > "J")

返回false,而不是这个:

string a = "j";
string b = "J";

if (a > b)

返回true?这是正确的答案,我该如何修复它?


6
"j""J" 是指针,因此您正在比较它们的地址。 - David G
4个回答

2
这是因为 "j""J" 是字符串字面值,它们被作为 const char 指针进行比较。因此,比较的结果是任意的,因为字面值在内存中的位置是由实现定义的。
另一方面,当你从这些字符串字面值创建 std::string 对象时,< 运算符(以及其他比较运算符)被路由到由 std::string 类提供的重载上。这个重载执行字符串的词典排序比较,而不是比较指针值,因此比较的结果看起来是正确的。

1
“字符串字面量实际上是作为const char指针实现的” - 实际上并不是,它们只是在<比较中衰减为const char指针。 - Tony Delroy

2
您可以使用单引号来比较符号:if ('j' > 'J')

2

这是因为"j"和"J"都是const char[]类型。例如,"j"是一个字符数组,c[0]='j',c[1]='\0'。在C和C++中,你不能直接比较两个数组。更好的做法是使用

strcmp("j","J");

巫婆在这里

当你输入时

string a="j"

您在类字符串中运行构造函数。但是在类字符串中,您已经重载了运算符<来比较两个字符串。


0

你可以尝试一下

if ("J" < "j")

可能会得到不同的结果。

实际上,“J”和“j”是常量C字符串,可以放置在.data或.text部分中,这取决于输出二进制文件格式。因此,当您比较它们时,您正在比较它们在内存中的地址。

但是std::string是一个C++类,重载了>运算符,因此它不是地址/指针比较,而是内容比较。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接