Los siguientes dos fragmentos de código C# producen resultados diferentes (suponiendo que el nivel variable se usa tanto antes como después de la llamada recursiva). ¿Por qué?¿Cuándo ++ no produce los mismos resultados que +1?
public DoStuff(int level)
{
// ...
DoStuff(level++);
// ...
}
,
public DoStuff(int level)
{
// ...
DoStuff(level+1);
// ...
}
Después de leer algunas de las respuestas a continuación pensé que valdría la pena publicar los seguimientos de pila para el nivel ++, ++ nivel y el nivel + 1 para resaltar cómo engañar a este problema es.
Los he simplificado para esta publicación. La secuencia de llamada recursiva comienza con DoStuff (1).
// nivel ++
DoStuff(int level = 1)
DoStuff(int level = 2)
DoStuff(int level = 2)
DoStuff(int level = 2)
// ++ nivel
DoStuff(int level = 4)
DoStuff(int level = 4)
DoStuff(int level = 3)
DoStuff(int level = 2)
// nivel + 1
DoStuff(int level = 4)
DoStuff(int level = 3)
DoStuff(int level = 2)
DoStuff(int level = 1)
¡Gran pregunta y buena respuesta! He estado usando C++ durante años y C# más recientemente, ¡y no tenía idea! –
Tus seguimientos de pila son incorrectos. nivel ++ debe ser 1, 1, 1, 1; ++ nivel debe ser 1, 2, 3, 4; y level + 1 debería ser 1, 2, 3, 4 –
Orion - los rastros de pila se tomaron directamente de VS2008. Seguí las llamadas de función a cuatro niveles de recursión e hice un corte y pegado. –