次の2つのC#コードスニペットは、異なる結果を生成します(再帰呼び出しの前後の両方で変数レベルが使用されると想定しています)。なんで?
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)