Java中循环内外定义变量的差异:count变量放外部为何失效?
质数统计代码的变量作用域问题
先看两段用于统计1到A之间质数数量的Java代码:
可行的代码(count定义在外层循环内)
public int solve(int A) { int primeCount = 0; for (int i =2; i <=A; i++){ int count = 0; // 定义在外层循环内,运行正常 for(int j = 1; j<=A; j++){ if(i%j == 0){ count++; } } if(count==2){ primeCount++; } } return primeCount; }
不可行的代码(count定义在外层循环外)
public int solve(int A) { int count = 0; // 定义在外层循环外,无法得到正确结果 int primeCount = 0; for (int i =2; i <=A; i++){ for(int j = 1; j<=A; j++){ if(i%j == 0){ count++; } } if(count==2){ primeCount++; } } return primeCount; }
为什么第一段可行,第二段不行?
核心问题不是父级作用域变量能不能被访问——第二段的count确实能被内层循环访问,问题出在变量的重置逻辑:
- 第一段中,
count定义在外层循环的代码块内,每一轮外层循环(也就是每判断一个新的数i是否为质数时),count都会被重新初始化int count = 0;,这样统计每个i的因数个数时,都是从0开始累加,统计完成后判断是否等于2(质数的定义:仅能被1和自身整除,共2个因数),逻辑完全正确。 - 第二段中,
count定义在整个方法的作用域里,只有第一次初始化时是0。当判断完第一个数i=2后,count的值变成2,后续再判断i=3、4...时,count不会被重置,而是在之前的数值上继续累加,导致count只会越来越大,永远不会再等于2,后续的质数根本不会被统计到,最终结果自然错误。
内容的提问来源于stack exchange,提问作者ASHIM ROY
相关产品推荐
相关产品推荐

