5

Does Objective-C valuta ogni istruzione su un blocco if... else if... o valuta ciascuno come viene loro e quindi salta le valutazioni rimanenti se una condizione vera è stato trovato?Valutazione di ogni istruzione condizionale su un blocco if ... else if ...

Questa è più una questione pragmatica relativa alle prestazioni di qualsiasi altra cosa.

E sì, so che il contenuto del blocco if non viene eseguito, ma mi riferisco alle dichiarazioni effettive che vengono valutate.

Esempio

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 
}  

Quindi ... se la condizione A è vero, fanno condizioni B e C ottenere valutati in ogni caso?

In tal caso, l'utilizzo di un'istruzione di commutazione si comporta allo stesso modo oppure un interruttore verifica solo ciascuna condizione così come viene e quindi esce dalla valutazione a causa dell'interruzione?

La mia comprensione è che su un blocco if... else if..., ogni condizione viene valutata e quindi l'utilizzo di un commutatore o di un nidificato if (ugh - non assaporare il pensiero in quel punto) potrebbe essere più veloce su grandi operazioni di valutazione su molti dati (centinaia di migliaia di articoli controllati contro potenzialmente un centinaio di dichiarazioni).

Solo curioso :-)

+0

La domanda migliore è, "non C ...?" dato che il controllo di base del flusso è ereditato da C. Objective-C è un superset di C. –

risposta

12

No, se la condizione è soddisfatta A, B e C non sono valutati. In effetti, fanno parte delle clausole else che comunque non verranno eseguite.

Solo un lato nota: if (condA || condB) o se (conda & & condB) valutano pigramente, cioè nel primo caso condB viene valutato solo se CONDA è falso, nel secondo caso, quando conda è vero.

+0

Eiko - la nota a margine potrebbe effettivamente tornare utile ed è stata per me la prossima estensione naturale alla domanda ... Fantastico sapere. Grazie. – Hooligancat

+0

Il termine di scienze informatiche è "valutazione di cortocircuito". Vedi http://en.wikipedia.org/wiki/Short_circuit_evaluation – Andrew

+0

@Eiko, la tua nota a margine è importante per me. Hai un link per sviluppatori Apple per mostrarmi dove hai ottenuto queste informazioni da Apple? Voglio dire, ho una dichiarazione lunga e se per ragioni di velocità voglio essere sicuro che controllerà solo se prima è vera e solo terza se prima e seconda sono vere, e così via. E mi piacerebbe leggere di più su come IF viene trattato nell'obiettivo-C. Thx – HpTerm

4

Si valuta solo come viene loro. Un blocco if ... else if equivale a if.. else {if...}. Si comporta allo stesso modo dei if annidati, è formattato bene e omette alcune parentesi graffe.

+0

Grazie Josh. Buono a sapersi, ho sbagliato :-) – Hooligancat

2

All'esterno dell'obiettivo-c di [] si comporta esattamente come fa C.

Per le catene if() ... else if() ... else ... significa che ogni espressione viene valutata finché non viene valutata true e il blocco viene immesso. Fondamentalmente

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

viene interpretato come

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

Olliej - grazie per il feedback. Questa è una buona notizia per il mio codice :-) – Hooligancat