2012-05-15 66 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; 
    } 
} 

它確實投射到一個字符串。

相關問題