[英]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)告訴我,在這段代碼中,變量n
和length
的初始化是多余的,但是,必須初始化maxLength
,如果我不這樣做,它就不會編譯。
為什么這樣? 這里的maxLength
與n
和length
什么不同?
在所有代碼路徑上,在嘗試從中讀取值之前,先初始化n
和length
。 無論發生什么,最初分配給它們的值都不會被使用,因為在你需要它之前你會用其它東西覆蓋它。
maxLength
雖然在為其分配新值之前讀取,但是當您執行length > maxLength
比較時,或者在return
,如果跳過for
循環。 由於它在第一遍中沒有值,因此您需要為其提供一個起始值。
maxLength
不同,因為它的值在for循環之外使用。 如果永遠不輸入for循環,則永遠不會初始化maxLength
(如果在開始時刪除初始化),則return語句將變為無效。
保證在訪問它們之前分配其他兩個變量( n
和length
),即使在刪除初始初始化之后也是如此。 它們不在for循環之外訪問,而在for循環內, if
和else
子句都是從初始化length
開始的。 n
僅由if
cluase初始化,但只能在該子句中訪問。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.