Java中增量运算符的奇怪行为?

时间:2011-09-20 19:36:21

标签: java

我需要一些代码:

int m = 4;
int result = 3 * (++m);

int m = 4;
int result = 3 * (m++);

执行m为5,结果在第一种情况下为15,但在第二种情况下,m也是5,但结果是12.为什么会这样?它不应该至少是相同的行为吗?

我特别谈到优先规则。我一直认为这些规则表明,parantheses比一元运算符具有更高的优先级。那么,为什么首先评估的这些表达式是不是?

4 个答案:

答案 0 :(得分:7)

否 - 因为在第一种情况下,结果是3乘以“m增加后的值”,而在第二种情况下,结果是3乘以“m的初始值”在它增加之前“。

这是预增量(“增量,表达式的值是增量后的值”)和后增量之间的正常差异(“记住原始值,然后增加;表达式的值是原来的一个“)。

答案 1 :(得分:3)

不同之处在于将结果分配给m。 在第一种情况下,你基本上(不是它真正做的,但有助于理解)......

int result = 3 * (m=m+1);

在第二种情况下,你有

int result = 3 * m; m = m +1;

答案 2 :(得分:1)

将其视为“增量和获取”以及“获取和增加”。例如,请参阅AtomicInteger,其中包含incrementAndGet()getAndIncrement()方法。

答案 3 :(得分:1)

这是运算符的定义:m++计算结果为m,然后递增m。这是一个“后增量”。它周围的括号不会改变运算符求值变量的事实,并且之后也会增加它。