2.4.3 用break、continue和return提前退出循环
除了让循环条件不满足之外,还有一些其他的方法退出循环。C++程序员通常使用break、continue和return语句来提前结束循环。Java程序员也是使用同样的语句退出循环。这些语句对循环提供了更多的控制,甚至能够增进循环的性能。
例如,假设你正在做一个空间飞行游戏,在这个游戏中,你必须摧毁外星飞船来保护宇宙。外星飞船有几种类型,当被摧毁时,不同的船只对应不同的分值。每一级结束的时候,你想对每个已摧毁的价值至少500分值的船只给予10分的奖励。摧毁每个外星飞船的时候,相应的分值会增加到一个表中。在一个特殊使命结束时,得到如下的分值表:
500, 750, 100, 10, 10, 2000, 10, 10, 200, 500, 10, 500, 500, 100, 10, 500
通过这个表能够很容易地对每个不小于500的分值给予10分的奖励,但是当玩家摧毁2000个或更多敌方飞船时情况如何呢?这可能会在判断很多小于500的分值上浪费大量的时间。
计算奖励的一个更好的办法是使分值表从高到低有序排列,如下:
2000, 750, 500, 500, 500, 500, 500, 200, 100, 100, 10, 10, 10, 10, 10, 10
现在当你用到这个表时,只要发现小于500的分值就可以停止查找,因为所有在其后的值也一定小于500。下面的代码片段实现了这一点:
// 创建一些存起来的数据
int[ ] values = { 2000, 750, 500, 500, 500, 500, 500, 200, 100, 100, 10,
10, 10, 10, 10, 10 }
int bonusEarned = 0; //奖励计数器
for( int i = 0; i < values.length; i++)
{
// 对于500以上的分数给10分奖励
if(values[i] >= 500)
{
bonusEarned += 10;
}
// 只要发现一个低分,退出循环
else break;
}
// 输出最后的分值
System.out.println(bonusEarned);
如果运行上面的代码,会发现使用已有数据会得到70分奖励。配盘中有一个与之相似的例子(名为BreakTest),这个例子有一个充满随机数的大型数组,并且分别根据未排序数组以及排序后的数组计算奖励分值。注意Arrays.sort方法自然地将整数从高到低排序,因此,循环必须从后到前来重复读数组。






