用于环路Java短路混淆
此代码使用&&;处于for循环状态。它重复4次,得到的结果是“sum=20”。我认为它会重复5次,因为&&;条件为true,当右侧变为false时,循环结束
基本上,我的问题是,为什么它要迭代4次而不是5次,使“和=30”?谢谢
`int[] lst = {1,2,3,4,5,4,3,2,1};
int sum = 0;
for (int frnt = 0, rear = lst.length - 1;
frnt < 5 && rear >= 5; frnt++, rear--){
sum = sum + lst[frnt] + lst[rear];
System.out.println("frnt: " + frnt);
System.out.println("rear: " + rear);
System.out.println();
}
System.out.print(sum);`
# 1 楼答案
只有当整个表达式的值已知时,才会发生短路
对于逻辑AND运算符(&;&;)如果左侧已经为false,那么右侧的计算结果是什么并不重要,因为整个表达式已经为false。如果左侧为true,则右侧的值决定表达式的值。因为在评估之前它是未知的,所以必须对它进行评估
对于逻辑OR运算符(| |),则相反。如果表达式的左侧为真,那么无论右侧是什么,表达式都为真,因此不计算右侧。如果左侧为false,则表达式的值取决于右侧,因此必须对其求值
# 2 楼答案
问题源于
for
条件。在循环的最后一次迭代中,frnt = 4
和rear = 4
。条件frnt < 5
起作用,但rear >= 5
为false,使整个表达式为false,从而打破了循环。关于每次迭代后的变量,请参见下文(请注意,该表显示了每次循环体运行并修改变量后的变量)两个计数器在中间相遇在4,但条件指定^ {CD5>}。为了获得正确的行为,将条件更改为:
frnt < 5 && rear >= 4
,或者更清楚地说,更改为frnt <= 4 && rear >= 4
# 3 楼答案
frnt
{0
-8
-true && true -> true
1
-7
-true && true -> true
2
-6
-true && true -> true
3
-5
-true && true -> true
4
-4
-true && false -> false
一切都是对的,4次迭代,仅此而已
我想你误解了短路原理。如果是&&;操作员:短路原理如下:
由于A&&;只有当两个操作数都是
true
时,B操作才是true
。然后在计算操作数A并发现它是false
时,无需计算和检查操作数B的值。如果操作数A是true
,则始终计算操作数B。所以在你的例子中,当循环中断时,操作数A是4 < 5
,而操作数B是4 >= 5
。因此,由于操作数A是true
,因此必须对操作数B进行求值和检查,这种情况下,由于两个操作数都进行了求值,所以不存在短路。如果操作数A为false
且未计算操作数B,则会出现短路情况