Java post增量和pre增量

时间:2017-12-11 09:02:12

标签: java increment

Java中的以下代码:

int a = 0, b = 0, c = 0;
boolean d = (a++ > 0 && b-- < 0) || --c < 0;

得出值:

a = 1, b = 0, c = -1 and d = true

我不明白为什么a = 1,因为它是一个后增量,也应该以与值b相同的方式做出反应。另外,如果我将b--更改为--b,它仍然对b的值没有影响。

理解这种逻辑的最佳方法是什么?

6 个答案:

答案 0 :(得分:13)

a++ > 0返回false,因为a++返回先前的a(0)值。

因此b-- < 0根本没有评估,因为&&是一个短路算子。仅当左操作数为true时才会评估右操作数。

评估

--c < 0,因为||运算符的第一个操作数是false,因此必须计算第二个操作数。

评估d后,a的值为1,因为a已递增。 b仍为0,因为b--未执行。自c执行以来,-1--c。 由于dtrue,因此--c < 0true

答案 1 :(得分:0)

比较时

a++不是>0,因此b部分不会被评估,也不会递增。

如果无法更改结果,则不评估&&||表达式的第二部分。首先&& false确定结果false

类似地,首先true确定||的结果(但不是此处)

答案 2 :(得分:0)

表达式运行后,a确实为1,因为后增量运算符随后被执行。

在表达式的评估期间,就表达式而言,a为0(但是对于其他代码,a现在为1),因此逻辑OR的第一部分,即逻辑AND,被评估为false和b后减法没有得到评估。

逻辑的第二部分或者然后运行,并且预递减执行以将c减少到-1,然后使得比较评估为真,因此d为真。

展开不同的子句以分隔变量并运行调试器,以便对正在发生的事情进行更具交互性的解释。

答案 3 :(得分:0)

当你写一个++ OR b--时,它会传递值&#39; a&#39;和&#39; b&#39;当前持有,然后修改变量。

所以你的表达很简单,

boolean d = (0 > 0 && 0 < 0) || -1 < 0;

现在在评估时,(0> 0&amp;&amp; 0&lt; 0&lt; 0) - &gt;第一个表达式返回false,并且您使用了短路AND运算符。如果没有必要,意义不要评估右侧。作为&amp;&amp; amp;的LHS返回false,b--不会被评估。

我们已经&#39;&#39;是真的。 记住,

表达式中的后增量 - &gt;首先分配当前值,稍后修改。

表达式中的预增量 - &gt;先修改,稍后再分配更新的值。

请参阅此链接以更好地了解短路运营商: Short-Circuit Explanation

答案 4 :(得分:0)

a ++有效地意味着a = a + 1 因此,a(= 0)的现有值用于评估表达式,稍后a的值递增。所以,a变为1。

关于为什么b = 0以及为什么-b具有与b--相同的效果,b的值由于&amp;&amp;而未改变。由于a ++&gt; 0不满足,下一个表达式b--&lt;不评估0并且b的值保持为0.&amp;&amp;表达式计算结果为false时停止评估,而||一旦语句评估为false,就停止评估。

答案 5 :(得分:-1)

请执行此代码..

int a = 0, b = 0, c = 0;
System.out.println("b = " + --b);
b=0;
System.out.println("b = " + b--);
System.out.println("a = " + a++);
a=0;
System.out.println("a = " + ++a);
System.out.println("c = " + c--);
c=0;
System.out.println("c = " + --c);
a=b=c=0;
boolean d = (a++ > 0 && --b < 0) || --c < 0;

System.out.println("d = " + d);

我认为你理解完整的逻辑。