gpt4 book ai didi

c# - C# 如何计算包含赋值的表达式?

转载 作者:太空狗 更新时间:2023-10-29 22:22:26 25 4
gpt4 key购买 nike

我有 C/C++ 背景。我遇到了一种在 C# 中交换两个值的奇怪方法。

int n1 = 10, n2=20;
n2 = n1 + (n1=n2)*0;

在 C# 中,以上两行在 n1n2 之间交换值。这让我感到惊讶,因为在 C/C++ 中,结果应该是 n1=n2=20

那么,C# 如何计算表达式?上面的 + 似乎被视为对我的 函数调用 。下面的解释似乎是合理的。但对我来说似乎很奇怪。

  1. 首先执行(n1=n2)。因此 n1=20
  2. 那么 n1+ (n1=n2)*0 中的 n1 还不是 20。它被视为函数参数,因此压入堆栈且仍为 10。因此,n2=10+0=10

最佳答案

在 C# 中,子表达式按从左到右的顺序求值,并按该顺序产生副作用。这是在 C# 5 规范的第 7.3 节中定义的:

Operands in an expression are evaluated from left to right.

重要的是要认识到子表达式求值的顺序独立于优先级(也称为操作顺序)和关联性。例如,在类似 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 在 this site 上详细讨论了这个问题和 his blog .

关于c# - C# 如何计算包含赋值的表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25029343/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com