与关系运算符的字符串比较(不同长度)
String comparisons with relational operators (differing lengths)
我在 C++ 中比较两个字符串,如下所示:
if(s1 <= s2)
//do stuff
我忘记了字符串比较的复杂性,并在以下情况下很快了解到:
s1 = "10.72";
s2 = "8.87";
该语句将评估为真并执行条件内的任何操作。比较发生在 8 和 1 之间。所有数字的 ASCII 表示都是从 48 (0) - 57 (9) 递增的顺序,显然 1 < 8。
我原以为 C++ 考虑了字符串长度,但这是不正确的。有人会介意从 C++ 语言设计的角度解释为什么不考虑长度吗?
实际上,通过在字符串上调用小于 <
或小于或等于 <=
运算符时使用的字典序比较,隐含地考虑了长度。
Two ranges are compared element by element.
The first mismatching element defines which range is lexicographically less or greater than the other.
If one range is a prefix of another, the shorter range is lexicographically less than the other.
If two ranges have equivalent elements and are of the same length, then the ranges are lexicographically equal.
来自http://en.cppreference.com/w/cpp/algorithm/lexicographical_compare
因此,举个例子
"10.72" < "10.721" // true
"10.72" == "10.72" // true (by string comparison as well as lexicographically equalness)
"10.7211" < "10.7212" // true
为什么,你问?这不是 C++ 的复杂性,而是如何比较字符串的复杂性,其中词典比较是最常见(在我看来,也是最合乎逻辑的)比较方法之一。
长度 已考虑在内,但不是您期望的那样。在字符串比较中,首先比较每个字符串的第一个字符。如果它们相等,则比较第二个字符,依此类推。因此,在您的示例中,要比较的第一个字符是“1”和“8”。 “8”更大。
如果您将“10.72”与“1.87”进行比较,则前几个字符会相等,因此接下来就是将“0”与“.”进行比较。
如果要比较数值,则必须将字符串转换为它们的数字表示形式,否则您将不得不编写自己的比较器将字符串视为数字。我希望能对此有所启发。
我在 C++ 中比较两个字符串,如下所示:
if(s1 <= s2)
//do stuff
我忘记了字符串比较的复杂性,并在以下情况下很快了解到:
s1 = "10.72";
s2 = "8.87";
该语句将评估为真并执行条件内的任何操作。比较发生在 8 和 1 之间。所有数字的 ASCII 表示都是从 48 (0) - 57 (9) 递增的顺序,显然 1 < 8。
我原以为 C++ 考虑了字符串长度,但这是不正确的。有人会介意从 C++ 语言设计的角度解释为什么不考虑长度吗?
实际上,通过在字符串上调用小于 <
或小于或等于 <=
运算符时使用的字典序比较,隐含地考虑了长度。
Two ranges are compared element by element.
The first mismatching element defines which range is lexicographically less or greater than the other.
If one range is a prefix of another, the shorter range is lexicographically less than the other.
If two ranges have equivalent elements and are of the same length, then the ranges are lexicographically equal.
来自http://en.cppreference.com/w/cpp/algorithm/lexicographical_compare
因此,举个例子
"10.72" < "10.721" // true
"10.72" == "10.72" // true (by string comparison as well as lexicographically equalness)
"10.7211" < "10.7212" // true
为什么,你问?这不是 C++ 的复杂性,而是如何比较字符串的复杂性,其中词典比较是最常见(在我看来,也是最合乎逻辑的)比较方法之一。
长度 已考虑在内,但不是您期望的那样。在字符串比较中,首先比较每个字符串的第一个字符。如果它们相等,则比较第二个字符,依此类推。因此,在您的示例中,要比较的第一个字符是“1”和“8”。 “8”更大。
如果您将“10.72”与“1.87”进行比较,则前几个字符会相等,因此接下来就是将“0”与“.”进行比较。
如果要比较数值,则必须将字符串转换为它们的数字表示形式,否则您将不得不编写自己的比较器将字符串视为数字。我希望能对此有所启发。