c# increment operator-precedence ref

c# - Interesante resultado del ejercicio de entrevista: retorno, incremento posterior y comportamiento de referencia



operator-precedence (3)

Esta pregunta ya tiene una respuesta aquí:

Aquí hay un código de aplicación de consola simple, que devuelve un resultado que no entiendo completamente.

Intente pensar si produce 0, 1 o 2 en la consola:

using System; namespace ConsoleApplication { class Program { static void Main() { int i = 0; i += Increment(ref i); Console.WriteLine(i); Console.ReadLine(); } static private int Increment(ref int i) { return i++; } } }

La respuesta es 0.

Lo que no entiendo es por qué el incremento incremental i++ , del método Increment , que se ejecuta en una ref (no en una copia de la variable pasada) incrementa la variable, pero luego se ignora.

Lo que quiero decir es en este video:

¿Alguien puede explicar este ejemplo y por qué durante la depuración veo que el valor se incrementa a 1, pero luego vuelve a 0?


Como mencionó, postincremento "i ++". declaración: "return i ++;" establecerá el valor de ''i'' en la memoria después de que se devuelva el valor original.

intente usar "return ++ i;" y probablemente lo consigas.


Creo que la "magia" aquí es solo la operación que precede al orden de las operaciones

i += Increment(ref i)

es lo mismo que

i = i + Increment(ref i)

la operación + se ejecuta de izquierda a derecha

así que primero tomamos i ... que es 0 en ese momento ...

luego agregamos el resultado de Incremento (ref i) ... que también es 0 ... 0 + 0 = 0 ... pero espere ... antes de obtener ese resultado, en realidad se incrementa ...

ese incremento tiene lugar después de que el operando izquierdo de nuestra operación + ha sido evaluado ... por lo que no cambia nada ... 0 + 0 aún es 0 ... por lo tanto, se me asigna 0 después de que se haya ejecutado la operación +


i += Increment(ref i); es equivalente a

i = i + Increment(ref i);

La expresión en el lado derecho de la tarea se evalúa de izquierda a derecha, por lo que el siguiente paso es

i = 0 + Increment(ref i);

return i++ devuelve el valor actual de i (que es 0), luego incrementa i

i = 0 + 0;

Antes de la asignación, el valor de i es 1 (incrementado en el método Increment ), pero la asignación vuelve a 0.