2009-04-27 26 views
47
int qempty() 
{ 
    return (f == r ? 1 : 0); 
} 

En el fragmento de arriba, ¿qué significa "?"? ¿Con qué podemos reemplazarlo?¿Qué significa '?' hacer en C++?

+21

En este caso particular, por supuesto, sólo puede reemplazarlo con retorno f == r; – Eclipse

+24

En los comentarios, se usa para hacer una pregunta. –

+6

@Eclipse: No confiaría en una conversión implícita bool-> int si puedo evitarlo. –

Respuesta

86

Esto se conoce comúnmente como el conditional operator, y cuando se utiliza de esta manera:

condition ? result_if_true : result_if_false 

... si el condition evalúa a true, la expresión se evalúa result_if_true, de lo contrario, se evalúa como result_if_false.

Es syntactic sugar, y en este caso, se puede reemplazar con

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

Nota: Algunas personas se refieren a ?: como "el operador ternario", porque es la única ternaria operador (es decir, el operador que toma tres argumentos) en el idioma que están utilizando.

+0

Creo que implícitamente significan "el operador ternario (C++)". ¿Qué otros operadores ternarios existen en C++? – sblom

+0

Esa es la única en C++ – Colin

+0

Para cualquier persona que necesite amor condicional: http://www.artima.com/cppsource/foreach.html. Eric Niebler explica cómo su boost.foreach utiliza el operador condicional. –

3

Es el operador condicional.

a? b: c

Es un atajo para IF/THEN/ELSE.

significa: si a es cierto, devuelva b, de lo contrario devuelva c. En este caso, si f == r, 1 retorno, el retorno demás 0.

14

Este es un operador ternario, que es básicamente una línea if

x ? y : z 

obras como

if(x) y else z 

excepción , en lugar de declaraciones tienes expresiones; para que pueda usarlo en medio de una declaración más compleja.

Es útil para escribir códigos sucintos, pero puede ser usado en exceso para crear código difícil de mantener.

+4

Tienes que tener cuidado aquí; no funciona exactamente como una declaración if. Mientras que * puedes * decir algo como int 'a = x? y: z; 'usted * no puede * decir' int a = if (x) y else z; ' –

+3

que vale la pena saber que hay un punto de secuencia en '?'. Eso significa que lo siguiente es válido: ++ x? x: y; –

+1

@Daniel, eso es lo que quise decir con expresiones en lugar de declaraciones. Probablemente no fui lo suficientemente explícito sobre la diferencia, así que gracias por agregar algunas aclaraciones. – Richard

2

El signo de interrogación es el operador condicional. El código significa que si == f r entonces se devuelve 1, de lo contrario, devuelve 0. El código podría ser reescrita como

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

que no es probablemente la manera más limpia de hacerlo, pero espero que ayuda a su comprensión.

5

Usted sólo puede reescribir como:

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

Qué hace lo mismo como se ha dicho en las otras respuestas.

+0

Esto llevaría a cabo la conversión implícita de boolean a int – mmcrae

2

Sólo una nota, si alguna vez ve esto:

a = x ? : y; 

Es una extensión de GNU a la norma (ver https://gcc.gnu.org/onlinedocs/gcc/Conditionals.html#Conditionals).

Es lo mismo que

a = x ? x : y; 
+0

en CLang (al menos las versiones más recientes) esta extensión también está disponible. Está disponible incluso con el indicador C++ 11 desactivado en un proyecto qmake. ¿Entonces una expresión como int 'x = 1 + 1? : 0 '; correctamente devuelve '2', en mi compilador y esto no se quejó nada. –