2013-02-11 25 views
-4

切入正题,答案是“s是20,t不能确定”。 我了解s是20的部分,但为什么t不能确定? 请帮帮我!考虑下面的代码:“int s = 20; int t = s ++ + --s;”。 s和t的值是什么?

+4

你在哪里找到你给的答案吗? – 2013-02-11 06:57:43

+1

't'可以确定:http://ideone.com/6ja0Kv – 2013-02-11 06:57:58

+2

您是否想过,哦,我不知道,试试看看? “不能确定”是......废话。 – 2013-02-11 06:59:22

回答

2
int s = 20; 
int t = s++ + --s; 

工作:增量(增量后)s到21(当前值20)+递减(递减)s到20(当前值20)。

So, t=20+20; 
And s =20; 

考虑到优先级和圆括号后,Java保证表达式将从左到右进行评估。例如,要评估eat()+ drink() - beMerry(),Java将首先评估eat(),然后drink(),然后执行加法,然后评估beMerry(),最后执行减法。 eat()在drink()之前被评估,因为eat()在drink()的左边,并且表达式从左到右被评估。这种保证是重要的,因为eat()和drink()的调用可能有副作用,如果以相反的顺序调用,副作用会有所不同。

+1

你可能想解释一个小_why_你正在计算,因为你这样做(即从左到右,而不是左到的例子) – 2013-02-11 07:28:45

+0

@JoachimIsaksson我编辑了我的答案,如你所说。谢谢 – 2013-02-11 10:07:29

0

this

由于递增/递减操作者修改其操作数,使用的 这样的操作数多于一次相同的表达式中可以产生 不确定的结果。例如,在诸如x - ++ x的表达式中,不应以什么顺序执行减法运算符和增量运算符 ,这是不清楚的。当编译器应用 优化时,这种情况会变得更糟,这可能会导致 操作的执行顺序与 程序员的预期不同。

现在,你的答案应该很清楚。 在我看来,t的值可能因编译器/优化而异。

下面是更多的一些信息: http://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html#Sequence-Points-Constrain-Expressions

+3

这个答案适用于C/C++,但不适用于Java。 http://stackoverflow.com/a/4978933/477878 – 2013-02-11 07:12:30

相关问题