我有 C/C++ 背景。我遇到了一种在 C# 中交换两个值的奇怪方法。
int n1 = 10, n2=20;
n2 = n1 + (n1=n2)*0;
在 C# 中,上面两行在之间交换值n1
and n2
。这对我来说是一个惊喜,因为在 C/C++ 中,结果应该是n1=n2=20
.
那么,C# 如何计算表达式?它看起来像+
上面被视为function calling
大部头书。下面的解释似乎很合理。但对我来说似乎很奇怪。
- First
(n1=n2)
被执行。因此n1=20
.
- Then
n1
in n1+ (n1=n2)*0
还不到20岁。它被视为函数参数,因此被压入堆栈,并且仍然是 10。因此,n2=10+0=10
.
在 C# 中,子表达式按从左到右的顺序计算,并按该顺序产生副作用。 C# 5 规范第 7.3 节对此进行了定义:
表达式中的操作数是从左到右计算的。
重要的是要认识到子表达式求值的顺序独立于优先级(也称为操作顺序)和关联性。例如,在这样的表达式中A() + B() * C()
。 C# 中的求值顺序始终是A()
, B()
, C()
。我对 C/C++ 的有限理解是这个命令是编译器实现细节。
在您的示例中,首先对 + 的左操作数评估 n1 (10)。然后(n1=n2)
被评估。其结果是n2的值(20),并且产生了赋值给n1的副作用。 n1 现在是 20。然后进行 20 * 0 的乘法,产生 0。然后计算 10 + 0,并将结果 (10) 分配给 n2。因此,最终的预期状态是 n1 = 20 且 n2 = 10。
埃里克·利珀特 (Eric Lippert) 在这个网站 https://stackoverflow.com/questions/6800590/what-are-the-rules-for-evaluation-order-in-java and his blog http://blogs.msdn.com/b/ericlippert/archive/2008/05/23/precedence-vs-associativity-vs-order.aspx.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)