2013-01-15 8 views
6

Czy if-statement z numerem && operator sprawdza drugi parametr, jeśli pierwszy to false/NO?If-statement z operatorem && sprawdza drugą wartość?

Czy następujące elementy mogą ulec awarii?

NSDictionary *someRemoteData = [rawJson valueForKey:@"data"]; 
if([someRemoteData isKindOfClass:[NSDictionary class]] && someRemoteData.count > 0){ 
    //..do something 
} 

Proszę nie odpowiedzieć tak lub nie, ale wyjaśnij dlaczego.

+0

Jeśli Objective-C jest prawie jak wszystkie inne języki w tym zakresie, odpowiedź brzmi: nie, ponieważ '&&' skróty. Podobnie, '||' przestanie oceniać, kiedy znajdzie warunek, który jest prawdziwy. – fge

Odpowiedz

18

Nie, nie ocenia wyrażenia po uczeniu się, że odpowiedź będzie NO. Nazywa się to zwierając i jest istotną częścią oceny wyrażeń binarnych w C, C++, Objective C i innych językach o podobnej składni. Warunki są oceniane od lewej do prawej, dzięki czemu schemat oceny jest przewidywalny.

Ta sama zasada dotyczy operatora ||: gdy tylko kod wie, że wartość jest YES, ocena zostaje zatrzymana.

Zwarcie umożliwia ochronę przed nieprawidłową oceną w pojedynczym złożonym wyrażeniu, zamiast wybierania instrukcji if. Na przykład:

if (index >= 0 && index < Length && array[index] == 42) 

spowodowałoby niezdefiniowane zachowanie, gdyby nie występowało zwarcie. Ale ponieważ ocena pomija ocenę array[index], gdy index jest nieważna, powyższe wyrażenie jest poprawne.

+0

Nie wspominając o tym, że warunki są oceniane w kolejności występowania;) Java ma dziwacznie zachowujący się skrót "&", który też nie jest skrótem. – fge

+0

@fge Dzięki za uwagę na temat kolejności oceny, jest to bardzo ważne w kontekście tej dyskusji. – dasblinkenlight

+0

Dzięki za wyjaśnienie. Już to założyłem, chciałem tylko wiedzieć, dlaczego. –

0

NIE, nie. Jeśli pierwsza instrukcja nie powiedzie się, druga nie jest nigdy sprawdzana, więc na przykład możesz to zrobić (ArrayList != null && ArrayList.size() > 0) i nigdy nie otrzymasz błędu, jeśli zmienna nie została zainicjalizowana.

3

Obiekt C używa lazy evaluation, co oznacza, że ​​tylko lewy operand jest oceniany w twoim przypadku.

Powiązane problemy