pocket edition dinnerbone anlyticsed java operator-precedence

edition - En Java, ¿cuál se ejecuta primero, "+" o "++"?



minecraft wiki (10)

++ x se ejecuta antes de usar la variable x, y x ++ aumenta x después de usarla:

x=5; y=x++; y is 5; and x is 6 x=5; y=++x; y is 6; and x is 6

Intenté el siguiente código en Java

t1 = 5; t2 = t1 + (++t1); System.out.println (t2);

Mi opinión es que ++ tiene una precedencia mayor que +, lo anterior se convierte en

t2 = t1 + (++t1); t2 = t1 + 6; // t1 becomes 6 here t2 = 6 + 6; t2 = 12;

Sin embargo, obtengo la respuesta 11 para t2. Alguien puede explicar?


El + se evalúa de izquierda a derecha, por lo que

t1 + (++t1) // Left side is evaluated to 5, right side evaluated to 6... 5 + (6) // ...and as a side effect t1 becomes 6

Resultados en 11 .



Estás casi en lo correcto pero estás malinterpretando sutilmente cómo funcionan las reglas de precedencia.

Compare estos dos casos:

int t1 = 5; int t2 = t1 + (++t1); System.out.println (t2); t1 = 5; t2 = (++t1) + t1; System.out.println (t2);

El resultado es:

11 12

La precedencia sí dice evaluar el ++ antes del + , pero eso no se aplica hasta que alcanza esa parte de la expresión.

Su expresión es de la forma X + Y Donde X es t1 e Y es (++t1)

La rama izquierda, es decir, X , se evalúa primero. Luego se evalúa la rama derecha, es decir, Y Solo cuando se trata de evaluar Y la operación ++ .

Las reglas de precedencia solo dicen que ++ está "dentro" de la expresión Y , no dicen nada sobre el orden de las operaciones.


La evaluación se realiza de izquierda a derecha. Entonces, en realidad lo que sucede es seguir

t2 = t1 + (++t1); t2 = 5 + 6; t2 = 11;


Otra forma de pensarlo es expandir la expresión ++:

++t1 es lo mismo que poner t1 = t1 + 1 .

1) t1 = 5; 2) t2 = t1 + (++t1); 3) t2 = t1 + (t1 = t1 + 1), 4) t2 = 5 + (t1 = t1 + 1) 5) t2 = 5 + (t1 = 6) 6) t2 = 5 + 6 = 11

Si tuviera que invertir el orden a t2 = (++t1) + t1; Entonces la expresión se expandiría a:

1) t2 = (t1 = t1 + 1) + t1 2) t2 = (t1 = 5 + 1) + t1 3) t2 = (t1 = 6) + t1 4) t2 = 6 + 6 = 12


Para agregar un punto a Chris K,

La asociatividad es de izquierda a derecha.

Entonces,

t2 = t1 + (++t1); t2 = 5 + 6; // first t1 is replaced with 5 and then the next 6 t2 = 11;


Tu lógica está cerca, pero no del todo bien. El orden de evaluación es de izquierda a derecha para el operador +. t1 viene antes del binario op, LHS y luego el incremento está en el RHS de ese binario op. El LHS se ejecuta primero.

t2 = t1 + (++t1); t2 = 5 + 6; // t1 becomes 6 here as a side effect before being read on the RHS t2 = 11;

Visualizado como un árbol que tienes,

+ / / t1 ++t1

Orden de precedencia

Cuando dos operadores comparten un operando, el operador con mayor prioridad va primero. Por ejemplo, 1 + 2 * 3 se trata como 1 + (2 * 3), mientras que 1 * 2 + 3 se trata como (1 * 2) + 3 ya que la multiplicación tiene mayor prioridad que la suma.

Asociatividad

Cuando dos operadores con la misma precedencia, la expresión se evalúa de acuerdo con su asociatividad. Por ejemplo, x = y = z = 17 se trata como x = (y = (z = 17)), dejando las tres variables con el valor 17, ya que el operador = tiene asociatividad de derecha a izquierda (y una instrucción de asignación evalúa al valor en el lado derecho). Por otro lado, 72/2/3 se trata como (72/2) / 3 ya que el operador / tiene asociatividad de izquierda a derecha.


enter code here t1 = 5; t2 = t1 + (++t1); // it takes 5 for t1 and as it moves further to (++t1), it increments t1 to 6, so it takes 6 for (++t1) t2 = 5 + 6; // (++t1) this increments t1 by 1 then return new value. So (++t1)=6 // (t1++) this returns old value n then increments t1 by 1. So (t1++)=5


t2 = t1 + (++t1);

Esto es equivalente a

temp = t1 + 1 t2 = t1 + temp; t1= temp;