2011-08-27 11 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에서는 false입니다. 명시 적으로 초기화되지 않은 멤버 변수는 항상 값 0을 가지며 로컬 변수를 초기화하지 않으면 OP가 감지 될 때 컴파일 오류가 발생합니다. 따라서 현지인을 초기화하지 않는 것이 좋지 않습니다. 컴파일러 오류입니다. 그리고 멤버를 초기화하지 않는 것은 좋지 않을 수도 있지만 순전히 가독성 문제이며 0이 아닌 변수와 아무 관련이 없습니다. – sepp2k

2

클래스의 필드는 기본적으로 값 (null, 0, false 등)을 갖습니다. 그러나 로컬 변수는 그렇지 않으므로 명시 적으로 정의해야합니다. 많은 사람들이 필드를 명시 적으로 설정하지 않는 것에도 동의하지 않습니다. 설정을 지정하는 것은 독자가 실제로 값을 설정하는 것을 잊어 버리지 않고 값으로 설정하려고 생각했기 때문에 잠재적으로 행 아래쪽에 버그가 발생할 수 있기 때문입니다.

관련 문제