【发布时间】:2010-09-11 23:32:25
【问题描述】:
以下两个 C# 代码 sn-ps 产生不同的结果(假设变量 level 在递归调用之前和之后都使用)。为什么?
public DoStuff(int level)
{
// ...
DoStuff(level++);
// ...
}
,
public DoStuff(int level)
{
// ...
DoStuff(level+1);
// ...
}
在阅读了下面的一些回复后,我认为发布 level++、++level 和 level+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#,但我不知道!
-
您的堆栈跟踪错误。 level++ 应该是 1, 1, 1, 1; ++级应该是1、2、3、4;并且 level + 1 应该是 1, 2, 3, 4
-
Orion - 堆栈跟踪直接取自 VS2008。我将函数调用跟踪到四个递归级别并进行了剪切和粘贴。
-
啊..我正在编写堆栈跟踪,最后一次调用位于底部,而不是顶部。我看的不是级别的值,而是传递给每个函数的值。要正确评估堆栈,您应该在函数的第一行放置一个断点。