[英]java unexpected and unaccountable break of loop
让我们比较这两种方法...
public void fooTestOk() {
boolean ret = true;
for (int i = 0; i < 10; i++) {
boolean r;
if (fooIf(i))
r = fooMethod(i);
else
r = fooMethod(i);
ret = ret && r;
}
System.out.println("ret "+ret);
}
它给了我以下预期的输出(我减少了换行符):
0 1 2 3 4 5 6 7 8 9 ret false
但是这种方法
public void fooTestFail() {
boolean ret = true;
for (int i = 0; i < 10; i++) {
if (fooIf(i))
ret = ret && fooMethod(i);
else
ret = ret && fooMethod(i);
}
System.out.println("ret "+ret);
}
只给我这个输出,循环必须中断! 也不例外!
0 ret false
有人可以解释为什么在这种情况下循环被终止而没有任何错误吗?
这是我的fooIf
和fooMethod
函数:
public boolean fooIf(int i) {
return i % 2 == 0;
}
public boolean fooMethod(int i) {
System.out.println(i);
return i == 5;
}
&&
短路。 这意味着,如果在a && b
, a
计算结果为false
,则不再对b
进行计算。 因此,循环不会中断。 发生的事情是没有调用fooMethod
,因为ret
在第一次迭代后就为false
。
您的函数实际上没有中断,因为&&
短路,因此不再调用fooMethod(i)
。
这意味着仅在需要时才评估第二个表达式。 如果您有false && x
,则不必知道x
值是什么,因为结果将始终为false
。
在您的情况下,第一次迭代后ret
变为false
。 因此, fooMethod(i)
的返回值无关紧要,并且不调用该方法。
尝试更改ret = ret && fooMethod(i);
ret = ret & fooMethod(i);
。 结果将与您的第一种情况相同。
您的声明ret = ret && fooMethod(i);
将ret =设置为false,因为当i = 0(第一次通过循环)时,fooMethod(i)返回false。
fooMethod(i)在屏幕上显示0,返回假值,并设置ret = ret && fooMethod(i)
,这与说'ret = true && false'表示返回false相同。
在循环的第一次迭代后,一旦ret为false,则程序无需运行fooMethod,因为无论返回什么结果,结果都将为false,因为ret已经为false:
ret = false && //doesn't matter what else, ret is false
这意味着您的循环第一次运行,打印出0,此后的每次迭代都无法更改ret的值。 一旦完成,它会打印ret和false
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.