我正在用
strcmp(1,2)
比较两个字符串,我得到的是“-1”,我的代码位于下面
<?php
echo strcmp(1,2);
?>
输出:-1
请让我知道为什么我因为假而得到-1以及如何处理它?</ p>
答案 0 :(得分:6)
1小于2,strcmp定义为返回:
返回&lt;如果str1小于str2,则为0; &GT;如果str1大于,则为0 str2,如果它们相等则为0。
因此行为是预期的。
请注意以下警告:
如果依靠strcmp进行安全字符串比较,两个参数都是如此 必须是字符串,结果是非常不可预测的。对于 实例你可能得到一个意外的0,或返回NULL,-2,2的值, 3和-3。
来自strcmp
的文档页面上的评论。
PHP充满了这种意外行为。在你的情况下,我会确保两个参数都被转换为字符串以避免混淆:
$first = 1;
$second = 2;
echo strcmp((string)$first, (string)$second);
答案 1 :(得分:2)
传入int时,会将其转换为字符串,如下所示:
var_dump(strcmp('1', 2)); //-1
它是-1的原因是因为最广泛使用的strcmp实现找到第一个不相等的字符并返回差异。
换句话说,它基本上是'1' - '2',它是49 - 50('1'和'2'的ASCII代码)。
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;
}
}
它确实会转换为字符串。
答案 2 :(得分:1)