我正在做关于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));
}
}
答案 0 :(得分:6)
未使用默认值初始化局部变量。请参阅language specs了解实际情况。
答案 1 :(得分:3)
不初始化变量是非常糟糕的做法。有一个流行的笑话适合你的情况:约翰从他母亲那里得到3个苹果,从他父亲得到5个苹果。约翰有多少苹果?如果你不是优秀的程序员,你的答案将是8.如果你是一名优秀的程序员,你会回答我们不知道在从他母亲那里获得苹果之前有多少苹果已经有约翰。请记住:始终初始化变量,并且不要假设它们为0。
答案 2 :(得分:2)
类中的字段默认为值(null,0,false等)。但是,局部变量没有,您必须明确定义它们。很多人甚至不同意不明确设置字段,因为设置它会向读者显示您实际上已经考虑将其设置为值而不是忘记设置它,因此可能会导致某个地方出现错误。