2

我是Java的初学者,在练习时遇到了这些错误,所以我想澄清它们,而不是试图记住错误来避免它们。

public static int gcd(int a, int b) {
  if(a > b) {
    int result = a % b;
  }
  return result;
}

这会产生我a cannot find symbol,但我认为我将结果初始化为int循环if

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在循环之外声明结果时错误消失。这是为什么?

4

3 回答 3

4

这与变量的范围有关result。当它在里面if时,当你离开if(the }) 时它就不再存在了。

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;
} 
于 2013-03-10T06:33:39.053 回答
1

局部变量被称为局部变量,因为它们只能在创建它们的内看到。

块是里面的任何代码{ ... }

让我们看看您在第一个版本中拥有的块:

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种类消失了。

于 2013-03-10T06:33:02.343 回答
0

第一个错误的原因是该if语句为变量建立了新的上下文。的声明result在 的主体之外不可见if

在第二种情况下,if可能无法满足条件,在这种情况下,函数将不会执行return语句。这也是一个错误,因为函数需要int为每个执行路径返回一个(或抛出异常)。

于 2013-03-10T06:34:18.243 回答