È “corto circuito booleano” dettata dalla norma o semplicemente per lo più utilizzati come l'ottimizzazione? [duplicare]

StackOverflow https://stackoverflow.com/questions/852676

Domanda

Si consideri questo

Class* p = NULL;
if( p != NULL && p->Method() == OK ){

  // stuff
}

In tutti i compilatori con cui ho lavorato, questo è abbastanza sicuro. Cioè la prima parte dell'espressione booleana valuterà a false , e la chiamata al metodo () pertanto non essere tentato dal valutando la seconda parte è ridondante.

E 'questo perché la maggior parte dei compilatori ottimizzano via la valutazione della seconda parte, o è un comportamento dettato dagli standard C / C ++?

È stato utile?

Soluzione

Questo è chiamato booleana corto circuito ed è definito in molte lingue. Qui è un articolo di Wikipedia che descrive quali lingue hanno questa caratteristica.

Ora che si conosce il nome corretto per la funzione, ci sono altro SO articoli su di esso pure.

Altri suggerimenti

taglio corto espressione è garantita dalla norma.

С ++ standard 1998
Sezione 5.14

  

I gruppi operatore && da sinistra a destra.   Gli operandi sono sia implicitamente   convertito nel tipo bool (punto 4). Il   risultato è vero se entrambi gli operandi sono   vero e falso in caso contrario. A differenza di &, &&   garanzie da sinistra a destra di valutazione:   il secondo operando non viene valutato se   il primo operando è falso.

Non ho visto menzionato ancora, così:

corto circuito è garantita da C ++ tranne quando l'operatore && o || invocata è sovraccarico . Ma non farlo, perché è troppo confusa.

Questa è una caratteristica chiamata corto circuito. Questo comportamento è garantito da standard C ++. Io non credo che sia un'ottimizzazione per così dire, ma è molto di più di una semplice caratteristica del linguaggio.

Non è solo l'ottimizzazione, è utile che consente di essere più conciso.

Mentre il vostro esempio mostra, che permette di scrivere un "sicuro" dichiarazione dereferenziazione in una sola riga. In caso contrario, si deve fare qualcosa di simile:

if (p != null) {
    if (p.getValue() == 3) {
        // do stuff
    }
}

Sembra banale, ma cercare di codifica in un linguaggio che non ce l'ha (ad esempio VB6) e si comincia a perdere irritato esso.

E 'nelle norme linguistiche altre risposte citare, ma solo perché qualcosa di simile a questo deve essere chiaramente specificato. Che può eventualmente compilare giù a codice ottimizzato è un effetto collaterale; in questi giorni, un dignitoso C o C ++ sarebbe compilare il bilancio di una riga o due linee equivilently

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top