2011-06-16 26 views
8

leí desde el tutorial oficial de Java que prefijo y de sufijo ++ - tienen distintas precedencias:precedencia de operadores ++ y - en Java

postfix: expr ++ expr--

unario : ++ expr --expr + expr -expr ~!

Operators

Según el tutorial, no debe esta impresión

d = 1; System.out.println(d++ + ++d);

a cabo 6 (d++ hace d 2, ++d hace que sea 3) en lugar de 4?

sé la explicación de ++d siendo evaluado de antemano, pero si d++ tiene mayor precedencia a continuación ++d, ¿por qué no d++ siendo evaluados por primera vez? Y lo que es más, ¿en qué caso debería d++ mostrar que tiene mayor prioridad?

EDIT:

He intentado lo siguiente:

d = 1; System.out.println(++d * d++);

Devuelve 4. Parece que debería ser de 2 * 2, en lugar de 1 * 3.

+3

Preguntas como esta me frustran inmensamente. Nadie * alguna vez * escribe código como 'System.out.println (d ++ + ++ d);' entonces ¿por qué te importa? Es una súper-trivialidad. – Qwerky

+1

@Qwerky Aunque nadie podría escribir un código como este, quizás sea para la escuela. A los docentes/profesores les encanta preguntar este tipo de preguntas "nunca se escribirá así, pero vamos a probarlo de todas formas para ver si usted entiende cómo funciona". –

+0

@Qwerky Perdón por frustrarlo :) En cuanto a la razón por la que pregunté, tal vez es porque la curiosidad. Por suerte, ya que no soy un gato. –

Respuesta

12

El interior de la declaración println es esta operación (d ++) + (++ d)

  1. Es como sigue, se lee el valor de d (d = 1)
  2. valor actual de d (1) se pone en la función de adición
  3. se incrementa el valor de d (d = 2).

  4. Entonces, en el lado derecho, se lee el valor de d (2)

  5. El valor de d se incrementa (ahora d = 3)
  6. Por último, el valor de d (3) se pone en la función de suma

    por lo tanto 1 + 3 resultados en el 4

edit: lo siento para el formato, soy bastante malo en el uso de la lista jaja

+0

¡Gracias por ser la primera persona que me contestó y me iluminó! Sin embargo, utilicé mi voto máximo máximo hoy, así que supongo que tendría que hacerlo mañana. :) –

10

La clave es lo que devuelve la operación.

  • x ++ cambia el valor de x, pero devuelve la antigua x.
  • ++ x cambia el valor de xy devuelve el nuevo valor.
 
d=1 
System.out.println(d++ + ++d); // d is 1 
System.out.println(1 + ++d); // d is 2 
System.out.println(1 + 3); // d is 3 

imprime 4

2

No se trata de preferencia, se trata de orden de evaluación. d++ se evalúa como 1, pero luego se incrementa d. ++d incrementos d, y después evalúa a 3.

+0

Ya veo. ¿Pero podría mostrarme un caso en el que se muestra la precedencia? –

+0

@Ziyao: en una expresión como '(3 - 4 * 5)', la precedencia dicta que esto es equivalente a '(3 - (4 * 5))', no '((3 - 4) * 5)' . –

0

d tiene un valor se evalúa 1

d ++; su valor es 1 yd es ahora 2 (el valor de devoluciones posteriores a la ++ antes del incremento)

++ d se evalúa; su valor es 3 y d es ahora 3 (valor ++ rendimientos pre después de incremento)

1 + 3 = 4

0

System.out.println (d ++ + ++ d);

Así es como va:

++ d se ejecuta, por lo que ahora es d 2.

d + d es ejecutada, la cual es igual a 4.

El valor 4 se da a Sistema .out.println()

se ejecuta d ++, por lo que ahora es d 3.

2

Ver Why is this Java operator precedence being ignored here?.

Se reduce al hecho de que el operador postfix se está evaluando primero, pero devuelve el valor original de la variable, tal como está diseñado. Por lo tanto, a los efectos de su operación:

(d++ + ++d) 

Processes as: 
1. d++ evaluates, returning the original value of 1 but incrementing d to 2 
2. ++d evaluates, incrementing the value of 2 TO 3, and returning 3 
3. + evaluates, resulting in 1 + 3 

La confusión no está en el orden de precedencia de las fichas para ser evaluados, tienes ese derecho. El problema real está en la comprensión de la diferencia funcional entre los operadores postfix y prefijo.

6

Precedencia diferente no significa que se evaluará primero.

Significa las expresiones se agruparán de esta manera.

En este caso, d++ + ++d se agruparán (d++) + (++d), y esta expresión binaria serán evaluados en este orden:

  • operando de la izquierda d++.Esta subexpresión se compone de un operador de incremento de sufijo y una variable, por lo que tiene esos dos efectos:
    • El valor de la subexpresión es 1
    • se actualiza la variable: d = 2
  • operando derecho ++d. Esta subexpresión se compone de un operador de incremento prefijo y una variable, por lo que tiene estos dos efectos:
    • La variable se actualiza: d = 3
    • El valor de la subexpresión es 3
  • operador + se evalúa, usando los valores de los dos operandos.
    • Así, el valor de la expresión es 1 + 3 = 4.

La diferente precedencia entre las formas de prefijo y de sufijo de ++ sólo sería visto en ++d++, que será interpretada como ++(d++) - y esto no tiene ningún significado (tampoco (++d)++), ya que ++ solo funciona en variables, no en valores (y el resultado es un valor).

+1

Cerrar, pero su conclusión es incorrecta. Debe ser 1 + 3 = 4 como se explica en las respuestas anteriores. ++ d devuelve el resultado antes del incremento, así que aunque d será igual a 2 después de evaluar la expresión izquierda, la expresión izquierda se evalúa como 1. –

+0

Gracias por la corrección ... Es extraño que esto haya pasado inadvertido durante 9 meses. –

+0

¡De nada! Pensé que era valioso explicar esto de muchas maneras diferentes, y creo que mucha gente encontrará útil la forma en que presentó la información. –

0

Repasé todas las explicaciones desde arriba. Según la comprensión, el siguiente código debería dar 11.0, y luego da 10.0 double x = 4.5; x = x + ++ x; // x obtiene el valor 10.0.

Cuestiones relacionadas