为什么在php中运行"echo strcmp('60', '100');"会输出5?

12

PHP的这个函数的文档有点简洁,我已经读到这个函数比较ASCII值所以...

echo strcmp('hello', 'hello');
//outputs 0 as expected - strings are equal.
echo '<hr />';

echo strcmp('Hello', 'hello');
//outputs -32, a negative number is expected as 
//uppercase H has a lower ASCII value than lowercase h.
echo '<hr />';

echo strcmp('60', '100');
//outputs 5.

最后一个示例让我感到困惑。我不明白为什么它会输出一个正数。

  • 0的ASCII值= 48
  • 1的ASCII值= 49
  • 6的ASCII值= 54

  • '60'的总ASCII值=(54 + 48)= 102

  • '100'的总ASCII值=(49 + 48 + 48)= 145

尽管'100'的ASCII值和字符串长度均大于'60',但strcmp()函数却表明'60'比'100'“更大”。

有人能解释一下为什么吗?

谢谢

3个回答

13

strcmp() 函数返回两个字符串第一个不匹配字符的差值。

6 减去 1 等于 5。

当你看到它时,可能并没有看到单个字符或数字,只是数字。


6
请注意,这不是保证的行为 -- 唯一保证的是对于这些输入参数,该值将大于零。 - Simon Richter
2
@SimonRichter:同意这并不是保证的。但这是传统的方法。我在1978年编写的一些代码仍然依赖于这种计算返回值的方法,而且仍然可以工作! - wallyk
@wallyk,当文档没有说明它返回第一个字符的差异时,您如何知道这个答案是正确的? - Pacerier
1
@Pacerier:我有很多不同运行时库的经验,从运行Unix v6(最初的C)的PDP-11到VAX/VMS、MSDOS、Windows、GCOS、Sequent、IBM和微控制器。它们都实现了差异,正如一些CRTL源代码所示,为了传统和与原始版本的完全兼容性。 - wallyk

8

strcmp()函数会在找到第一个不同之处时停止。因此,'1'的ASCII值与'6'的ASCII值之间存在差异。


@wallyk,当文档没有说明它返回第一个字符的差异时,您如何知道这种行为是有保证的? - Pacerier

5

6比1“大”5。这是词法比较。第一个字符不同,比较就停止了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接