【发布时间】: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# 中,参数副作用总是从左到右发生。)