java 变量范围在这里如何工作?
How the java variable scope is working here?
我正在尝试一个示例问题陈述和正确的代码,它是这样的 -
import java.util.Scanner;
public class Sample {
private static Scanner scanner = new Scanner(System.in);
public static void main(String[] args) {
int m = 5, n = 5;
int dist = 0;
for(int i = 0; i < m; ++i) {
for(int j = 0; j < n; ++j) {
int value = scanner.nextInt();
if(value == 1) {
dist = Math.abs(i - 2) + Math.abs(j - 2);
}
}
scanner.nextLine();
}
System.out.println(dist);
}
}
这完美地给出了正确的答案。但是当我写代码时 -
import java.util.Scanner;
public class Sample {
private static Scanner scanner = new Scanner(System.in);
public static void main(String[] args) {
int m = 5, n = 5;
int i = 0, j = 0;
int dist = 0;
for(; i < m; ++i) {
for(; j < n; ++j) {
int value = scanner.nextInt();
if(value == 1) {
dist = Math.abs(i - 2) + Math.abs(j - 2);
}
}
scanner.nextLine();
}
System.out.println(dist);
}
}
答案总是 0。
对于示例输入 -
0 0 0 0 0
0 0 0 0 1
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
正确答案是 3,我得到 3 而 运行 第一段代码。但不是 运行 第二段代码。
问题是变量 j
没有重置为 0
。
正确的代码是:
import java.util.Scanner;
public class Sample {
private static Scanner scanner = new Scanner(System.in);
public static void main(String[] args) {
int m = 5, n = 5;
int i = 0;
int dist = 0;
for(; i < m; ++i) {
int j = 0; // <== this line was missing
for(; j < n; ++j) {
int value = scanner.nextInt();
if(value == 1) {
dist = Math.abs(i - 2) + Math.abs(j - 2);
}
}
scanner.nextLine();
}
System.out.println(dist);
}
}
如果您不知道,请查看 for
语句在 https://docs.oracle.com/javase/tutorial/java/nutsandbolts/for.html
中的工作原理
在第一段代码中,每次代码退出并重新启动内循环时,变量 j 都会重置回 0。在第二段代码中,这并没有发生。逐步查看变量存储的内容可能会有所帮助。我在内部循环中添加了以下行并注释掉了用户输入部分以用于调试目的:
System.out.println("( " + i + " " + j + ")");
对于第一个例子,打印:
( 0 0)
( 0 1)
( 0 2)
( 0 3)
( 0 4)
( 1 0)
( 1 1)
( 1 2)
( 1 3)
( 1 4)
( 2 0)
( 2 1)
( 2 2)
( 2 3)
( 2 4)
( 3 0)
( 3 1)
( 3 2)
( 3 3)
( 3 4)
( 4 0)
( 4 1)
( 4 2)
( 4 3)
( 4 4)
然而对于第二个例子它打印:
( 0 0)
( 0 1)
( 0 2)
( 0 3)
( 0 4)
本质上,在第二个示例中,不会为外循环的每次迭代重置 j。如果你在其他地方添加更多的 print 语句,例如在外循环而不是内循环中,范围将变得更加清晰。重要的是要注意外循环仍然是 运行 5 次,我们只是没有证据表明在第一次通过内循环后打印语句变得无法访问。
另一种方法可以是以下重置变量 j 的方法,如前所述
public class Sample {
private static Scanner scanner = new Scanner(System.in);
public static void main(String[] args) {
int m = 5, n = 5;
int i = 0, j = 0;
int dist = 0;
for(; i < m; ++i, j = 0) {
for(; j < n; ++j) {
int value = scanner.nextInt();
if(value == 1) {
dist = Math.abs(i - 2) + Math.abs(j - 2);
}
}
scanner.nextLine();
}
System.out.println(dist);
}
}
我正在尝试一个示例问题陈述和正确的代码,它是这样的 -
import java.util.Scanner;
public class Sample {
private static Scanner scanner = new Scanner(System.in);
public static void main(String[] args) {
int m = 5, n = 5;
int dist = 0;
for(int i = 0; i < m; ++i) {
for(int j = 0; j < n; ++j) {
int value = scanner.nextInt();
if(value == 1) {
dist = Math.abs(i - 2) + Math.abs(j - 2);
}
}
scanner.nextLine();
}
System.out.println(dist);
}
}
这完美地给出了正确的答案。但是当我写代码时 -
import java.util.Scanner;
public class Sample {
private static Scanner scanner = new Scanner(System.in);
public static void main(String[] args) {
int m = 5, n = 5;
int i = 0, j = 0;
int dist = 0;
for(; i < m; ++i) {
for(; j < n; ++j) {
int value = scanner.nextInt();
if(value == 1) {
dist = Math.abs(i - 2) + Math.abs(j - 2);
}
}
scanner.nextLine();
}
System.out.println(dist);
}
}
答案总是 0。 对于示例输入 -
0 0 0 0 0
0 0 0 0 1
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
正确答案是 3,我得到 3 而 运行 第一段代码。但不是 运行 第二段代码。
问题是变量 j
没有重置为 0
。
正确的代码是:
import java.util.Scanner;
public class Sample {
private static Scanner scanner = new Scanner(System.in);
public static void main(String[] args) {
int m = 5, n = 5;
int i = 0;
int dist = 0;
for(; i < m; ++i) {
int j = 0; // <== this line was missing
for(; j < n; ++j) {
int value = scanner.nextInt();
if(value == 1) {
dist = Math.abs(i - 2) + Math.abs(j - 2);
}
}
scanner.nextLine();
}
System.out.println(dist);
}
}
如果您不知道,请查看 for
语句在 https://docs.oracle.com/javase/tutorial/java/nutsandbolts/for.html
在第一段代码中,每次代码退出并重新启动内循环时,变量 j 都会重置回 0。在第二段代码中,这并没有发生。逐步查看变量存储的内容可能会有所帮助。我在内部循环中添加了以下行并注释掉了用户输入部分以用于调试目的:
System.out.println("( " + i + " " + j + ")");
对于第一个例子,打印:
( 0 0)
( 0 1)
( 0 2)
( 0 3)
( 0 4)
( 1 0)
( 1 1)
( 1 2)
( 1 3)
( 1 4)
( 2 0)
( 2 1)
( 2 2)
( 2 3)
( 2 4)
( 3 0)
( 3 1)
( 3 2)
( 3 3)
( 3 4)
( 4 0)
( 4 1)
( 4 2)
( 4 3)
( 4 4)
然而对于第二个例子它打印:
( 0 0)
( 0 1)
( 0 2)
( 0 3)
( 0 4)
本质上,在第二个示例中,不会为外循环的每次迭代重置 j。如果你在其他地方添加更多的 print 语句,例如在外循环而不是内循环中,范围将变得更加清晰。重要的是要注意外循环仍然是 运行 5 次,我们只是没有证据表明在第一次通过内循环后打印语句变得无法访问。
另一种方法可以是以下重置变量 j 的方法,如前所述
public class Sample {
private static Scanner scanner = new Scanner(System.in);
public static void main(String[] args) {
int m = 5, n = 5;
int i = 0, j = 0;
int dist = 0;
for(; i < m; ++i, j = 0) {
for(; j < n; ++j) {
int value = scanner.nextInt();
if(value == 1) {
dist = Math.abs(i - 2) + Math.abs(j - 2);
}
}
scanner.nextLine();
}
System.out.println(dist);
}
}