与关系运算符的字符串比较(长度不同)
String comparisons with relational operators (differing lengths)
我在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"与"."进行比较。
如果你想比较数值,你必须将字符串转换为它们的数字表示,否则你必须编写自己的比较器,将字符串视为数字。我希望这能给它带来一些启示。
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么比较运算符如此快速
- 我可以使用 g++ 进行三种比较 (<=>) 吗?
- 比较字符数组
- 将模板化的类型与C++中的某些类/类型进行比较
- C++自定义比较函数
- 如何比较自定义类的std::变体
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- std::设置自定义比较器
- 布尔比较运算符是如何在C++中工作的
- C++使用关系运算符比较字符串
- 比较两个文件夹的关系
- 使用关系运算符比较指针意味着什么
- 如果我在与字符进行比较之前没有明确将 int 转换为字符,这有关系吗?
- C++ STL 关系运算符如何比较堆栈
- 与关系运算符的字符串比较(长度不同)
- 比较两个向量<bool>与SSE的关系
- 对于C++字符串最好使用比较方法或关系运算符
- 一种涉及比较函子的循环依赖关系
- 类模板C++友元比较和关系运算符