这篇来说一下for循环
1 简单介绍for循环
本节内容在书6.5章.
for循环"把初始化,测试和更新组合在一处".(151页).
for( (1)初始化 ; (2)循环继续的条件 ; (4)每次循环的变化 ) {
(3)循环体
}
循环开始时进行初始化操作(1),判断循环是否继续(2),如果可以继续就执行循环体(3),否则就跳出循环循环体执行完毕后进行变化(4),之后重复(2)->(3)->(4)直到不符合循环条件(2).
(1) -> (2) 是否符合条件? -符合-> (3) -> (4) -> (2) 是否符合条件? -符合-> (3) -> (4).....
| |
退出循环 退出循环
就我个人体验来说,当while和for都可以使用时,我是比较喜欢使用for循环的.下面的代码是高斯那个问题的for循环版.
int main(void) {
int max, result;
printf("请输入最大值,程序将计算从最大值到1的和值.\n");
scanf("%d", &max);
int cache = max; //此处存储一下用户输入的值.
for(; max > 0; max--) { //max已经初始化过,所以第一部分可以简化
result += max;
}
//因为循环结束for已经变为0,所以这里用之前存储的值cache.
printf("从1加到%d的和为: %d\n", cache, result);
return 0;
}
运行结果
请输入最大值,程序将计算从最大值到1的和值.
678
从1加到678的和为: 230181
还可以变成这样:
...
for(; max > 0; ) {
result += max;
max--;
}
...
如果什么都不写只有两个分号,就是一个死循环.
for(;;) { ... }
这样会无限执行循环体内的内容,除非循环体内有跳出循环的语句.
所以理论上for循环中只需书写第二个表达式就可以了,因为这是判断循环是否结束的条件.
2 for循环其他用法
2.1 每次不递增递减1
比如求所有偶数的和
int main(void) {
int max, result;
printf("请输入最大值,程序将计算从2到最大值的所有偶数和值.\n");
scanf("%d", &max);
int now = 2;
for(; now <= max; now += 2) {
result += now;
}
printf("从2加到%d的所有偶数的和为: %d\n", max, result);
return 0;
}
运行结果:
请输入最大值,程序将计算从2到最大值的所有偶数和值.
999
从2加到999的所有偶数的和为: 249500
2.2 计算连本带利
只需输入本金,利率,时间即可
int main(void) {
float principal, rate; //本金,利率
int years; //时间
printf("请输入本金:\n");
scanf("%f", &principal);
printf("请输入利息:\n");
scanf("%f", &rate);
printf("请输入年数:\n");
scanf("%d", &years);
for(; years > 0; years--) {
principal = principal + principal * (rate * 1 / 100);
}
printf("到期后可以获得连本带利%.2f元.\n", principal);
return 0;
}
运行结果
请输入本金:
10000
请输入利息:
4.41
请输入年数:
4
到期后可以获得连本带利11884.16元.
2.3 第一个表达式不一定是给变量赋初始值
其实很好理解,因为第一个条件在整个循环中只在最开始执行一次.下面是用这一点来改写while循环版的密码验证.
int main(void) {
int password = 0;
int correct = 456123;
for(printf("请输入密码,在输入正确之前不会弹出消息.\n"); correct != password; ){
scanf("%d", &password);
}
printf("登陆成功!\n");
return 0;
}
运行结果
请输入密码,在输入正确之前不会弹出消息.
123456
456789
456123
登陆成功!