2013-03-21 13 views
5

Questo è un problema molto banale: Esistono quattro funzioni booleane: a(), b(), c() e d(). Voglio continuare a chiamarli in ordine fino a quando il primo restituisce true. invece di fare la tradizionaleSostituzione di if concatenati con operazioni in cortocircuito

if(!a()) { 
    if(!b()) { 
     if(!c()) { 
      d(); 
     } 
    } 
} 

o

if(!a() && !b() && !c()) d(); 

ho pensato di scrivere l'espressione come una valutazione in corto circuito.

(a() || b() || c() || d()); 

Ma non ho mai visto questo test eseguito in questo modo in un codice C/C++. C'è qualche problema con questo approccio che mi manca?

Grazie.

+0

Sono in grado di vedere * cinque * funzioni booleane. –

+3

@chris il o non cambia il significato: d() viene eseguito solo se tutte le altre funzioni sono false. – Loghorn

+3

Vorrei consigliarlo contro una prospettiva di manutenzione. Potrebbe non essere immediatamente ovvio alle persone che cosa fa il codice quando vedono la versione cortocircuitata (se è una preoccupazione per te). Il fatto che dovessi chiedere del comportamento di SO dovrebbe essere un suggerimento su cosa accadrà quando altre persone leggeranno il tuo codice. – Michael

risposta

3

Il codice che hai scritto è valido. d() verrà valutato solo se altre funzioni booleane restituiscono false.

Tuttavia, la valutazione in cortocircuito è meno leggibile e soggetta a errori dal punto di vista della manutenzione, poiché un lettore potrebbe non capirlo in modo banale.

+0

perché è soggetto a errori? – user666412

+3

Hai sbagliato. 'd()' viene valutato se NO OTHER restituisce true. Quale immagino rende il vostro punto sulla leggibilità. –

+0

Grazie Ben. Era di fretta. – meyumer

2

Sono equivalenti, ma la soluzione di valutazione cortocircuitata potrebbe essere meno leggibile, specialmente se i nomi delle funzioni sono lunghi o accettano parametri.