Post
#1
|
|
|
Newsman Grupa: Moderatorzy Postów: 2 033 Pomógł: 290 Dołączył: 21.12.2007 Skąd: Łódź |
Witam,
Naprawdę zgłupiałem. Albo o czymś nie wiem. Mam w programie taki test, gdzie zmienna może przyjąć trzy wartości: mniejszą od zera, większą od zera bądź zero. Żeby nie jechać trzy razy if / else if / else if napisałem swich(), który w zależności od wartości zmiennej podejmuje odpowiednie działania. W case() sprawdzam po kolei wystąpienie wszystkich warunków: case ($a < 0) ... bla bla rób to; break; case ($a > 0) ... bla bla rób tamto; break; case ($a == 0) ... bla bla siamto; break; Moja radośc trwała do momentu, gdy zmienna $a przyjęła wartość 0, a wkonał się kod zawarty w teście case($a < 0). Myślę sobie, qrde, co jest, od kiedy 0 jest mniejsze od 0 ? No i zaczęła się walka. Ustawiałem warunki w różnej kolejności, eliminowałem warunek case ($a == 0), wtedy i tak wykonywał się kod zawarty w case ($a < 0), rzutowałem $a na wszelkie możliwe intval-e , integery itp. , porównywałem ją w taki sposób: case ($a === 0). Nic. Uprzedzając wszelkie pytania: nie ma błędów w składni, wszędzie są brejki itd. Z problemem zetknąłem się w większej aplikacji, ale dla porównania napisałem sobie ten test:
Teraz, gdy uruchamiam go sobie po kolei dla każdej wartości $a, mam następujące wyniki: Kod $a = -1 w switch(): a < 0 w if() / else if() / else if() : a < 0 Kod $a = 1 w switch(): a > 0 w if() / else if() / else if() : a > 0 A teraz uwaga: dla $a = 0: Kod $a = 0 w switch(): a < 0 w if() / else if() / else if() : a = 0 WTF ? |
|
|
|
![]() |
Post
#2
|
|
|
Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk |
Kod switch ($a) {
case 0: echo ' = 0'; break; case ($a < 0): echo ' < 0'; break; case ($a > 0): echo ' > 0'; break; } |
|
|
|
Post
#3
|
|
|
Newsman Grupa: Moderatorzy Postów: 2 033 Pomógł: 290 Dołączył: 21.12.2007 Skąd: Łódź |
Tak, tak jest ok.
Ale wytłumacz mi proszę, czemu w case( $a == 0) dla $a = 0 NIE JEST prawdziwy ? To mnie intryguje. |
|
|
|
Post
#4
|
|
|
Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk |
Switch sprawdza to co podales mu w argumencie
Wiec rozpatrzmy twoje przypadki Kod $a=-1; //po konwersji true
//wiec true==($a==0) // false true==($a<0) // true true==($a>0) // false $a=1; //po konwersji true //wiec true==($a==0) // false true==($a<0) // false true==($a>0) // true $a=0; //po konwersji false //wiec false==($a==0) // false poniewaz ($a==0) daje true false==($a<0) // true i tutaj jest zatrzymywane sprawdzanie bo warunek prawdziwy i reszta jest pomijana false==($a>0) // ... Ten post edytował wookieb 3.02.2009, 13:08:22 |
|
|
|
Post
#5
|
|
|
Newsman Grupa: Moderatorzy Postów: 2 033 Pomógł: 290 Dołączył: 21.12.2007 Skąd: Łódź |
No teraz wszystko jasne.
Dzięki. |
|
|
|
Post
#6
|
|
|
Grupa: Zarejestrowani Postów: 300 Pomógł: 32 Dołączył: 31.07.2006 Ostrzeżenie: (0%)
|
Albo jedno, albo drugie, mieszanie jak widać nie jest zalecane (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Swoją drogą cytat z http://bugs.php.net/bug.php?id=35025&edit=1: Cytat No need for yet another one rarely used core function. To brzmi jak przeciwieństwo zasad którymi kierowali się twórcy PHP (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) |
|
|
|
![]() ![]() |
|
Aktualny czas: 21.12.2025 - 19:04 |