c# - Interesante resultado del ejercicio de entrevista: retorno, incremento posterior y comportamiento de referencia
operator-precedence (3)
Esta pregunta ya tiene una respuesta aquí:
- Post-incremento dentro de una autoasignación 6 respuestas
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.