簡體   English   中英

Java 中的隱式類型轉換是否會影響操作順序?

[英]Does an implicit typecast in Java have an effect on the order of operations?

我的代碼中有一個片段,其中一個看起來應該評估為“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) (顯然是 false)時,如果代碼為else if (l + 2 * m < i) ,則計算結果為true else if (l + 2 * m < i) 請注意,2L 已替換為 2 (int)。 我什至在else if之后直接使用了 print 語句來測試boolean l + 2 * m < i的值並且會得到true

else if條件括號和隱式類型轉換導致關系錯誤地評估為true 在其他情況下,它會正確計算。 什么可能導致這個問題?

為了簡化你的問題,

看來你是在暗示

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

會打印真。

output

false

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM