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

Nor*_*ndy 0 c++ string relational operators

有人可以澄清在比较过程中实际发生的事情.

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

string name1 = "Mary";
Run Code Online (Sandbox Code Playgroud)

我这样做:

name1 < "Mary Jane" // true
Run Code Online (Sandbox Code Playgroud)

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

Use*_*ess 5

string name1 = "Mary";
Run Code Online (Sandbox Code Playgroud)

让我们解开这个,有几件事情正在发生.

令牌

"Mary"
Run Code Online (Sandbox Code Playgroud)

单独使用是一个字符串文字,大致计算数组

const char literal_array[5] = { 'M', 'a', 'r', 'y', 0 };
Run Code Online (Sandbox Code Playgroud)

你可以看出为什么值得拥有一些语法糖 - 写出每个字符串都会很糟糕.

无论如何,那里没有"字符 - 它们用来告诉编译器发出字符串文字,但它们不是字符串本身的一部分.

然后,一旦我们知道表达式的右侧是什么,我们就可以看左边:

string name1 = "Mary"
Run Code Online (Sandbox Code Playgroud)

是真的

string name1(literal_array);
Run Code Online (Sandbox Code Playgroud)

使用构造函数

basic_string<char>::basic_string<char>(const char *)
Run Code Online (Sandbox Code Playgroud)

我稍微意译,但它是第5项这里.


name1 < "Mary Jane"
Run Code Online (Sandbox Code Playgroud)

现在我们终于知道左手边是什么了,我们可以看看这个表达式,它扩展为

const char literal_array2[10] = { 'M', 'a', 'r', 'y', ' ', 'J', 'a', 'n', 'e', 0 };
operator< (name1, literal_array2)
Run Code Online (Sandbox Code Playgroud)

这是第9个过载这里(在写作的时间),并呼吁compare

name1.compare(literal_array2)
Run Code Online (Sandbox Code Playgroud)

这描述为执行以下操作:

4)将此字符串与从s指向的字符开始的以null结尾的字符序列进行比较,如同 compare(basic_string(s))

这让我们回到第一次重载:

1)首先,计算要比较的字符数,如同

size_type rlen = std::min(size(), str.size()).
Run Code Online (Sandbox Code Playgroud)

然后通过调用进行比较

Traits::compare(data(), str.data(), rlen).
Run Code Online (Sandbox Code Playgroud)

对于标准字符串,此函数执行逐字符词典比较.

如果结果为零(到目前为止字符串相等),

请注意,到目前为止我们刚刚将"玛丽"与"玛丽"进行了比较

那么它们的尺寸比较如下:

size(data) < size(arg)    => data is less than arg    => result <0
Run Code Online (Sandbox Code Playgroud)

其中"result <0"表示operator<将返回true.