6.5 循环
for循环把初始化、测试和更新组合在一起。
// sweetie2.c -- a counting loop using for
#include <stdio.h>
int main(void)
{
const int NUMBER = 22;
int count;
for (count = 1; count <= NUMBER; count++)
printf("Be my Valentine!\n");
return 0;
}
/* 输出:
*/
关键字for后面的圆括号有3个表达式,分别用分隔分号隔开。第1个表达式是初始化,只会在for循环开始时执行一次。第2个表达式是测试条件,在执行循环之前对表达式求值。如果表达式为假,循环结束。如果表达式为真,则执行for语句中的单独语句。第3个表达式执行更新,在每次循环结束时求值。完整的for语句还包括后面的简单语句或复合语句。for圆括号中的表达式也叫做控制表达式,它们都是完整表达式,所以每个表达式的副作用都发生在对下一个表达式求值之前。
/* for_cube.c -- using a for loop to make a table of cubes */
#include <stdio.h>
int main(void)
{
int num;
printf(" n n cubed\n");
for (num = 1; num <= 6; num++)
printf("%5d %5d\n", num, num*num*num);
return 0;
}
/* 输出:
*/
6.5.1 利用for的灵活性
for循环还有其他9种用法。
*可以用于递减运算符来递减计数器;
/* for_down.c */
#include <stdio.h>
int main(void)
{
int secs;
for (secs = 5; secs > 0; secs--)
printf("%d seconds!\n", secs);
printf("We have ignition!\n");
return 0;
}
/* 输出:
*/
*可以让计数器递增2、10等;
/* for_13s.c */
#include <stdio.h>
int main(void)
{
int n; // count by 13s from 2
for (n = 2; n < 60; n = n + 13)
printf("%d \n", n);
return 0;
}
/* 输出:
*/
*可以用字符代替数字计数;
/* for_char.c */
#include <stdio.h>
int main(void)
{
char ch;
for (ch = 'a'; ch <= 'z'; ch++)
printf("The ASCII value for %c is %d.\n", ch, ch);
return 0;
}
/* 输出:
*/
*除了测试迭代次数外,还可以测试其他条件。
for( num = 1; num <= 6; num++ )
替换成:
for( num = 1; num * num * num <= 216; num++ )
*可以让递增的量几何增长,而不是算术增长。也就是说,每次都乘上而不是加上一个固定的量:
/* for_geo.c */
#include <stdio.h>
int main(void)
{
double debt;
for (debt = 100.0; debt < 150.0; debt = debt * 1.1)
printf("Your debt is now $%.2f.\n", debt);
return 0;
}
/* 输出:
*/
*第3个表达式可以使用任意合法的表达式。无论是什么表达式,每次迭代都会更新该表达式的值。
/* for_wild.c */
#include <stdio.h>
int main(void)
{
int x;
int y = 55;
for (x = 1; y <= 75; y = (++x * 5) + 50)
printf("%10d %10d\n", x, y);
return 0;
}
/* 输出:
*/
*可以省略一个或多个表达式(但是不能省略分号),只要在循环中包含能结束循环体的语句即可。
/* for_none.c */
#include <stdio.h>
int main(void)
{
int ans, n;
ans = 2;
for (n = 3; ans <= 25; )
ans = ans * n;
printf("n = %d; ans = %d.\n", n, ans);
return 0;
}
/* 输出:
*/
*第1个表达式不一定是变量赋初值,也可以使用printf()。记住,在执行循环的其他部分之前,只对第1个表达式求值一次或执行一次。
/* for_show.c */
#include <stdio.h>
int main(void)
{
int num = 0;
for (printf("Keep entering numbers!\n"); num != 6; )
scanf("%d", &num);
printf("That's the one I want!\n");
return 0;
}
/* 输出:
*/
*循环体中的行为可以改变循环头中的表达式。
for( n = 1; n < 10000; n = n + delta )
如果程序经过几次迭代后发现delta太小或太大,循环中的if语句可以改变delta的大小。在交互式程序中,用户可以在循环运行时改变delta的值。这样做也有危险的一点,例如,把delta设置为0就没用了。
总而言之,可以自己决定如何使用for循环头中的表达式,这使得在执行固定次数的循环外,还可以做更多的事情。
小结:for语句
关键字:for
一般注解:
for语句使用3个表达式控制循环过程,分别用分号隔开。initialize表达式在执行for语句之前只执行一次;然后对test表达式求值,如果表达式为真(或非零),执行循环一次;接着对update表达式求值,并再次检查test表达式。
形式:
for( initialize; test; update )
statement