¿Cómo se llama el operador Java?: y ¿qué hace?

Resuelto mainstringargs asked hace 15 años • 18 respuestas

He estado trabajando con Java durante un par de años, pero hasta hace poco no me había encontrado con esta construcción:

int count = isHere ? getHereCount(index) : getAwayCount(index);

Probablemente esta sea una pregunta muy simple, pero ¿alguien puede explicarla? ¿Cómo lo leo? Estoy bastante seguro de saber cómo funciona.

  • si isHerees cierto, getHereCount()se llama,
  • si isHerees falso getAwayCount()se llama.

¿Correcto? ¿Cómo se llama esta construcción?

mainstringargs avatar Apr 28 '09 22:04 mainstringargs
Aceptado

Sí, es una forma abreviada de

int count;
if (isHere)
    count = getHereCount(index);
else
    count = getAwayCount(index);

Se llama operador condicional . Mucha gente (erróneamente) lo llama operador ternario , porque es el único operador ternario (de tres argumentos) en Java, C, C++ y probablemente en muchos otros lenguajes. Pero, en teoría , podría haber otro operador ternario, mientras que sólo puede haber un operador condicional .

El nombre oficial aparece en la Especificación del lenguaje Java :

§15.25 ¿Operador condicional? :

El operador condicional ? :utiliza el valor booleano de una expresión para decidir cuál de las otras dos expresiones debe evaluarse.

Tenga en cuenta que ambas ramas deben conducir a métodos con valores de retorno:

Es un error en tiempo de compilación que la segunda o tercera expresión de operando sea una invocación de un método nulo.

De hecho, según la gramática de las declaraciones de expresión ( §14.8 ), no está permitido que aparezca una expresión condicional en ningún contexto donde pueda aparecer una invocación de un método nulo.

Entonces, si doSomething()y doSomethingElse()son métodos nulos, no puedes comprimir esto:

if (someBool)
    doSomething();
else
    doSomethingElse();

dentro de esto:

someBool ? doSomething() : doSomethingElse();

Palabras simples:

booleanCondition ? executeThisPartIfBooleanConditionIsTrue : executeThisPartIfBooleanConditionIsFalse 
Michael Myers avatar Apr 28 '2009 15:04 Michael Myers

Otros han respondido a esto en una medida razonable, pero a menudo con el nombre de "operador ternario".

Siendo lo pedante que soy, me gustaría dejar claro que el nombre del operador es operador condicional u "operador condicional?:". Es un operador ternario (ya que tiene tres operandos) y resulta ser el único operador ternario en Java en este momento.

Sin embargo, la especificación es bastante clara : su nombre es operador condicional u "operador condicional ?:" para ser absolutamente inequívoco. Creo que es más claro llamarlo por ese nombre, ya que indica el comportamiento del operador hasta cierto punto (evaluar una condición) en lugar de solo cuántos operandos tiene.

Jon Skeet avatar Apr 28 '2009 15:04 Jon Skeet

Según la especificación Sun Java , se denomina operador condicional. Ver sección 15.25. Tienes razón en cuanto a lo que hace.

¿El operador condicional? : utiliza el valor booleano de una expresión para decidir cuál de las otras dos expresiones debe evaluarse.

El operador condicional es sintácticamente asociativo por la derecha (agrupa de derecha a izquierda), de modo que a?b:c?d:e?f:g significa lo mismo que a?b:(c?d:(e?f :gramo)).

ConditionalExpression:
        ConditionalOrExpression
        ConditionalOrExpression ? Expression : ConditionalExpression

El operador condicional tiene tres expresiones de operandos; ? aparece entre la primera y la segunda expresión, y : aparece entre la segunda y la tercera expresión.

La primera expresión debe ser de tipo booleano o booleano, o se producirá un error en tiempo de compilación.

JRL avatar Apr 28 '2009 15:04 JRL
condition ? truth : false;

Si la condición es trueentonces evalúe la primera expresión. Si la condición es false, evalúe la segunda expresión.

Se llama Operador Condicional y es un tipo de Operación Ternaria .

Joe Phillips avatar Apr 28 '2009 15:04 Joe Phillips
int count = isHere ? getHereCount(index) : getAwayCount(index);

medio :

if (isHere) {
    count = getHereCount(index);
} else {
    count = getAwayCount(index);
}
Romain Linsolas avatar Apr 28 '2009 15:04 Romain Linsolas