【问题标题】:C# post increment and pre incrementC# 后自增和预自增
【发布时间】:2013-04-12 14:13:22
【问题描述】:

我有时对速记增量操作感到非常困惑。

自从我在 BASIC 中进行少量编程时,我就知道如何坚持 a = a+1,这是一种很痛苦的说法,即“获取 a 的当前值,将其加 1,然后将新值存储回 a” .

1] a = a +1 ; 

2] a++ ;

3] ++a;

4] a +=1;

[1] 和 [4] 功能相似,符号不同,对吧?

2] 和 3] 的工作方式完全不同,因为增量符号 ++ 在之前和之后。对吧?

我可以安全地假设以下内容吗?

int f(int x){ return x * x;}

y = f(x++) -> for x =2, f(x) = x^2

f(x)     ======> y= 2^2 =4 

x=x+1;   ======> x= 2+1 = 3 



y = f(++x) -> for x =2, f(x) = x^2

x=x+1    ===========> x = 2+1 = 3

f(x)     ===========> y =3^2 = 9

【问题讨论】:

  • 我不知道,我有兴趣知道。我有一种感觉会导致不确定的行为。 f(x++) 什么时候增加?传递值后立即递增或运行函数并在最后递增?
  • @SuvP:C# 语言保证增量的副作用发生在函数调用之前,前提是从同一线程观察到副作用。 C 和 C++ 语言没有;这是这些语言中实现定义的行为。
  • @DevSolar:在 C# 中,像 x = x++ + x++ 这样的疯狂表达式在规范中得到了很好的定义。在 C 和 C++ 中,这是实现定义的行为。
  • @EricLippert:我实际上有使用 C# 的 zip 经验,并且是从 C/C++ 推断出来的。感谢您的澄清。 然而,调用f( x++ )在C和C++中也是很好定义的,因为参数is之前 i> f() 被调用。 没有明确定义的是评估参数的序列(例如f( x++, x ))。
  • @SuvP:哎呀,DevSolar 是正确的。 C 和 C++ 确实要求在输入函数之前观察副作用,就像 C# 一样。我记错了;正如 DevSolar 正确指出的那样,C/C++ not 说明在 f(x++, x) 这样的表达式中观察到的顺序副作用 - 我们知道 x 将在函数调用之前递增,但不知道左参数的副作用将在评估正确参数之前或之后发生。 (在 C# 中,参数副作用总是从左到右发生。)

标签: c# .net


【解决方案1】:

区别在于,操作符返回的是什么:

post-增量运算符“a plus plus”加一,并返回值:

int a = 1;
int b = a++;
// now a is 2, b is 1

pre-自增运算符“plus plus a”加一,并返回new值:

    a = 1;
    b = ++a;
// now a is 2 and b is 2

【讨论】:

  • f(x++) 中,增量何时发生?在传递值然后立即递增它并在函数中使用或运行函数并在最后递增它?我的意思是这种行为(无论它可能总是得到保证?还是未定义)
  • @SuvP 增量发生在表达式计算并返回之前。在这种情况下,x++ 会将x 值返回给f();在f 开始执行之前,字段(或本地变量x)将递增。编辑:这是++ 的等效代码细分,可能有助于您跟踪其逻辑流程:stackoverflow.com/questions/14175964/…
  • @SuvP 独立于您的f 所做的事情,x++ 是在增加x 之后,将x 的旧值传递给f
  • 好的,所以传递的值被复制到局部变量中,然后在其余的执行发生之前递增。
  • @SuvP 运算符保存旧值,增加变量的值并返回旧值。然后 f 将被执行。
【解决方案2】:

首先,你应该仔细阅读这个答案

What is the difference between i++ and ++i?

并仔细阅读这篇博文

http://blogs.msdn.com/b/ericlippert/archive/2011/03/29/compound-assignment-part-one.aspx

请注意,该帖子的第二部分是愚人节的玩笑,所以不要相信它所说的任何内容。第一部分很严肃。

那些应该回答你的问题。

当你只有一个普通的局部变量时,x++; ++x; x = x + 1; x += 1; 语句基本上都是一样的。但是一旦你偏离了普通的局部变量,事情就会变得更加复杂。这些操作对他们来说是微妙的。

【讨论】:

    【解决方案3】:

    1]、3] 和 4] 功能相同 - a 加一,整个表达式的值是 anew 值。

    2] 与其他不同。它还会增加a,但表达式的值是aprevious 值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-09
      • 2019-12-23
      • 1970-01-01
      相关资源
      最近更新 更多