0

我的代码中有一个片段,其中看起来应该评估为“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 < iand 的值会得到true.

else if条件括号内和隐式类型转换导致关系错误地评估为true. 在其他情况下,它会正确计算。什么可能导致这个问题?

4

1 回答 1

2

为了简化您的问题,

看来你是在暗示

    Long l = 19L;
    Long m = 9L;
    long i = 27;
    System.out.println(l + 2L * m < i);

将打印真实。

输出

false
于 2022-02-09T02:06:52.583 回答