Следующие два фрагмента кода C# производят разные результаты (при условии, что уровень переменной используется как до, так и после рекурсивного вызова). Зачем?Когда ++ не дает те же результаты, что и +1?
public DoStuff(int level)
{
// ...
DoStuff(level++);
// ...
}
,
public DoStuff(int level)
{
// ...
DoStuff(level+1);
// ...
}
После прочтения некоторых ответов ниже, я думал, что было бы целесообразно разместить трассировки стека на уровне ++, ++ уровень и уровень + 1, чтобы показать, как обманывают эту проблему.
Я упростил их для этой публикации. Рекурсивная последовательность вызовов начинается с DoStuff (1).
// уровень ++
DoStuff(int level = 1)
DoStuff(int level = 2)
DoStuff(int level = 2)
DoStuff(int level = 2)
// ++ уровень
DoStuff(int level = 4)
DoStuff(int level = 4)
DoStuff(int level = 3)
DoStuff(int level = 2)
// уровень + 1
DoStuff(int level = 4)
DoStuff(int level = 3)
DoStuff(int level = 2)
DoStuff(int level = 1)
Отличный вопрос и отличный ответ! Я использую C++ в течение многих лет и C# совсем недавно, и я понятия не имел! – 2008-09-22 14:38:52
Ваши следы стека ошибочны. уровень ++ должен быть 1, 1, 1, 1; ++ уровень должен быть 1, 2, 3, 4; и уровень + 1 должен быть 1, 2, 3, 4 – 2008-09-23 12:16:22
Орион - трассировка стека была взята непосредственно из VS2008. Я проследил функции вызова до четырех уровней рекурсии и сделал вырез и вставку. – 2008-09-23 20:37:31