C# 如果x=3且z未赋值,为什么z=x--x的计算结果为2?

C# 如果x=3且z未赋值,为什么z=x--x的计算结果为2?,c#,javascript,C#,Javascript,如果x=3且z未分配, 为什么z=x----x的计算结果为2 我的教授现在正在讲课,我现在陷入了困境。不幸的是,没有人能解释它为什么会发生。在x--,x=3,之后是2。 在--x上,x=1,因为(从2)中的减法是预先进行的 因此,3-1=2。以下是操作顺序,为了更好地理解,对其进行了说明: x----x保持x的值(我们称之为tmpA)。tmpA为3 x----x减小x。现在是2 x----x减小x。现在是1 x--x保持x的值(我们称之为tmpB)。tmpB为1 x-----x根据计算值执行子

如果
x=3
且z未分配,
为什么
z=x----x
的计算结果为2

我的教授现在正在讲课,我现在陷入了困境。不幸的是,没有人能解释它为什么会发生。

在x--,x=3,之后是2。 在--x上,x=1,因为(从2)中的减法是预先进行的


因此,3-1=2。

以下是操作顺序,为了更好地理解,对其进行了说明:

  • 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
--prefix
表示递减将在计算表达式之前进行,而
postfix--
表示递减将在计算表达式之后进行。

好的,它非常简单:

让我们添加括号:

z=(x-)-(-x)

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

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

现在,

x--
等于弹出x的值,然后将其递减,并将该值推回内存。好的,我们开始吧:

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

--x
等于递减x值,然后将该值放入公式中。让我们开始吧:

X的当前值是2(因为之前的操作将其递减),现在我们要再次减小它。2-1=1,明白了


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

x在减量后减去x在减量前这是
C
还是这是
JavaScript
?请选择正确的标签。杜安:字体让它看起来很奇怪。有这样的代码行是非常糟糕的做法。有很多其他方法可以解释
x--
--x
的不同用法。没有人会写这样的东西,我不会用它来解释减量前后的变化,但我肯定会用它来看看学生们是否真的理解@Yorye的概念:我修改了最后一段,让它(我想)更清楚。你最新的编辑会将其删除。如果这是有意的,不用担心,但如果不是,你可能会查看差异并恢复编辑。我实际上是在同时编辑它来编码
--前缀
后缀--
,我认为这是可以理解的。我一点也不想破坏你的编辑-我真的很喜欢你的第一个-我不知道你可以使用基本的HTML标记,这让我摆脱了那种荒谬的*,和-。我不认为你上一次编辑的句子结构很容易理解,但如果你再次编辑我的答案,我会很高兴,这样你就可以为你的改进赢得荣誉:)@Yorye:不,如果你认为它没有帮助,那就别管它了。回答得好,我只是希望我们可以使用颜色,因为粗体字不太适合。(我完全看不出否决票的原因。)@T.J.Crowder谢谢你的支持:)我很确定,有了这里的粗体字、另一个答案中的括号以及其他人的解释,OP将很容易理解这行代码,这就是最终的目的。再次感谢@inspectorG4dget所说的“合理”是指距离int.MinValue和int.MaxValue的边缘相当远?呵呵,对。原来X-(X-2)总是2.plz优化你的答案。。。我仍然不感到好奇:C#能保证表达式的求值顺序吗?我们怎么知道后减量首先发生?@TorrentialCodeing因为是的,它“保证”了这一点。这就是它的工作方式,真的。前缀定义为操作前完成,后缀定义为操作后完成。@TorrentialCodeding关于排序:@VitalyDyatlov谢谢。从您链接到的MSDN文章中,“表达式中的操作数是从左到右求值的。”这回答了我的好奇心。