6

Considerate due condizioni con una connessione &&. So che l'ordine di valutazione va da sinistra a destra. Ma se la prima condizione si risolve in falsa, la seconda condizione è garantita per non essere valutata?Una dichiarazione if è garantita per non essere valutata più del necessario?

#define SIZE 
bool array[SIZE]; 
int index; 

// play with variables 
// ... 

if(index < SIZE && array[index]) 
{ 
    // ... 
} 

In questo esempio, se la prima condizione è falsa la seconda non deve essere valutata poiché l'accesso nella matrice sarebbe fuori portata.

A proposito, non posso semplicemente annidare i condizionali con due istruzioni if, poiché in realtà ho bisogno dell'inversa come (!(in_range && get_element)). Con le dichiarazioni annidate dovrei usare goto per saltare sopra il blocco di codice sotto quello.

+2

Questo non ha praticamente nulla a che fare con l'istruzione if. L'istruzione if viene eseguita solo una volta, ma quello che stai chiedendo è in realtà il comportamento dell'operatore '&&' ** **. –

+0

Sentiti libero di modificare i tag e il titolo della domanda se fosse più adatto alla domanda reale. – danijar

+0

Anche se il duplicato più esatto è quello sopra, le risposte sono migliori qui: http://stackoverflow.com/questions/5683026/logical-comparisons-is-left-to-right-evaluation-guaranteed, così come qui: http://stackoverflow.com/questions/628526/is-short-circuiting-boolean-operators-mandated-in-cc-and-evaluation-order – jogojapan

risposta

15

Ma se la prima condizione si risolve su false, è la seconda condizione garantito di non farsi valutare?

Sì, questo è il cortocircuito di C++. Per paragrafo 5.14/1 della norma C++ 11:

I gruppi di operatori && da sinistra a destra. Gli operandi vengono entrambi convertiti contestualmente in bool (clausola 4). Il risultato è true se entrambi gli operandi sono true e false in caso contrario. A differenza di &, && garantisce la valutazione da sinistra a destra : il secondo operando non viene valutato se il primo operando è false.

As MatthieuM. correctly mentions in the comments, quanto sopra vale solo al incorporato operatori logici AND e OR logico: se tali operatori sono sovraccarichi, invocando li viene trattata come una chiamata di funzione normale (quindi applica un corto circuito e nessun ordine di la valutazione è garantita).

come specificato al paragrafo 5/2:

[Nota: Gli operatori possono essere sovraccaricati, cioè, dato un senso quando applicato a espressioni del tipo di classe (Clausola 9) o tipo di enumerazione (7.2). Gli utilizzi di operatori sovraccaricati vengono trasformati in chiamate di funzioni come descritto in in 13.5. Gli operatori sovraccaricati rispettano le regole per la sintassi specificate nella clausola 5, ma i requisiti del tipo di operando , categoria di valore e ordine di valutazione sono sostituiti dalle regole per la chiamata di funzione. [...] - end note]

+4

Nota: questo è vero solo per il built-in 'and' e' o' operatori; se sovraccarichi 'and' o' or' con tipi personalizzati, si applicano le normali regole di valutazione delle funzioni. –

+0

@MatthieuM .: corretto, grazie per aver menzionato –