如果x = 3,z未赋值,为什么z = x-- - --x的结果是2?

7
如果x = 3并且z没有被赋值,为什么z = x-- - --x的结果是2?
我的教授正在讲这个问题,我目前遇到了困境。不幸的是,没有人能解释它为什么会发生。

4
这是C#还是JavaScript?请选择正确的标签。 - Tigran
1
Duane:字体让它看起来很奇怪。它是 x-- (x 减减) 减去 --x (减减 x)。 - Matt
C#还是JS?一元运算符 - mplungjan
2
这种代码行的写法非常糟糕。有很多其他方法可以解释 x----x 的区别。 - Steve B
2
没有人会写出这样的代码,我不会用它来解释前/后缀递减,但我肯定会用它来检查学生是否真正理解了这个概念。 - Francesco Baruchelli
显示剩余4条评论
3个回答

17
在 x-- 的情况下,x 先保持为 3,然后变为 2。 在 --x 的情况下,x 先减去 1(从 2 减去),因此 x 变为 1。 因此,3 - 1 = 2。

1
请优化您的答案...我还没有理解。 - Talha
只是好奇:C#是否保证表达式的计算顺序?我们如何知道后缀递减先发生? - torrential coding
@torrentialcoding 因为是的,它“保证”这样做。这就是它的工作方式。前缀被定义为在操作之前完成,后缀被定义为在操作之后完成。 - SimpleVar
1
@torrentialcoding 关于排序:http://msdn.microsoft.com/zh-cn/library/Aa691322 - Vitaly Dyatlov
@VitalyDyatlov 谢谢。从您提供的MSDN文章中可以看出:“表达式中的操作数从左到右进行评估。”这回答了我的疑惑。 - torrential coding

8
以下是操作顺序的示例,以便更好地理解:
  • x-- - --x 保留 x 的值(我们称其为 tmpA)。tmpA 等于 3。
  • x-- - --x 减少 x 的值。现在它变成了 2。
  • x-- - --x 减少 x 的值。现在它变成了 1。
  • x-- - --x 保留 x 的值(我们称其为 tmpB)。tmpB 等于 1。
  • x-- - --x 从计算出的值中执行减法。3 - 1 = 2。
-- 前缀 表示在评估表达式之前将进行递减,而 后缀-- 表示在评估表达式之后将进行递减。

@ Yorye:我修改了最后一段,以使其更加清晰(我认为)。您最新的编辑将其删除。如果这是有意的,那就没关系,但如果不是,您可以查看差异并恢复编辑。 - T.J. Crowder
我其实正在同时编辑它,以编写--prefixpostfix--,我认为这是相当容易理解的。我根本没有试图破坏你的编辑 - 我真的很喜欢你的第一个编辑 - 我不知道你可以使用基本的HTML标签,这让我摆脱了那个荒谬的*和-的情况。我认为你最后一次编辑的句子结构并不是很容易理解,但如果你再次编辑我的答案,这样你就可以得到你的改进的功劳,我会很高兴的 :) - SimpleVar
1
@ Yorye:如果你认为它没有帮助,那就算了吧。回答很好,只是我希望我们可以使用颜色,因为粗体并不能完全表达。 (我完全看不出为什么要点踩。) - T.J. Crowder
@T.J.Crowder 感谢您的支持 :) 我相信通过这里的加粗,另一个答案中的括号以及其他人的解释,OP将很容易理解这行代码,这最终是目的。再次感谢! - SimpleVar
有趣的是,一点代数运算表明这对于所有(合理的)x值都适用。(x) - ((x-1)-1) = (x) - (x-2) = x - x + 2 = 2 - inspectorG4dget
1
@inspectorG4dget 你说的“合理”是指远离 int.MinValue 和 int.MaxValue 的边缘吗?嘿嘿,是的。结果发现 X -(X-2)总是等于2。 - SimpleVar

5

好的,很简单:

让我们添加括号:

z = ( x-- ) - ( --x )

^^ 这就是编译器在标记化后看到您的代码的方式。

编译器从左到右计算等式(右部分)

现在,

x-- 等于从 x 中弹出值,然后将其递减并将值重新推回内存。好的,让我们这样做:

X 的当前值为 3,递减后为 2,所以在等式中我们得到了 3,但 X 将包含新值 2。

--x 等于递减 X 值,然后将该值弹出到等式中。让我们这样做:

X 的当前值为 2(因为前一个操作使其递减),现在我们想再次减少它。2-1=1,懂了吗。

现在,回到整个方程式:z = (3) - (1) = 2


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接