我正在比较两个字符串,
strcmp(1,2)
我得到“-1” 1 我的代码在下面
<?php
echo strcmp(1,2);
?>
输出:-1
请让我知道为什么我会因为错误而得到 -1 以及如何处理它?
1小于2,strcmp定义为返回:
如果 str1 小于 str2,则返回 < 0;> 0 如果 str1 大于 str2,如果它们相等则为 0。
因此,该行为是预期的。
请注意以下警告:
如果您依赖 strcmp 进行安全的字符串比较,则两个参数都必须是字符串,否则结果非常不可预测。例如,您可能会得到一个意外的 0,或者返回值为 NULL、-2、2、3 和 -3。
来自文档页面上的评论strcmp
。
PHP 充满了这种意想不到的行为。在您的情况下,我会确保将两个参数都转换为字符串以避免任何混淆:
$first = 1;
$second = 2;
echo strcmp((string)$first, (string)$second);
当你传入一个 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;
}
}
它确实转换为字符串。