我有C/C++背景。在学习C#时,我发现了一种奇怪的交换两个变量值的方法。
int n1 = 10, n2=20;
n2 = n1 + (n1=n2)*0;
在C#中,上述两行代码确实可以交换
n1
和n2
的值。这让我感到惊讶,因为在C/C++中,结果应该是n1=n2=20
。那么,C#如何评估表达式呢?在我看来,它似乎将上面的
+
视为函数调用
。以下解释似乎是合理的。但对我来说看起来很奇怪。
- 首先执行
(n1=n2)
。因此,n1=20
。 - 然后,在
n1+ (n1=n2)*0
中,n1
还没有变成20。它被视为一个函数参数,因此被压入堆栈并且仍然是10。因此,n2=10+0=10
。
n1
并在评估(n1=n2)*0
之前将其存储在某个地方时是自由的,只要它们的加法是执行的最后一个操作。 - user657267