我被
strcmp(1,2)
比較兩個字符串,我得到 「-1」 insted的1我的代碼如下PHP STRCMP沒有給予正確的輸出
<?php
echo strcmp(1,2);
?>
輸出:-1
請讓我知道爲什麼我得到-1爲假和如何處理它?
我被
strcmp(1,2)
比較兩個字符串,我得到 「-1」 insted的1我的代碼如下PHP STRCMP沒有給予正確的輸出
<?php
echo strcmp(1,2);
?>
輸出:-1
請讓我知道爲什麼我得到-1爲假和如何處理它?
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);
+1這是有趣的行爲,什麼與-2和-3。令人驚歎的:) –
@傑克我相當肯定它隱含投射到一個字符串。可能發生的一些奇數的情況是數字太大而無法表示,因此無法正確轉換爲數字(int/float)然後轉換爲字符串。編輯:實際上,在仔細觀察清單之後,這些結果是很奇怪的。不知道它是如何實現的。< – Corbin
@Corbin我正在談論這個:'strcmp(NULL,「foo」)=> -3' :)大號數字很容易解釋,因爲它們是'double'首先被轉換爲字符串,失去精度。 –
當你在一個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;
}
}
它確實投射到一個字符串。
是不是'1 <2'? :) –
@傑克亞我知道它的先生,所以我認爲輸出將是假的「1」,但它的-1 –
如果第一個參數小於第二個,它將返回一個負數。 –