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的值没有影响。
理解这种逻辑的最佳方法是什么?
答案 0 :(得分:13)
a++ > 0
返回false,因为a++
返回先前的a
(0)值。
因此b-- < 0
根本没有评估,因为&&
是一个短路算子。仅当左操作数为true
时才会评估右操作数。
--c < 0
,因为||
运算符的第一个操作数是false
,因此必须计算第二个操作数。
评估d
后,a
的值为1
,因为a
已递增。 b
仍为0
,因为b--
未执行。自c
执行以来,-1
为--c
。
由于d
为true
,因此--c < 0
为true
。
答案 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);
我认为你理解完整的逻辑。