2011-08-27 126 views
2

我正在做關於Ackermann函數的書練習。錯誤:變量可能未被初始化

雖然我有一個問題。如果我聲明結果但不初始化,編譯器會抱怨「變量結果可能未被初始化」。

int result; 

當我將它設置爲默認爲0時,它不會抱怨。

int result = 0; 

我認爲,當一個聲明類型爲int的變量時,它自動默認爲0。

下面是完整的代碼:

public class Ackermann { 
    public static int ack(int m, int n) { 
    int result = 0; 
    //int result; 
    if (m == 0) 
     result = n + 1; 
    else if(m > 0 && n == 0) 
     result = ack(m-1, 1); 
    else if(m > 0 && n > 0) 
     result = ack(m-1, ack(m, n-1)); 
    return result; 
    } 

    public static void main(String[] args) { 
     System.out.println(ack(3, 3)); 
    } 

} 

回答

6

局部變量不使用默認值初始化。請參閱language specs瞭解實際情況。

3

不初始化變量是非常糟糕的做法。有一個流行的笑話適合你的情況:約翰從他的母親得到3個蘋果,從他父親得到5個蘋果。約翰有多少蘋果?如果你不是很好的程序員,你的答案將是8.如果你是一位優秀的程序員,你會回答我們不知道蘋果從他母親那裏得到蘋果之前有多少蘋果。請記住:始終初始化變量並且不要假設它們將爲0.

+2

您似乎暗示未初始化的int變量可能具有非0值。這是錯誤的(無論如何Java)。未被顯式初始化的成員變量將始終具有值0,並且不會初始化局部變量,只會導致OP注意到的編譯錯誤。所以不初始化當地人是不錯的做法 - 這是一個編譯器錯誤。不初始化成員可能是不好的做法,但這純粹是一個可讀性問題,與可能不是0的變量無關。 – sepp2k

2

類中的字段默認爲值(null,0,false等)。但是局部變量不會,您必須明確地定義它們。很多人甚至不同意不明確地設置字段,因爲設置它會向讀者表明您實際上已經考慮將其設置爲一個值,而不是忘記設置它,因此可能會導致錯誤。