有人可以澄清这次比较中实际上发生了什么吗?
在C ++程序中,如果我有:
string name1 = "Mary";
我这样做:
name1 < "Mary Jane" // true
为什么这是真的?如果C ++将每个字符与每个字符进行比较,并且第一个不匹配的字符是name1 =“ Mary”末尾的单双引号与“ Mary Jane”中的空格值,则通过ASCII值,空格值小于单个字符引号...
答案 0 :(得分:5)
string name1 = "Mary";
让我们取消选择,有几件事正在发生。
令牌
"Mary"
一个单独的string literal可以对数组进行粗略估算
const char literal_array[5] = { 'M', 'a', 'r', 'y', 0 };
您会明白为什么值得使用一些语法糖-将每个字符串写出来都是很糟糕的。
无论如何,那里没有"
字符-它们用于告诉编译器发出该字符串文字,但它们不属于字符串本身。
然后,一旦我们知道表达式的右边是什么,我们就可以看向左边:
string name1 = "Mary"
是真的
string name1(literal_array);
使用构造函数
basic_string<char>::basic_string<char>(const char *)
我的意思略有解释,但这是项目5 here。
name1 < "Mary Jane"
现在我们终于知道左侧是什么了,我们可以看一下这个表达式,它扩展为
const char literal_array2[10] = { 'M', 'a', 'r', 'y', ' ', 'J', 'a', 'n', 'e', 0 };
operator< (name1, literal_array2)
这是第9个重载here(在撰写本文时),并且将compare
称为
name1.compare(literal_array2)
被描述为执行以下操作:
4)将此字符串与以s指向的字符开始的以空终止的字符序列进行比较,就好像是
compare(basic_string(s))
这使我们回到第一个重载:
1)首先,计算要比较的字符数,就像按
size_type rlen = std::min(size(), str.size()).
然后通过调用进行比较
Traits::compare(data(), str.data(), rlen).
对于标准字符串,此功能执行逐个字符的字典比较。
如果结果为零(到目前为止字符串是相等的),
请注意,到目前为止,我们只是将“ Mary”与“ Mary”进行了比较
然后将它们的大小进行如下比较:
size(data) < size(arg) => data is less than arg => result <0
其中“结果<0”表示operator<
将返回true。
答案 1 :(得分:0)
重载的<
运算符不比较字符串中的"
。 ""
用于表示字符串,以便编译器将其解析为字符串。它们不是字符串的一部分。
答案 2 :(得分:0)
尽管我们用C ++编写带引号的字符串文字,但这些引号实际上并不是字符串的一部分。也就是说,您在此处实际比较的字符串是Mary
和Mary Jane
,不带引号。
C ++按字典顺序比较字符串,这意味着它一次只处理一个字符,直到发现不匹配或其中一个字符串结束。如果在其中一个字符串结束之前未发现不匹配项,则较短的字符串比较小,因此您在这里看到的结果。