我最近偶然發現了一個似乎是最好的錯誤的情況。當用於比較時,null
和false
似乎被評估爲降低但不等於負無窮大。PHP:比較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 Versions和一些Windows機器,我不得不進入運行。所有人都有驚人的相同結果。
忽略前兩個調試場,接下來的6分的結果是,如果你是一位經驗豐富的PHP開發者你所期望。前兩個是由於type juggling和最後4個,歸因於PHP和math。
現在最後四個是什麼在擾亂我。
我不確定它是否有效有效在數學上有一些低於負無窮大。
什麼是陌生人仍然是前兩個和最後兩個比較的組合。不知怎的,同一類型的雜耍算法做出此有效:
var_dump(
'Insane In The Membrane (Redux)',
(null == 0) && (null < (-1*INF)), # true
(false == 0) && (false < (-1*INF)) # true
);
如果任何人都可以提供任何洞察力,對這些類型轉換是如何被評價,從而不同,爲什麼將不勝感激。
P.S. I have tried搜索SO again和again和again,PHP Manual甚至PHP bug tracker,都無濟於事。我嘗試通過C源代碼來確定使代碼按其工作方式工作的位數。仍然沒有骰子。
誰會想到; PHP的拜占庭式類型轉換規則仍然導致莫名其妙的行爲;) –
我想一種解釋是'null'肯定不比* -inf大*,並且*不等於-inf。所以通過消除... –
@OliCharlesworth嘿,我同意它不是_equal_,但爲什麼它不是_greater_?它應該被評估爲0(因爲它在我的問題的第二個場景中)並且**比**大於-inf。我對傳遞給'cmp'彙編指令的內容感到困惑。我不知道如何處理無窮大,現在我不知道「null」和「false」是如何處理的。 – Khez