什么时候++不会产生与+1相同的结果?

Ric*_*man 27 c# stack increment

以下两个C#代码片段产生不同的结果(假设在递归调用之前和之后都使用变量级别).为什么?

public DoStuff(int level)
{
  // ...
  DoStuff(level++);
  // ...
}
Run Code Online (Sandbox Code Playgroud)

,

public DoStuff(int level)
{
  // ...
  DoStuff(level+1);
  // ...
}
Run Code Online (Sandbox Code Playgroud)

在阅读了下面的一些回复后,我认为值得发布级别++,++级别和级别+ 1的堆栈跟踪以突出显示欺骗这个问题的方式.

我已经为这篇文章简化了它们.递归调用序列以DoStuff(1)开始.

// level ++

DoStuff(int level = 1)
DoStuff(int level = 2)
DoStuff(int level = 2)
DoStuff(int level = 2)
Run Code Online (Sandbox Code Playgroud)

// ++级别

DoStuff(int level = 4)
DoStuff(int level = 4)
DoStuff(int level = 3)
DoStuff(int level = 2)
Run Code Online (Sandbox Code Playgroud)

// level + 1

DoStuff(int level = 4)
DoStuff(int level = 3)
DoStuff(int level = 2)
DoStuff(int level = 1)
Run Code Online (Sandbox Code Playgroud)

Mat*_*att 44

澄清所有其他答复:

+++++++++++++++++++++

DoStuff(a++);
Run Code Online (Sandbox Code Playgroud)

相当于:

DoStuff(a);
a = a + 1;
Run Code Online (Sandbox Code Playgroud)

+++++++++++++++++++++

DoStuff(++a);
Run Code Online (Sandbox Code Playgroud)

相当于:

a = a + 1;
DoStuff(a);
Run Code Online (Sandbox Code Playgroud)

+++++++++++++++++++++

DoStuff(a + 1);
Run Code Online (Sandbox Code Playgroud)

相当于:

b = a + 1;
DoStuff(b);
Run Code Online (Sandbox Code Playgroud)

+++++++++++++++++++++

  • @Orion Adrian:不,这个例子没错. (3认同)

Fre*_*man 29

因为第一个例子实际上相当于:

public DoStuff(int level)
{  
  // ...
  int temp = level;
  level = level + 1;
  DoStuff(temp);
  // ...
}
Run Code Online (Sandbox Code Playgroud)

注意你也可以写++ level; 这相当于:

public DoStuff(int level)
{  
  // ...
  level = level + 1;
  DoStuff(level);
  // ...
}
Run Code Online (Sandbox Code Playgroud)

在我看来,最好不要过度使用++和 - 运算符; 它很快就会让人感到困惑和/或未定义真正发生的事情,而现代C++编译器无论如何都无法使用这些运算符生成更高效的代码.

  • 我认为这被归类为"试图变得可爱":) (3认同)

wor*_*ad3 27

level ++级别传递给DoStuff,然后递增级别以在函数的其余部分中使用.这可能是一个相当讨厌的错误,因为递归将永远不会结束(从显示的内容,DoStuff始终传递相同的值).也许++级别意味着,因为这与级别++相反(递增级别并将递增的值传递给DoStuff)?

水平+ 1将通过水平+ 1DoStuff离开水平不变的功能的其余部分.


Ori*_*ian 12

的返回值level++leveltherefore传递levelDoStuff.这可能是一个相当讨厌的错误,因为递归永远不会结束(从显示的DoStuff内容始终以相同的值传递).也许++levellevel + 1意味着呢?

level + 1对于函数的其余部分,将level + 1进入DoStufflevel保持不变.


后增量运算符(变量++)与函数完全等效

int post_increment(ref int value)
{
    int temp = value;
    value = value + 1
    return temp;
}
Run Code Online (Sandbox Code Playgroud)

而预增量运算符(++变量)恰好等同于函数

int pre_increment(ref int value)
{
    value = value + 1;
    return value;
}
Run Code Online (Sandbox Code Playgroud)

因此,如果将运算符内联扩展到代码中,则运算符等效于:

DoStuff(a + 1)

int temp = a + 1;
DoStuff(temp);
Run Code Online (Sandbox Code Playgroud)
DoStuff(++a)

a = a + 1;
DoStuff(a);
Run Code Online (Sandbox Code Playgroud)
DoStuff(a++);

int temp = a;
a = a + 1;
DoStuff(temp);
Run Code Online (Sandbox Code Playgroud)

值得注意的是,后增量等于:

DoStuff(a);
a = a + 1;
Run Code Online (Sandbox Code Playgroud)

此外,作为样式点,除非打算使用递增的值(规则的特定版本,"除非您打算使用该值,否则不为变量赋值",否则不应增加值) ).如果i + 1再也不使用该值,那么首选用法应该是,DoStuff(i + 1)而不是DoStuff(++i).