簡體   English   中英

為什么變量初始化是多余的?

[英]Why is variable initialisation redundant?

我已經在UVa Online Judge上解決了一個3 * N + 1問題(100),但這是我不明白的一件事,但它與Java有關,我想,不是算法本身。 所以這是代碼:

private static int maxCycleLength(int lo, int hi) {
        maxLength = 0;
        int n = 0;
        int length = 0;

    for (int i = lo; i <= hi; i++) {
        // It's the first time we're computing the cycle length for n
        if (lengths[i] == 0) {
            n = i;
            length = 1;
            while (n != 1) {
                if ((n % 2) == 0) {
                    n = n >> 1;
                    length++;
                }
                else {
                    n = 3 * n + 1;
                    n = n >> 1;
                    length += 2;
                }
            }
            lengths[i] = length;
        }
        // Otherwise we just look it up
        else
            length = lengths[i];

        // Check if the current cycle length is the maximum
        if (length > maxLength)
            maxLength = length;
    }
    return maxLength;

我不明白:我的IDE(IDEA)告訴我,在這段代碼中,變量nlength的初始化是多余的,但是,必須初始化maxLength ,如果我不這樣做,它就不會編譯。

為什么這樣? 這里的maxLengthnlength什么不同?

在所有代碼路徑上,在嘗試從中讀取值之前,先初始化nlength 無論發生什么,最初分配給它們的值都不會被使用,因為在你需要它之​​前你會用其它東西覆蓋它。

maxLength雖然在為其分配新值之前讀取,但是當您執行length > maxLength比較時,或者在return ,如果跳過for循環。 由於它在第一遍中沒有值,因此您需要為其提供一個起始值。

maxLength不同,因為它的值在for循環之外使用。 如果永遠不輸入for循環,則永遠不會初始化maxLength (如果在開始時刪除初始化),則return語句將變為無效。

保證在訪問它們之前分配其他兩個變量( nlength ),即使在刪除初始初始化之后也是如此。 它們不在for循環之外訪問,而在for循環內, ifelse子句都是從初始化length開始的。 n僅由if cluase初始化,但只能在該子句中訪問。

暫無
暫無

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

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