与关系运算符的字符串比较(不同长度)

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”与“.”进行比较。

如果要比较数值,则必须将字符串转换为它们的数字表示形式,否则您将不得不编写自己的比较器将字符串视为数字。我希望能对此有所启发。