我在C ++中比较两个字符串如下:
if(s1 <= s2)
//do stuff
我忘记了字符串比较的复杂性,并在下列情况下很快了解到:
s1 = "10.72";
s2 = "8.87";
该语句将评估为true并执行条件内的任何操作。比较发生在8和1之间。数字的所有ASCII表示从48(0)-57(9)开始递增,并且显然1 <1。 8.
我原以为C ++考虑了字符串长度,但这是不正确的。有人会介意解释为什么从C ++语言设计角度不考虑长度吗?
答案 0 :(得分:3)
实际上,长度是通过字典比较来考虑的,当你在字符串上调用少于<
或更少或等于<=
的运算符时使用。
逐个元素地比较两个范围。
第一个不匹配元素定义哪个范围按字典顺序小于或大于其他。
如果一个范围是另一个的前缀,则较短的范围按字典顺序小于另一个。
如果两个范围具有等效元素且具有相同的长度,则范围在词典上相等。
来自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 :(得分:0)
长度 被考虑在内,但不符合您的预期。在字符串比较中,首先将每个字符串的第一个字符相互比较。如果它们相等,则比较第二个字符,依此类推。因此,在您的示例中,要比较的第一个字符是&#39; 1&#39;和&#39; 8&#39;。 &#39; 8&#39;更大
如果您已经比较了&#34; 10.72&#34;反对&#34; 1.87&#34;,第一个字符是相等的,所以接下来要比较&#34; 0&#34;反对&#34;。&#34;。
如果要比较数值,则必须将字符串转换为数字表示,否则您必须编写自己的比较器,将字符串视为数字。我希望能够对此有所启发。