在if函数参数中,如何比较字符串s和t?为什么条件(s>t(为真?
string s = "to be";
string t = "not " + s; // t = “not to be”
string u = s + " or " + t; // u = “to be or not to be”
if (s > t) // true: “to be” > “not to be”
cout << u; // outputs “to be or not to be”
std::字符串运算符comp
所有比较都是通过
compare()
成员函数(它本身是根据特征::compare(((:来定义的
- 如果lhs和rhs的大小相等,并且lhs中的每个字符在rhs中都有相同的字符,则两个字符串相等位置
- 排序比较是按照字典进行的——比较是由一个等价于std::词典对照或std::字典对照three_way(从C++20开始(
因此,简而言之,它对进行了字典比较
即"to be"s > "not to be"s == true
,因为在第一个位置是't' > 'n'
。
std::string
的比较被设计为不令人惊讶,或者至少不令人惊讶。如果您坚持使用小写字母和空格,就像您的示例中一样,operator<
和operator>
遵循字母顺序。
not to be
to be
to be or not to be
由于您坚持使用简单的情况,string{"to be"} > string{"not to be"}
,因为它们按相反的字母顺序排列。即't' > 'n'
(作为字符(。
当你扩展到其他角色时,可能会有一些惊喜。例如,'Z' < 'a'
,因为ASCII将大写字母置于小写字母之前。尽管如此,原理仍然成立:std::string
的排序是基于底层字符集的排序。查找字符串不同的第一个字符位置;字符串的顺序与该位置的字符相同。如果一个(并且只有一个(字符串在找到差异之前用完了字符,那么较短的字符串会出现在较长的字符串之前。