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

String comparisons with relational operators (differing lengths)

本文关键字:比较 关系 运算符 字符串      更新时间:2023-10-16

我在C++中比较了两个字符串,如下所示:

if(s1 <= s2)
  //do stuff

我已经忘记了字符串比较的复杂性,并很快了解到在以下情况下:

s1 = "10.72";
s2 = "8.87";

该语句的求值结果将为true,并执行条件中的任何操作。比较发生在8和1之间。数字的所有ASCII表示都是从48(0)到57(9)的递增顺序,并且显然1<8.

我原以为C++考虑了字符串长度,但这是不正确的。有人能解释一下为什么没有从C++语言设计的角度考虑长度吗?

事实上,通过在字符串上调用小于<或小于或等于<=运算符时使用的字典比较,可以隐式地考虑长度。

  • 两个范围逐元素进行比较。

  • 第一个不匹配元素定义哪个范围在字典上小于或大于另一个

  • 如果一个范围是另一个范围的前缀,则较短的范围在字典上小于另一个

  • 如果两个范围具有相等的元素,并且具有相同的长度,则这些范围在字典上是相等的。

发件人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"answers"8"8’较大。

如果你将"10.72"与"1.87"进行比较,第一个字符将相等,所以接下来的事情将是将"0"与"."进行比较。

如果你想比较数值,你必须将字符串转换为它们的数字表示,否则你必须编写自己的比较器,将字符串视为数字。我希望这能给它带来一些启示。