2012-06-14 21 views
7

si x = 3 yz no está asignado,
¿por qué z = x-- - --x evalúa a 2?si x = 3 y z no está asignado, ¿por qué z = x-- - --x evalúa a 2?

mi profesor está dando conferencias sobre esto en este momento, y actualmente estoy atascado con este dilema. Lamentablemente, nadie puede explicar por qué sucede.

+1

¿Qué es 'x- - --x'? – dtsg

+0

x en decremento post menos x pre decremento – arscariosus

+4

es esto 'C#' o esto es un 'JavaScript'? Elija la etiqueta correcta, por favor. – Tigran

Respuesta

17

en x--, x = 3, y después de eso es 2. en --x, x = 1, porque la sustracción (de 2) se hace de antemano.

Por lo tanto, 3 - 1 = 2.

+1

por favor refine su respuesta ... todavía no obtuve – Talha

+0

Simplemente curioso: ¿C# garantiza el orden en que se evalúa la expresión? ¿Cómo sabemos que la disminución posterior ocurre primero? –

+0

@torrentialcoding Porque sí, "garantiza" eso. Es solo la forma en que funciona, realmente. El prefijo se define para ser hecho antes de la operación y Postfix se define para ser hecho Post-operación. – SimpleVar

8

Aquí es el orden de las operaciones, que se ilustra para una mejor comprensión:

  • x - - --x Hold valor de x (permite llamada it tmpA). tmpA es 3.
  • x - - --x Disminuye x. Ahora es 2.
  • x-- - - x Disminuye x. Ahora es 1.
  • x-- - - x Mantenga el valor de x (permite llamarlo tmpB). tmpB es 1.
  • x-- - --x Realiza la construcción a partir de los valores calculados. 3 - 1 = 2.

El -- prefix significa el decremento se hará antes de evaluar la expresión y la postfix -- significa el decremento se hará después de la evaluación de la expresión.

+1

@downvotwer Cuidar para explicar? – SimpleVar

+0

@ Yorye: Modifiqué el último párrafo para (creo) hacerlo más claro. Su última edición borra eso. Si eso fue intencional, no te preocupes, pero si no, puedes mirar el diff y restaurar la edición. –

+0

En realidad, lo estaba editando al mismo tiempo para codificar el '--prefix' y' postfix - 'que creo que es bastante comprensible. No intenté en absoluto arruinar tu edición, y ME GUSTA REALMENTE la primera, no sabía que pudieras usar etiquetas HTML básicas, lo que me sacó de esa ridícula * y situación. No pensé que la estructura de las oraciones de tu última edición fuera muy comprensible, pero estaré feliz si editaste mi respuesta nuevamente para que puedas obtener tu crédito por tus mejoras :) – SimpleVar

5

está mal, es bastante simple:

vamos a añadir entre paréntesis:

z = (x--) - (--x)

^^ así es como compilador ve el código después de tokenizing.

Compiler evalúa la ecuación (parte derecha) de izquierda a derecha

Ahora,

x-- es igual a POP el valor de x y luego disminuirlo y empuje hacia atrás valor en una memoria. Ok, vamos a hacerlo:

valor actual de X es 3, es decrementado 2 - así, en la ecuación nos pondremos 3, pero X contendrá nuevo valor 2.

--x es igual a disminuir el valor X y luego POP este valor en ecuación. Hagámoslo:

El valor actual de X es 2 (porque la operación anterior lo disminuyó), y ahora queremos disminuirlo una vez más. 2-1 = 1, lo tengo.

Ahora, volviendo a la ecuación completa: z = (3) - (1) = 2.

Cuestiones relacionadas