最近我遇到了一个看起来像是bug的情况。当使用比较运算符时,null
和 false
似乎被计算为低于负无穷大但不相等。
我的当前测试用例:
var_dump(
PHP_OS,
PHP_VERSION,
null == 0, # true
false == 0, # true
INF==INF, # true
(-1*INF) == (-1*INF), # true
(-1*INF) < (-1*INF), # false!
(-1*INF) > (-1*INF), # false!
'Insane In The Membrane',
null == (-1*INF), # false!?
false == (-1*INF), # false!?
null < (-1*INF), # true!
false < (-1*INF) # true!
);
这是在各种PHP版本和我能够访问的一些Windows机器上运行的。所有结果都是惊人地相同。
忽略前两个调试转储,接下来的6个结果是有经验的PHP开发人员所期望的。前两个是由于类型转换,而最后4个则是由于PHP和数学所致。
现在最后四个是困扰我的问题。
我不确定在数学上是否存在低于负无穷大的东西。
更奇怪的是前两个和后两个比较的组合。以某种方式,相同的类型转换算法使这个有效:
var_dump(
'Insane In The Membrane (Redux)',
(null == 0) && (null < (-1*INF)), # true
(false == 0) && (false < (-1*INF)) # true
);
如果有人能够解释这些类型转换如何被评估得如此不同,以及为什么会这样,那将非常感激。
附言:我已经尝试过再次在SO中搜索null比较,false比较和infinity,还查看了PHP手册甚至PHP bug跟踪器,但都没有结果。我试图查看C源代码以确定构成这段代码工作方式的各个部分,但仍然没有找到答案。
null
肯定不比负无穷大,也不等于负无穷大。因此通过排除... - Oliver Charlesworth-inf
更大。我对传递给cmp
汇编指令的内容感到困惑。我不知道无限大如何处理,现在我也不知道如何处理null
和false
。 - Khez