PHP:比较 NULL 和 FALSE - 转换为 ~Negative Infinity

标签 php c comparison programming-pearls

我最近偶然发现了一种情况,充其量只是一个错误。在比较中使用时,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 Versions 上运行的在我有权访问的一些 Windows 机器上。所有人都得到了惊人的相同结果。


忽略前两个调试转储,如果您是经验丰富的 PHP 开发人员,接下来的 6 个结果就是您所期望的结果。前两个是由于 type juggling最后 4 个是由于 PHPmath .


现在让我烦恼的是最后四个。

我不确定在数学中是否有效小于负无穷大。

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

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

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


附言I have tried搜索 SO againagainagain , PHP Manual甚至 PHP bug tracker ,都无济于事。我尝试查看 C 源代码以确定使该代码按其方式工作的点点滴滴。仍然没有骰子。

最佳答案

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

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

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

bool or null    anything    Convert to bool, FALSE < TRUE

因此,null 被转换为 false,任何非零数字都被转换为 true。 Source而且,如您所见,FALSE < TRUE。这就是为什么你会得到所谓的疯狂行为——至于为什么会这样,可能是因为 C 的类似行为。 (但是 C 永远不会让你在打字系统上玩得这么快!)

关于PHP:比较 NULL 和 FALSE - 转换为 ~Negative Infinity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14358904/

相关文章:

c# - CodePlex 和 CodeProject 的 QuickGraph 之间的区别

php - 使用冗余数据解析来自 Web 服务的信息

c - 字符串终止还是悬空指针?

javascript - 如何将具有旧日期的对象保留在我的数组之外

c - 字符串比 C 语言中预期的要长

c - 多个比较运算符?

php - 我想使用 HpCloud for iphone sdk 的人脸检测 API

php - Osticket:如何使用 "OR"约束过滤票证

c - 如果仅对一个结构进行更改,则反射(reflect)对两个结构的更改