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 ? -------------------- Life's simple... You make choices and don't look back...
|
|
|
|
![]() |
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. -------------------- Life's simple... You make choices and don't look back...
|
|
|
|
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. -------------------- Life's simple... You make choices and don't look back...
|
|
|
|
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 Cytat No need for yet another one rarely used core function. To brzmi jak przeciwieństwo zasad którymi kierowali się twórcy PHP |
|
|
|
![]() ![]() |
|
Aktualny czas: 20.08.2025 - 01:38 |