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

时间:2015-12-31 03:59:40

标签: c++ string comparison operator-keyword relational

我在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 ++语言设计角度不考虑长度吗?

2 个答案:

答案 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;。

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