让我们比较这两种方法......
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;
}
答案 0 :(得分:9)
&&
短路。这意味着如果在a && b
中,a
评估为false
,则不再评估b
。所以,循环不会破坏。发生的事情是fooMethod
未被调用,因为ret
在第一次迭代后获得false
。
答案 1 :(得分:1)
你的功能实际上没有中断,fooMethod(i)
不再被调用,因为&&
是短路的。
这意味着第二个表达式仅在需要时进行评估。如果您有false && x
,则无需知道x
的值,因为结果始终为false
。
在您的情况下,ret
在第一次迭代后转为false
。因此fooMethod(i)
的返回值无关紧要,并且不调用该方法。
尝试将ret = ret && fooMethod(i);
更改为ret = ret & fooMethod(i);
。
结果与第一种情况相同。
答案 2 :(得分:1)
你的陈述ret = ret && fooMethod(i);
将ret =设置为false,因为fooMethod(i),当i = 0(第一次循环)时返回false。
fooMethod(i)在屏幕上打印0,返回错误值并设置ret = ret && fooMethod(i)
,这与说'ret = true&amp;&amp;&amp; false`返回false。
在循环的第一次迭代之后,一旦ret为false,程序就不需要运行fooMethod,因为无论返回什么,结果都将为false,因为ret已经为假:
ret = false && //doesn't matter what else, ret is false
这意味着你的循环第一次运行,打印出0并且此后的每次迭代都无法更改ret的值。一旦完成,它会打印ret和false