我被
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 –
如果第一个参数小于第二个,它将返回一个负数。 –