5

Se si dispone quanto segue:fa il corto circuito operatore ternario in un modo definito

if (x) 
{ 
    y = *x; 
} 
else 
{ 
    y = 0; 
} 

Poi comportamento è garantito da definire in quanto possiamo solo dereferenziarlo x se non è 0

Può il stesso dicasi per:

y = (x) ? *x : 0; 

Questo sembra funzionare come previsto (anche compilato con -Wpedantic sul g ++)

È garantito?

+0

Sì - L'operatore ternario è solo zucchero sintattico –

+3

Sì. (Troppo breve per essere pubblicato come risposta). – JSF

+0

Non c'è "cortocircuito" nell'espressione ternaria. E non valuta prematuramente o esegue alcun ramo prima che la condizione sia stata completamente valutata. –

risposta

12

Sì, solo il secondo o il terzo operando sarà valutato, il progetto di C++ sezione standard 5.16[expr.cond] dice:

espressioni condizionali gruppo da destra a sinistra. La prima espressione viene convertita contestualmente in bool (Clausola 4). Viene valutato e se è vero, il risultato dell'espressione condizionale è il valore della seconda espressione, altrimenti quella della terza espressione. Viene valutata solo una tra la seconda e la terza espressione. Ogni computo ed effetto collaterale associato alla prima espressione viene sequenziato prima di ogni calcolo del valore ed effetto collaterale associato alla seconda o alla terza espressione.