2009-04-27 15 views
47

Nel frammento sopra, cosa significa "?"? Con cosa possiamo sostituirlo?Cosa significa "?" fare in C++?

+21

In questo particolare caso, naturalmente, si può semplicemente sostituirlo con ritorno f == r; – Eclipse

+24

Nei commenti, è usato per fare una domanda. –

+6

@Eclipse: non mi baserei su una conversione implicita bool-> int se posso evitarlo. –

risposta

86

Questo è comunemente indicato come il conditional operator, e quando usato:

condition ? result_if_true : result_if_false 

... se il condition viene valutato come true, l'espressione restituisce result_if_true, altrimenti restituisce result_if_false.

È syntactic sugar, e in questo caso, può essere sostituito con

int qempty() 
{ 
    if(f == r) 
    { 
     return 1; 
    } 
    else 
    { 
     return 0; 
    } 
} 

Nota: Alcune persone si riferiscono a ?: come "l'operatore ternario", perché è l'unico ternario operatore (cioè un operatore che accetta tre argomenti) nella lingua che sta utilizzando.

+0

Penso che implicitamente intendano "l'operatore ternario (C++)". Quali altri operatori ternari esistono in C++? – sblom

+0

Questo è l'unico in C++ – Colin

+0

per chiunque abbia bisogno di un amore condizionale: http://www.artima.com/cppsource/foreach.html. eric niebler spiega come il suo boost.foreach utilizza l'operatore condizionale. –

3

È l'operatore condizionale.

a? b: c

È una scorciatoia per IF/THEN/ELSE.

significa: se a è vero, restituisce b, altrimenti restituisce c. In questo caso, se f == R, ritorno 1, ritorno altrimenti 0.

14

Si tratta di un operatore ternario, è fondamentalmente un inline if

x ? y : z 

opere come

if(x) y else z 

eccezione invece di dichiarazioni hai espressioni; così puoi usarlo nel mezzo di una dichiarazione più complessa.

È utile per scrivere codice succinto, ma può essere utilizzato in modo eccessivo per creare codice difficile da gestire.

+4

Devi stare attento qui; non funziona esattamente come un'istruzione if. Mentre tu * puoi * dire qualcosa come int 'a = x? y: z; 'tu * non puoi * dire' int a = if (x) y else z; ' –

+3

vale la pena sapere che esiste un punto di sequenza nel '?'. Ciò significa che quanto segue è valido: ++ x? x: y; –

+1

@Daniel, questo è quello che intendevo con espressioni piuttosto che dichiarazioni. Probabilmente non ero abbastanza esplicito riguardo alla differenza, quindi grazie per l'aggiunta di alcuni chiarimenti. – Richard

2

Il punto interrogativo è l'operatore condizionale. Il codice significa che se == f r poi 1 viene restituito, in caso contrario, restituire 0. Il codice potrebbe essere riscritta come

int qempty() 
{ 
    if(f==r) 
    return 1; 
    else 
    return 0; 
} 

che probabilmente non è il modo più pulito per farlo, ma spero che aiuta la vostra comprensione.

5

Si può semplicemente riscrivere come:

int qempty(){ return(f==r);} 

che fa la stessa cosa come detto in altre risposte.

+0

eseguirebbe la conversione implicita da boolean a int – mmcrae

2

Solo una nota, se mai vedere questo:

a = x ? : y; 

Si tratta di un'estensione GNU allo standard (vedi https://gcc.gnu.org/onlinedocs/gcc/Conditionals.html#Conditionals).

E 'lo stesso di

a = x ? x : y; 
+0

in CLang (almeno le versioni più recenti) questa estensione è anche disponibile. È disponibile anche con flag C++ 11 disattivato in un progetto qmake. Quindi un'espressione come int 'x = 1 + 1? : 0 '; restituisce correttamente '2', nel mio compilatore e questo non si è lamentato di nulla. –