java - ternarios - Operador ternario, error de sintaxis al utilizar la asignación
php operadores ternarios (4)
Las siguientes 3 líneas de código a continuación compilan OK. (Tenga en cuenta que este código es un ejemplo de "codificación Java artificial" y, por lo tanto, no se verá en un código escrito profesionalmente).
int x, y;
boolean b=true;
x = b ? y=1 : 2; // Compiles OK.
Si ahora cambio el código en la línea # 3 anterior, para que se vea como la siguiente línea de código a continuación, el compilador genera un error.
// Change the position of the "y assignment", and now the code doesn''t compile.
x = b ? 1 : y=2;
Aquí está el mensaje de error de sintaxis:
¿Puede alguien explicar este comportamiento (a un principiante de Java)? Gracias.
Consulte "Prioridad del operador de Java". Mientras tanto, use:
x = (b ? 1 : (y=2));
Hermano, trata de poner expresiones entre paréntesis.
X = (b? 1: (y = 2));
esto funcionará bien
La precedencia del operador Java es la siguiente
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html
Aquí viene ternary
antes de la operación de assignment
. entonces tu declaración será así
x = (evaluación ternaria) = valor de asignación
si aún desea establecer un valor para y, cuando b es falso, puede usar ()
para ''y = 2'' traer la evaluación ternaria.
x = b ? 1 : (y=2);
Corto :
Esto se debe a la precedencia del operador. El primer caso es igual a este:
x = (b ? (y=1) : 2); // Compiles OK.
Mientras que el segundo es:
x = (b ? 1 : y) = 2;
El primero compila realmente bien, porque una asignación se evalúa al nuevo valor. Entonces, si b
es verdadero, causará que tanto x
como y
igual a 1. El segundo es como decir: x = 1 = 2
. Entonces, sí, para corregir este error del compilador, agregue paratheses a su declaración:
x = (b ? 1 : (y = 2)); // Outer () are not needed, but is clearer, IMHO.
Más largo
En primer lugar, la prioridad del operador en Java dice que los operadores de asignación tienen una prioridad más baja que el operador ternario condicional. Esto significa que su segunda expresión es equivalente a:
x = (b ? 1 : y) = 2;
Como puedes ver, esto se ve mal. De hecho, JLS §15.26 dice esto:
Hay 12 operadores de asignación; Todos son sintácticamente asociativos por la derecha (se agrupan de derecha a izquierda). Por lo tanto,
a=b=c
significaa=(b=c)
, que asigna el valor dec
ab
y luego asigna el valor deb
aa
.El resultado del primer operando de un operador de asignación debe ser una variable , o se produce un error en tiempo de compilación. (Esto explica el error de tiempo de compilación al que te enfrentas)
En el tiempo de ejecución, el resultado de la expresión de asignación es el valor de la variable después de que se haya producido la asignación. El resultado de una expresión de asignación no es en sí mismo una variable.
Aplicando la asociatividad de derechos:
x = ((b ? 1 : y) = 2);
Finalmente, podemos ver por qué esto genera un error de compilación: el resultado de un operador condicional ternario no es una variable (que en realidad no está en el JLS por lo que puedo encontrar, sin embargo, el compilador le informa en un caso de prueba simple como este). : https://ideone.com/kMr7Xv ).