Istruzione IF con operatore logico OR

1

Solo una domanda di base sulle istruzioni IF in linguaggi di programmazione, in particolare C ++. Considera il seguente esempio di codice di base:

int i = 2;

if(i == 2 || i == 4) {
    //do something
}

Poiché la prima condizione equivale a true, i cicli della CPU sono sprecati alla seconda condizione? Ci scusiamo per la domanda sulla programmazione 101, vorrei solo sapere.

    
posta Bob 24.06.2016 - 05:16
fonte

2 risposte

3

Possibile ottimizzazione del compilatore a parte, le specifiche del linguaggio C e C ++ affermano esplicitamente che espressione come if(i == 2 || i == 4) verrà valutata da sinistra a destra e la seconda parte dopo || non sarà valutata se la prima parte è vera. Ciò è particolarmente importante quando la parte destra dopo || è un'espressione con effetti collaterali. Ad esempio, se è una chiamata di funzione, quella funzione non verrà chiamata. Questa regola viene spesso sfruttata da alcuni (piuttosto complessi) pezzi di codice C / C ++.

    
risposta data 24.06.2016 - 11:59
fonte
0

Per uno, non è il tipo di "cicli di CPU sprecati" di cui devi preoccuparti. Anche se la seconda condizione è stata verificata, è un ciclo o due. I principianti si preoccupano dei nanosecondi. I programmatori esperti si preoccupano dei microsecondi (ero solito dire che si preoccupano dei millisecondi, ma i tempi stanno cambiando). Si chiama micro-ottimizzazioni ed è il tipo di cosa che produce codice illeggibile senza dare alcun vantaggio di velocità, e in seguito impedisce l'ottimizzazione reale perché il codice è troppo difficile da mantenere.

Dalla definizione del linguaggio, in C, C ++, Objective-C, Java, C # e probabilmente in molti altri linguaggi, è ben definito che una logica o valuta il lato sinistro prima. Se il lato sinistro è diverso da zero, allora il lato destro è non valutato affatto. Se il lato sinistro è zero, solo allora viene toccato il lato destro.

(I compilatori sono liberi di fare ciò che preferiscono purché non cambi il comportamento ufficiale che faranno se è più veloce).

E nel tuo caso particolare, dopo un assegnamento i = 2 il compilatore non produrrà codice per fare alcun confronto, perché conosce già il risultato. i == 2 è vero, quindi i == 4 non è affatto valutato.

    
risposta data 24.06.2016 - 13:06
fonte

Leggi altre domande sui tag