C ++使用关系运算符比较字符串

时间:2018-08-15 16:09:00

标签: c++ string operators relational

有人可以澄清这次比较中实际上发生了什么吗?

在C ++程序中,如果我有:

string name1 = "Mary";

我这样做:

name1 < "Mary Jane" // true

为什么这是真的?如果C ++将每个字符与每个字符进行比较,并且第一个不匹配的字符是name1 =“ Mary”末尾的单双引号与“ Mary Jane”中的空格值,则通过ASCII值,空格值小于单个字符引号...

3 个答案:

答案 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 ++编写带引号的字符串文字,但这些引号实际上并不是字符串的一部分。也就是说,您在此处实际比较的字符串是MaryMary Jane,不带引号。

C ++按字典顺序比较字符串,这意味着它一次只处理一个字符,直到发现不匹配或其中一个字符串结束。如果在其中一个字符串结束之前未发现不匹配项,则较短的字符串比较小,因此您在这里看到的结果。