Que hace '?' hacer en C ++?

80
int qempty()
{
    return (f == r ? 1 : 0);
}

En el fragmento anterior, ¿qué significa " ? " ¿Con qué podemos reemplazarlo?

Thaier Alkhateeb
fuente
22
En este caso particular, por supuesto, puede reemplazarlo con return f == r;
Eclipse
6
@Eclipse: No confiaría en una conversión implícita bool-> int si pudiera evitarlo.
Daniel Daranas
2
@DanielDaranas ¿por qué no? (Esta es una especie de pregunta para principiantes; una explicación de sus comentarios para principiantes sería muy útil y apreciada).
Michael Hoffmann
4
@MichaelHoffmann El comportamiento de la conversión implícita en este caso está bien definido, por lo que usarlo es perfectamente correcto; consulte esta respuesta para obtener una referencia al estándar. Personalmente, evito usar conversiones de tipos implícitas porque creo que el código es más legible y fácil de mantener y menos propenso a errores sin ellas. Escribí con más detalle sobre esto en esta publicación de blog .
Daniel Daranas

Respuestas:

135

Esto se conoce comúnmente como el operador condicional , y cuando se usa así:

condition ? result_if_true : result_if_false

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

Es azúcar sintáctico , y en este caso, se puede reemplazar con

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

Nota: Algunas personas se refieren a ?:él como " el operador ternario ", porque es el único operador ternario (es decir, el operador que toma tres argumentos) en el idioma que están usando.

Daniel LeCheminant
fuente
4
En el código normal, es azúcar sintáctico, pero le permite realizar una inicialización condicional en la lista de inicialización del constructot.
JohnMcG
Foo (Bar * y) pMember (y == NULL? NULL: y-> pMember) - Aquí, inicializamos pMember con el pMember de y, o NULL si no está allí. No se puede poner if-else en la inicialización de un constructor, por lo que el operador ternario lo hace posible.
JohnMcG
@JohnMcG: Bueno, en C ++ 11 podrías considerar el a? b : cazúcar sintáctico para [&]() -> Type { if (a) return b; else return c; }().
celtschk
1
Probablemente, pero la pregunta, la respuesta y el comentario se escribieron en 2009.
JohnMcG
15

Este es un operador ternario, es básicamente una declaración if en línea

x ? y : z

funciona como

if(x) y else z

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

Es útil para escribir código sucinto, pero puede usarse en exceso para crear código difícil de mantener.

Ricardo
fuente
4
Vale la pena saber que hay un punto de secuencia en el '?'. Eso significa que lo siguiente es válido: ++ x? x: y;
Johannes Schaub - litb
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
6

Puedes reescribirlo como:

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

Que hace lo mismo que se dice en las otras respuestas.


fuente
esto realizaría una conversión implícita de booleano a int
Don Cheadle
6

Solo una nota, si alguna vez ves esto:

a = x ? : y;

Es una extensión GNU del estándar (consulte https://gcc.gnu.org/onlinedocs/gcc/Conditionals.html#Conditionals ).

Es lo mismo que

a = x ? x : y;
Nick Kossifidis
fuente
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 ; devuelve correctamente 2 , en mi compilador y esto no se quejó de nada.
Vinícius A. Jorge
3

Es el operador condicional.

un ? antes de Cristo

Es un atajo para IF / THEN / ELSE.

significa: si a es verdadero, devuelve b, de lo contrario devuelve c. En este caso, si f == r, devuelve 1, de lo contrario, devuelve 0.

Joe
fuente
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, se devuelve 0. El código podría reescribirse como

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

que probablemente no sea la forma más limpia de hacerlo, pero con suerte ayudará a su comprensión.

ssakl
fuente