2012-05-15 30 views
1

我被strcmp(1,2)比较两个字符串,我得到 “-1” insted的1我的代码如下PHP STRCMP没有给予正确的输出

<?php 
    echo strcmp(1,2); 
    ?> 

输出:-1

enter image description here

请让我知道为什么我得到-1为假和如何处理它?

+0

是不是'1 <2'? :) –

+0

@杰克亚我知道它的先生,所以我认为输出将是假的“1”,但它的-1 –

+0

如果第一个参数小于第二个,它将返回一个负数。 –

回答

6

1小于2,的strcmp被定义为返回:

返回< 0如果str1小于STR2;如果str1大于 str2,则为0;如果相等,则为0。

因此,行为是预期的。


注意以下警告:

如果依靠STRCMP安全字符串比较,这两个参数 必须是字符串,其结果是非常否则不可预知的。对于 实例,您可能会得到意外的0,或者返回值为NULL,-2,2, 3和-3。

strcmp的文档页面的评论。


PHP充满了这种意想不到的行为。在你的情况,我会确保这两个参数分别投为字符串,以避免任何混淆:

$first = 1; 
$second = 2; 
echo strcmp((string)$first, (string)$second); 
+0

+1这是有趣的行为,什么与-2和-3。令人惊叹的:) –

+0

@杰克我相当肯定它隐含投射到一个字符串。可能发生的一些奇数的情况是数字太大而无法表示,因此无法正确转换为数字(int/float)然后转换为字符串。编辑:实际上,在仔细观察清单之后,这些结果是很奇怪的。不知道它是如何实现的。< – Corbin

+0

@Corbin我正在谈论这个:'strcmp(NULL,“foo”)=> -3' :)大号数字很容易解释,因为它们是'double'首先被转换为字符串,失去精度。 –

1

你不会得到false

来自manual

返回值

返回< 0如果str1小于STR2;如果str1大于 str2,则为0;如果相等,则为0。

2

当你在一个int传递,它浇铸为字符串就是明证:

var_dump(strcmp('1', 2)); //-1 

它的原因-1,是因为使用最广泛的实现的strcmp的找到的第一个非平等字符并返回差异。换句话说,它基本上是'1' - '2',它是49 - 50(ASCII代码为'1'和'2')。

49-50是-1。

编辑:不严格相关,但出于好奇,做了一些挖掘。这并不是保证在将来的行为,但从PHP 5.4:

ZEND_FUNCTION(strcmp) 
{ 
    char *s1, *s2; 
    int s1_len, s2_len; 

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &s1, &s1_len, &s2, &s2_len) == FAILURE) { 
     return; 
    } 

    RETURN_LONG(zend_binary_strcmp(s1, s1_len, s2, s2_len)); 
} 


ZEND_API int zend_binary_strcmp(const char *s1, uint len1, const char *s2, uint len2) /* {{{ */ 
{ 
    int retval; 

    if (s1 == s2) { 
     return 0; 
    } 
    retval = memcmp(s1, s2, MIN(len1, len2)); 
    if (!retval) { 
     return (len1 - len2); 
    } else { 
     return retval; 
    } 
} 

它确实投射到一个字符串。

相关问题