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
.
El valor de t1 en la segunda línea es 5
t2 = t1 + (++t1)
t2 = 5 + 6; // t1 becomes 6 here
El orden de evaluación es de izquierda a derecha.
Entonces, primero t1 se evalúa a
5
luego
++t1
a
6
y, por lo tanto, el resultado es
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;