C#增加后和增加前
我有时对速记增量操作感到非常困惑 当我还没开始用BASIC编程的时候,我就知道了a=a+1是一种非常痛苦的说法,这就是“获取a的当前值,向其添加1,然后将新值存储回a”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
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。