为何while循环执行结果超出判断条件?输出至9.571而非9.5
问题原因分析:循环执行顺序的逻辑误区
这是一个典型的循环执行顺序导致的误解,我们一步步拆解你的代码执行流程,就能明白为什么会打印出9.571428571428571:
首先明确你的循环逻辑:
- 先判断
avg <= 9.5是否成立 - 如果成立,就执行循环体(添加元素、重新计算avg、打印新avg)
- 循环体执行完后,再次回到判断条件,重复上述步骤
我们按你的输出反推初始列表的状态(假设初始列表的sum和size计算出第一个avg是9.0),一步步走:
- 初始状态:
avg = 9.0,检查条件9.0 <=9.5→ 成立,进入循环体- 添加10到列表,计算新avg=9.25,打印
9.25
- 添加10到列表,计算新avg=9.25,打印
- 回到条件判断:
9.25 <=9.5→ 成立,进入循环体- 添加10,计算avg=9.4,打印
9.4
- 添加10,计算avg=9.4,打印
- 回到条件判断:
9.4 <=9.5→ 成立,进入循环体- 添加10,计算avg=9.5,打印
9.5
- 添加10,计算avg=9.5,打印
- 回到条件判断:
9.5 <=9.5→ 成立(因为是小于等于),进入循环体- 添加10,计算新avg≈9.571428571428571,打印这个值
- 回到条件判断:
9.571... <=9.5→ 不成立,循环终止
核心问题
你误以为当avg等于9.5时循环会停止,但实际上:
- 循环的条件判断是在进入循环体之前,当avg=9.5时,条件
<=9.5是成立的,所以会执行完整个循环体的操作(包括添加元素、计算新avg、打印新值) - 只有当循环体执行完毕,再次回到条件判断时,才会发现新的avg已经超过9.5,此时才停止循环
修正方案
如果你希望在avg达到9.5时就停止,不再执行后续的添加和打印,有两种常见的调整方式:
方式1:修改循环条件为严格小于
把判断条件从avg <= k - 0.5改成avg < k - 0.5,这样当avg等于9.5时,条件不成立,不会进入循环体:
double avg = (double)ListUtil.sum(list)/list.size(); k =10; while (avg < k - 0.5) { // 改成严格小于 list.add(k); avg = (double) ListUtil.sum(list)/list.size(); System.out.println(avg); } // 可以额外打印最终的avg=9.5 System.out.println(avg);
方式2:调整循环内的执行顺序
先判断是否需要执行循环体,再决定是否打印,逻辑更直观:
double avg = (double)ListUtil.sum(list)/list.size(); k =10; System.out.println(avg); // 先打印初始值 while (true) { if (avg > k - 0.5) { break; } list.add(k); avg = (double) ListUtil.sum(list)/list.size(); System.out.println(avg); }
内容的提问来源于stack exchange,提问作者Nguyen
相关产品推荐
相关产品推荐

