2015-03-20 8 views
9

W PHP, dlaczego pierwsze dwa z poniższych stwierdzeń są prawdziwe?Dlaczego ("00e0" == "00e1") jest prawdą?

<?php 
    if("00e0" == "00e1") { 
     echo 'matches (a)'; 
    } else { 
     echo 'failed (a)'; 
    } 

    if("00e1" == "00e9") { 
     echo 'matches (b)'; 
    } else { 
     echo 'failed (b)'; 
    } 

    if("00e2" == "00ea") { 
     echo 'matches (c)'; 
    } else { 
     echo 'failed (c)'; 
    } 
?> 

Jeśli prowadzony będzie to powrót następuje:

matches (a) 
matches (b) 
failed (c) 

Dowolny ciąg pomiędzy "00e0", "00e1", "00e2" .. "00e9" dadzą prawda w porównaniu z innym „00E (0-9) "ciąg.

+1

Twoja terminologia jest wyłączona. Tu nie ma "zwrotów". Mówisz o _evaluation_. –

Odpowiedz

6

Jest tak dlatego, że łańcuchy, które są poprawnymi wartościami zmiennoprzecinkowymi, są interpretowane jako takie.

Przykładowo 00e0 odpowiada 0 x 100 i 00e9 odpowiada 0 x 109, z których oba są równe zero, a więc równej siebie.

Jednak od 00ea jest nie prawidłowy numer zmiennoprzecinkowy, jest traktowany inaczej.

Można zobaczyć podobny efekt:

echo "01e2" - "01e1"; 

który wyprowadza 90 bo jest taka sama jak 1 x 102 - 1 x 101 lub 100 - 10.

ta jest obsługiwana przez PHP doco (podkreślenie moje):

Jeśli porównać liczbę sznurkiem lub porównanie dotyczy ciągów liczbowych, następnie każdy łańcuch jest konwertowana na liczbę i porównanie przeprowadzone liczebnie.

że linki ustępie do another page który wyjaśnia zasady tył konwersji, powinno się zdarzyć:

Jeśli łańcuch nie zawiera żadnych znaków, «e» lub «E» „” a wartość liczbowa pasuje do limitów typu całkowitego (jak zdefiniowano w PHP_INT_MAX), łańcuch zostanie oceniony jako liczba całkowita. We wszystkich innych przypadkach zostanie on oceniony jako float.

Jeśli chcesz unikać Takie zachowanie nie jest uwaga w tym pierwszym linku, który stanowi, należy użyć === zamiast:

konwersji typu nie odbędzie się, gdy porównanie jest = == lub! ==, ponieważ wiąże się to z porównaniem typu i wartości.

+3

Jeszcze jeden powód, dla którego PHP jest okropne. Dwa oczywiście różne ciągi są równe. –

+1

@Lego, nie jestem fanem PHP, ale język _has_ sposób na uniknięcie tego, jak na moją aktualizację, coś, co miłośnicy PHP bez wątpienia wiedzą. Więc nie jest to całkiem inna koncepcja niż niepoprawne 'if (str ==" inny ciąg ")' w C, który często używasz początkujących. – paxdiablo

+0

@LegoStormtroopr Jeśli chcesz porównać ciągi są równe, oczywiście używasz === nie ==. –

Powiązane problemy