Java找数组最大值时while循环不加break为何无输出?
代码逻辑说明
首先直接对应你的疑问给出结论:
- 你理解的第1点是正确的:程序运行时会先进入外层
for循环,再进入内层for循环 - 你理解的第2点存在偏差:
while是独立于两层for的循环结构,不是内层for循环里的单次比较步骤,它的条件判断、循环流转规则完全独立 - 你理解的第3点只有在加了
break的前提下才成立:条件成立时确实会把较大值赋给largest变量,但如果没有break,赋值完成后不会自动跳出while循环 - 你理解的第4点是错误的:
while语句执行完一次循环体后,不会直接回到外层for循环,而是会优先重新判断自身的循环条件,决定是否继续执行循环体
为什么不加break会没有输出
你写的while (nums[j] > nums[i])循环体内部,没有任何修改i、j取值,也没有修改数组元素的逻辑。如果删掉break,只要第一次判断条件为真进入循环,给largest赋值完成后,下一轮判断while条件时,nums[j]和nums[i]的值和上一轮完全一致,条件会永远成立,程序就会卡在这个无限死循环里,既不会继续执行内层、外层for循环的迭代,也走不到最终的return语句,自然不会输出任何结果。
加上break之后,while循环只要进入就会执行一次赋值,然后直接跳出当前while循环,回到内层for循环继续迭代j变量,等内层j遍历完一轮,再回到外层for循环迭代i变量,这时候的流转逻辑才和你最初的预想一致。
额外说明
你当前的实现本身存在逻辑缺陷,即使加了break也不能正确返回所有场景下的最大值:
- 初始值
largest设为0,如果传入的数组全是负整数,返回结果会错误 - 两层
for加while的结构完全冗余,找数组最大值只需要一次遍历即可,参考实现如下:
public int returnMax(int[] nums) { if (nums == null || nums.length == 0) { throw new IllegalArgumentException("传入数组不能为空"); } int largest = nums[0]; for (int num : nums) { if (num > largest) { largest = num; } } return largest; }
内容的提问来源于stack exchange,提问作者user10525734
相关产品推荐
相关产品推荐

