代码之家  ›  专栏  ›  技术社区  ›  ISW

字符串比较“逻辑”

  •  6
  • ISW  · 技术社区  · 15 年前

    有人能告诉我吗 为什么 下面的字符串比较提供了这些结果?

    >>"1040"<="12000"  
    True  
    >> "1040"<="10000"  
    False
    

    我在C和python中都尝试过字符串比较,结果显然是正确的,我只是不知道如何计算结果…

    P.S.:我知道比较不同长度的字符串是不应该做的,但我仍然想知道上面这些行背后的逻辑;-)

    11 回复  |  直到 14 年前
        1
  •  23
  •   Anon.    15 年前

    “1”等于“1”。

    “0”在“2”之前(所以“1040”<“12000”)。

    “4”在“0”之后(所以“1040”>“10000”)。

        2
  •  6
  •   john personna    15 年前

    按字母顺序思考。

        3
  •  6
  •   jason    15 年前

    这里描述这种排序的花哨词是” lexicographical order (有时是“字典顺序”)。在日常语言中,我们只是把它称为“字母顺序”。这意味着我们首先在字母表上排序( A , B ,… Z 等等),然后在这个字母表上比较两个单词,我们一次比较一个字符,直到在同一位置找到两个不相等的字符,并返回这两个字符之间的比较结果。

    示例:字母表上的“自然”顺序 { A, B, C, ..., Z } 是吗? A < B < C < ... < Z . 给出两个词 s = s_1s_2...s_m t = t_1t_2...t_n 我们比较 s_1 t_1 . 如果 s_1 < t_1 我们说 s < t . 如果 s_1 > t_1 我们说 s > t . 如果 s_1 = t_1 我们重复这些话 s_2...s_m t_2...t_n . 为了实现这一点,我们说空字符串小于所有非空字符串。

    在以前,在Unicode之类的东西出现之前,我们符号上的排序只是对ASCII字符代码的排序。那么我们有了 0 < 1 < 2 < ... < 9 < ... < A < B < C < ... Z < ... < a < b < c < ... < z . 在使用Unicode的日子里,它更复杂,但同样的原理也适用。

    现在,这意味着如果我们想比较 1040 12000 我们将使用以下内容:

    1040个 比较 一万二千 等于 040 比较 2000 给出 040 < 2000 因为 0 < 2 最后, 1040 < 12000 .

    一千零四十 比较 10000 等于 040 比较 0000 等于 40 比较 000 给出 40 > 000 因为 4 > 0 最后, 1040 > 10000 .

    这里的关键是这些是字符串,没有数字意义;它们只是符号,我们对符号有一定的排序。也就是说,如果我们替换了 0 通过 ,请 1 通过 …… 9 通过 J 并说 A < B < C < ... < J .(在这种情况下,我们将比较 BAEA BAAAA 拜亚 BCAAA )

        4
  •  4
  •   dmazzoni    15 年前

    从左到右比较字符串,一次一个字符:

    10000
    1040
    12000
    

    比较不同长度的字符串没有什么错。

        5
  •  4
  •   seh Alexei    15 年前

    你正在经历 lexicographical ordering .

    some generalized algorithms 为了这本书的订购 Elements of Programming . 搜索单词 lexicographical .

        6
  •  2
  •   mpen    15 年前

    它按字符对“数字”进行比较。在第一种情况下,“1”==“1”,然后是“0”<“2”,以ASCII(和整数)表示,因此它返回true。

    在第二种情况下,1==1,0==0,但4>0,因此返回false。

    比较不同长度的弦没什么错…但您应该使用适当的字符串比较方法。

        7
  •  1
  •   Jerry Coffin    15 年前

    在C语言中,字符串比较是逐字符进行的。在第一种情况下,尖刺的第一个字符是相等的,因此它归结为第二个字符:“0”是<'2',所以“1040”<“12000”。在第二种情况下,字符串的前两个字符相等,因此第三个字符是基础--“4”>“0”,所以“1040”>“10000”。

    如果要将它们作为数字进行比较,则需要先将它们转换为数字,然后再进行比较。

        8
  •  1
  •   JohnK813    15 年前

    要扩展约翰·P的答案,请将字符串视为单词,然后从左到右阅读它们。

    换个角度来看,

    Baea会在BCAAA之前,但在Baaa之后

        9
  •  0
  •   monksy    15 年前

    它比较每个字符,因为您正在比较字符串。如果要比较这些数字,请将它们设为数字类型。

        10
  •  0
  •   Pascal Cuoq    15 年前

    “10000”<=“1040”<=“12000”与“捏造”<=“事实”<=“愚蠢”的方式相同。

        11
  •  0
  •   Robert Martens    14 年前

    把它们做成同样的长度怎么样?

    这将统一数字和阿尔法

    1040变为01040

    01040<12000现在有意义了

    也许这就是为什么他觉得比较不同长度的弦是错误的。 当字符串是数字时,它们的长度应该相同