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マシンで実行されました。すべてが驚くべき同じ結果をもたらしました。


最初の2つのデバッグダンプを無視すると、次の6つの結果は、経験豊富なPHP開発者であれば期待できるものです。最初の2つは型ジャグリングによるもので、最後の4つはPHP数学によるものです。


さて、最後の4つは私を悩ませているものです。

負の無限大よりも低いものを持つことが数学でさえ有効であるかどうかはわかりません。

さらに奇妙なのは、最初の2つと最後の2つの比較の組み合わせです。どういうわけか、同じタイプのジャグリングアルゴリズムがこれを有効にします。

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

さまざまなタイプのオブジェクトを比較したときに何が起こるかを説明するすばらしいチャートがあります。これはその列の1つです。

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 に答える