3

我最近偶然发现了一个充其量似乎是一个错误的情况。在比较中使用时,两者nullfalse似乎都被评估为较低但不等于负无穷大。

我目前的测试用例:

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 机器上运行的。所有人都有惊人的相同结果。


忽略前两个调试转储,如果您是一位经验丰富的 PHP 开发人员,接下来的 6 个结果是您所期望的。前两个是由于类型杂耍,后四个是由于PHPmath


现在最后四个是困扰我的地方。

我不确定低于负无穷大的东西在数学中是否有效。

更奇怪的是前两个和后两个比较的组合。不知何故,相同类型的杂耍算法使其有效:

var_dump(
    'Insane In The Membrane (Redux)',
    (null  == 0) && (null  < (-1*INF)),     # true
    (false == 0) && (false < (-1*INF))      # true
);

如果有人可以就这些类型转换如何以如此不同的方式进行评估以及为什么将不胜感激提供任何见解。


PS一次又一次尝试搜索SO ,PHP手册甚至PHP错误跟踪器,都无济于事。我尝试查看 C 源代码以确定使该代码以它的方式工作的点点滴滴。还是没有骰子。

4

2 回答 2

2

我昨天刚在看这个。我们将冒险查看 PHP 手册并查看比较运算符页面:

http://php.net/manual/en/language.operators.comparison.php

那里有一个很棒的图表,它解释了比较不同类型的对象时会发生什么,这是它的列之一:

bool or null    anything    Convert to bool, FALSE < TRUE

因此,null 被强制转换为 false,任何非零数都被强制转换为 true。来源 而且,如您所见,FALSE < TRUE。这就是为什么你会出现所谓的疯狂行为 - 至于为什么会出现这种情况,可能是因为 C 的类似行为。(但是 C 永远不会让你在打字系统上玩得这么快又松!)

于 2013-01-16T16:27:08.270 回答
1

也许这会有所帮助:

http://gynvael.coldwind.pl/?id=492

它主要涵盖 == 运算符,但也有一些关于一般比较如何工作的信息和指针。

于 2013-01-16T13:33:04.780 回答