5

Czy Objective-C ocenia każdą instrukcję na bloku if... else if... lub czy ocenia każdą z nich, a następnie pomija pozostałe oceny, jeśli prawdziwy warunek został znaleziony?Ocena każdej instrukcji warunkowej na bloku if ... else if ...

Jest to bardziej pragmatyczne pytanie związane z wydajnością niż cokolwiek innego.

I tak, wiem, że treść samego bloku if nie jest wykonywana, ale mam na myśli faktyczne wyciągi, które zostaną ocenione.

Przykład

if ([condition A] == test) { 
    // Do something 
} else if ([condition B] == test) { 
    // Do something  
} else if ([condition C] == test) { 
    // Do something  
} else { 
    // Do something because all other tests failed 
}  

Więc ... jeśli warunek A jest prawdziwe, czy warunki B i C ocenia się mimo to?

Jeśli tak, to czy za pomocą instrukcji przełącznika działa się w ten sam sposób, czy też przełącznik sprawdza tylko każdy stan, który do niego przychodzi, a następnie kończy testowanie z powodu przerwy?

Moje zrozumienie polega na tym, że na bloku if... else if... każdy stan jest oceniany, a zatem użycie przełącznika lub zagnieżdżonego (jeśli nie - nie rozkoszuj się tamtą myślą) może być szybszy w przypadku dużych operacji oceny wielu danych (setki tysięcy elementów sprawdzanych pod kątem potencjalnie stu zdań).

Wystarczy ciekawy :-)

+0

Lepsze pytanie brzmi: "Czy w C ...?" ponieważ podstawowa kontrola przepływu jest dziedziczona z C. Cel-C jest nadzbiorem C. –

Odpowiedz

12

Nie, jeśli spełniony jest warunek A, B i C nie są oceniane. Rzeczywiście są częścią klauzul innych, które i tak nie zostaną wykonane.

Just a marginesie: if (condA || condB) lub if (Conda & & condB) ocenia również leniwie, czyli w pierwszym przypadku condB oceniana jest tylko wtedy, gdy Conda jest fałszywe, w drugim przypadku, gdy Conda jest prawdą.

+0

Eiko - notatka mogłaby się przydać i była dla mnie kolejnym naturalnym rozszerzeniem na pytanie ... Świetnie to wiedzieć. Dzięki. – Hooligancat

+0

Termin na naukę komputera to "ocena zwarć". Zobacz http://en.wikipedia.org/wiki/Short_circuit_evaluation – Andrew

+0

@Eiko, twoja uwaga jest dla mnie ważna. Czy masz link do programisty Apple, aby pokazać, skąd bierzesz te informacje od Apple? Mam na myśli długą instrukcję if, a ze względu na szybkość chcę mieć pewność, że sprawdzi tylko sekundę, jeśli pierwsza jest prawdziwa, a tylko trzecia, jeśli pierwsza i druga są prawdziwe, i tak dalej. I chciałbym przeczytać więcej o tym, jak IF jest traktowany w obiektywnym C. Thx – HpTerm

4

Wylicza je tylko tak, jak do nich przychodzi. Blok if ... else if jest równoważny z if.. else {if...}. Zachowuje się tak samo jak zagnieżdżone ifs, jest ładnie sformatowany i pomija niektóre nawiasy klamrowe.

+0

Dzięki Josh. Dobrze wiedzieć, że źle zrobiłem! :-) – Hooligancat

2

Poza celem obiektywu [] zachowuje się dokładnie tak samo jak C.

Dla łańcuchów if() ... else if() ... else ... oznacza to, że każde wyrażenie jest oceniane, dopóki wartość nie zostanie zwrócona do wartości true, a blok zostanie wprowadzony. Zasadniczo

if (a) { 
    ... 
} else if (b) { 
    ... 
} else { 
    ... 
} 

jest interpretowany jako

if (a) { 
    ... 
} else { 
    if (b) { 
     ... 
    } else { 
     ... 
    } 
} 
+0

Olliej - dzięki za informację zwrotną. To dobra wiadomość dla mojego kodu :-) – Hooligancat