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值,空格值小于单个引号...
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)
name1.compare(literal_array2)
Run Code Online (Sandbox Code Playgroud)
这描述为执行以下操作:
4)将此字符串与从s指向的字符开始的以null结尾的字符序列进行比较,如同
compare(basic_string(s))
这让我们回到第一次重载:
1)首先,计算要比较的字符数,如同
Run Code Online (Sandbox Code Playgroud)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
其中"result <0"表示operator<
将返回true.