变量的方法级别范围
我是Java的初学者,在练习时遇到了这些错误,所以我想澄清它们,而不是试图记住错误以避免它们。变量的方法级别范围
public static int gcd(int a, int b) {
if(a > b) {
int result = a % b;
}
return result;
}
这产生了我a cannot find symbol
,但我想我初始化结果作为if
循环int
?
public static int gcd(int a, int b) {
if(a > b) {
int result = a % b;
return result;
}
}
为此,如果我在if循环中返回结果,它是错误的,因为它继续循环?
public static int gcd(int a, int b) {
int result = 0;
if(a > b) {
result = a % b;
}
return result;
}
在if
循环之外声明结果错误消失。这是为什么?
局部变量被称为当地,因为他们只能在块他们在被创造。
块是内部{ ... }
任何代码中可以看出。
让我们看看你在第一个版本的*:
public static int gcd(int a, int b) { // first block starts here
if(a>b) { // second block, an inner block, starts here
int result=a%b;
} // second block ends here
return result;
} // first block ends here
所以,在新建秒块的局部变量,并尽量在室外使用阻断,即在第一个块。这正是编译器所抱怨的。变量result
种消失后第二个块完成。
但是这个变量结果我创建,我只希望它们在if循环内。所以我在if循环内创建。 – user2148463 2013-03-10 06:33:45
@ user2148463如果在循环内部创建变量。它不会在该循环之外访问。 – 2013-03-10 06:35:53
实际上,你确实希望在if区以外,因为你从if区以外返回它。换句话说,你从外部块访问它,外部块需要知道变量。 – 2013-03-10 06:36:32
这与变量result
的范围有关。当它位于if
内时,当您离开if
(}
)时,它停止存在。
public static int gcd(int a, int b){
int result = 0;
if (a > b) {
result = a % b;
}
return result;
} // result exists until here
public static int gcd(int a, int b){
if (a > b) {
int result = a % b;
} // result exists until here
return result; // result doesn't exist in this scope
}
基本上可以只在那里它们被限定的代码块内访问变量的代码块是由大括号{ ... }
定义。
您的函数的替代实现可以完全没有变量。
public static int gcd(int a, int b){
if (a > b) {
return a % b;
}
return 0;
}
我现在看到了图片。非常清楚。非常感谢!(: – user2148463 2013-03-10 06:35:29
@ user2148463没问题,请确保通过点击打勾关闭问题。 – 2013-03-10 06:36:08
@Tririar,在计算器中不会调用* closing * ,但*接受答案*。问题在接受答案后仍然开放。 – 2013-03-10 06:38:26
的原因第一个错误是,if
语句建立变量一个新的上下文。 result
的声明在if
的正文之外是不可见的。
在第二种情况下,可能无法满足if
条件,在这种情况下,函数将不会执行return
语句。这也是一个错误,因为函数需要为每个执行路径返回一个int
(或抛出一个异常)。
此外,如果不是一个循环。这是一个条件。循环是一个构造,允许您重复一个操作的数量或期望的时间... – Thihara 2013-03-10 06:38:55