C#增加后和增加前

C#增加后和增加前,c#,.net,C#,.net,我有时对速记增量操作感到非常困惑 当我还没开始用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

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

当我还没开始用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

1] ,3]和4]在功能上相同-
a
增加1,整个表达式的值是
a
新值


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

上一个值,不同的是,运算符返回的值:

增量后运算符“a加号”加上一个,并返回旧的值:

int a = 1;
int b = a++;
// now a is 2, b is 1
    a = 1;
    b = ++a;
// now a is 2 and b is 2
预增量运算符“加上a”加一,并返回新的值:

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

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

仔细阅读这篇博文:

请注意,这篇文章的第二部分是愚人节的玩笑,所以不要相信它说的任何话。第一部分是严肃的

这些应该能回答你的问题


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

我不知道,我想知道。我有一种感觉,这种感觉会导致不明确的行为
f(x++)
增量何时发生?在传递值之后,然后立即递增或运行函数,并在末尾执行den increment?@SuvP:C#语言保证增量的副作用在调用函数之前发生,前提是从同一线程观察到副作用。C语言和C++语言没有;这是这些语言中实现定义的行为。@DevSolar:在C#中,疯狂的表达式,如
x=x+++x++
,是由规范定义的。在C和C++中,这是实现定义的行为。@ EricLippert:我实际上有C语言的ZIP经验,并且从C/C++中推断出来。谢谢你的澄清。但是,调用<代码> f(x++)在C和C++中定义良好,因为在<代码> f>()之前调用了参数< /COD>。没有明确定义的是计算参数的顺序(例如
f(x++,x)
)。@SuvP:Whoops,DevSolar是正确的。C和C++确实要求在输入函数之前观察到副作用,就像C一样。我记错了;正如DevSolar正确指出的那样,C/C++没有说明在表达式中观察到的顺序副作用,如
f(x++,x)
——我们知道x将在函数调用之前递增,但不会说明左参数的副作用是在右参数求值之前还是之后发生。(在C#中,参数的副作用总是从左到右出现。)在
f(x++)
中,增量是何时发生的?在传递值并立即递增并在函数中使用之后,还是在运行函数并最终递增之后?我的意思是,这种行为(无论它是否总是可以保证?或者它是否未定义)@SuvP在表达式求值和返回之前发生增量。在这种情况下,
x++
将把
x
的旧值返回到
f()
;在
f
开始执行之前,字段(或本地变量
x
)将递增。编辑:这里有一个等价的
++
代码分解,可以帮助您跟踪其逻辑流程:@SuvP独立于
f
的功能,
x++
是对
x
进行后加,将
x
的旧值传递给
f
好的,因此,传递的值被复制到局部变量中,然后在其余执行之前递增。@SuvP运算符保存旧值,递增变量值并返回旧值。然后执行f。