while循环
在循环控制中,不要使用浮点值来比较值是否相等。因为浮点值都是某些值的近似值,使用它们可能导致不精确的循环次数和不准确的结果,例如下面的代码:
double item = 1;
double sum = 0;
while(item != 0){
sum += item;
item -= 0.1;
}
System.out.println(sum);
//1+0.9+0.8+...+0.1
因为浮点数在算术上是近似的,所以不能确保item会变成真正的0。从表面上看,这个循环似乎没有问题,但实际上他是一个无限循环。
输入和输出重定向
如果要输入大量的数值,那么从键盘上输入时非常繁琐的事。可以将这些数据用空格隔开,保存在一个名为input.txt的文本文件中,然后使用下面的命令运行这个程序:
java SentinelValue < input.txt
这个命令称为输入重定向。程序从文件input.txt中读取输入,而不是让用户在运行时从键盘输入数据。类似的,还有输出重定向,输出重定向将输出发送给文件,而不是将它们显示在控制台上。输出重定向的命令为:
Java ClassName > output.txt
可以在同一命令中同时使用输入重定向和输出重定向。例如,下面的命令从文件input.txt中获取输入,并将输出发生给文件output.txt:
java SentinelValue <input.txt> output.txt
do-while循环
如果循环中的语句至少需要执行一次,建议使用do-while循环。如果使用while循环,那么这些语句必须在循环前和循环内部都出现。
for循环
如果省略for循环中的循环继续条件,则隐含的认为循环继续条件为true。for( ; ; ){}等价于for( ; true; )等价于while(true){}
最小化数值错误
在循环继续条件中使用浮点数将导致数值错误。方法:在较大数之前先增加较小数是减小误差的一种方法。(从小到大)
关键字break和continue
continue只是跳出了一次迭代(程序控制转向该循环体的末尾),而break是跳出了整个循环。
注意:continue语句总是在一个循环内。在while和do-while循环中,continue语句之后会马上计算循环继续条件;而在for循环中,continue语句之后会立即先执行每次迭代后的动作,再计算循环继续条件。
注意:很多程序设计语言都有goto语句,goto语句可以随意地将控制转移到程序中的任意一条语句上,然后执行它。这使程序很容易出错。Java中的break语句和continue语句是不同于goto语句的。它们只能运行在循环中或者switch语句中。break语句跳出整个循环,而continue语句跳出循环的当前迭代。