我的代码中有一个片段,其中看起来应该评估为“false”的语句实际上返回 true。
long composite = -1L;
ArrayList<Long> primes = new ArrayList<Long>();
ArrayList<Long> squares = new ArrayList<Long>();
squares.add(1L);
primes.add(2L);
primes.add(3L);
for (long i = 4; composite == -1L; i++) {
double sqrt_max = Math.sqrt((double) i);
if (sqrt_max == (int) sqrt_max) squares.add(i);
if (i % 2 == 0) continue;
boolean prime = true;
for (int j = 0; primes.get(j) <= sqrt_max; j++) {
if (i % primes.get(j) == 0) {// number is not prime
prime = false;
break;
}
}
if (prime) { // number is prime
primes.add(i);
}
else {
boolean conjTrue = false;
for (Long l : primes) {
ListIterator<Long> it = squares.listIterator(squares.size() - 1);
while (it.hasPrevious()) {
long m = it.previous();
if (l + 2L * m == i) {
conjTrue = true;
break;
}
else if (l + 2L * m < i) break;
}
if (conjTrue) break;
}
if (!conjTrue) composite = i;
}
}
System.out.println("\nAnswer: " + composite);
就目前而言,这段代码工作正常(我完成了调试),但我发现了一个我无法解释的问题,我想学习。
关系语句else if (l + 2L * m < i)
,当变量评估为(19 + 2 * 9 < 27)
-> (38 < 27)
(显然是错误的)时,将评估true
代码是否为else if (l + 2 * m < i)
。注意 2L 被替换为 2 (int)。我什至在 之后直接使用 print 语句else if
来测试boolean
l + 2 * m < i
and 的值会得到true
.
在else if
条件括号内和隐式类型转换导致关系错误地评估为true
. 在其他情况下,它会正确计算。什么可能导致这个问题?