文档视频讲解链接地址
- 腾讯课堂链接 : 26_控制语句_循环语句for
- 腾讯课堂链接 : 27_控制语句_循环语句for练习
- 腾讯课堂链接 : 28_控制语句_循环嵌套for
4.3 循环语句for
-
for 循环的一般形式为:
for(表达式1; 表达式2; 表达式3) { 语句块; }
-
for循环执行过程:
for(expression1; expression2; expression3) { statements; }
- 第一步: 初始化语句(expression1)仅执行一次。
- 第二步: 执行表达式(expression2)结果为假,则循环终止。结果为真,则执行循环体内的语句(statements) 。
- 第三步: 执行表达式(expression3)。
- 以上是一个完整的循环过程
- 第四步:再次执行表达式(expression2) 结果为假,则for循环终止。结果为真,则执行循环体内的语句(statements) 。
- 第五步: 执行表达式(expression3)。
- 第四步和第五步一直循环
- …
- 第n步 : 执行expression2, 直到结果为假, 退出循环
- 例如 计算1+2+3+…+10之和
#include <stdio.h> int main(int argc, char const *argv[]) { int sum =0; for(int i=1;i<11;i++) { printf("i=%d\n",i); sum +=i; } printf("sum=%d\n",sum); return 0; }
-
for循环语句特殊用法
-
for语句中的表达式1可以省略,但在for循环之前应给循环变量赋值。
- 例如:
int i=1; for(;i<=100;i++) sum=sum+i;
-
表达式2也可以省略,但循环将陷入死循环。
- 例如:
for(i=1;;i++) sum=sum+i;
-
表达式3也可以省略,但应在循环体中增加使循环变量值改变的语句。
- 例如:
for(sum=0,i=0;i<=100;) { sum=sum+i; i++; }
-
for 循环中的“表达式1(初始化条件)”、“表达式2(循环条件)”和“表达式3(自增或自减)”都是可选项,都可以省略(但分号;必须保留)。
-
表达式1和表达式3同时省略也允许。
- 例如:
int i=1; int sum=0; for(;i<=100;) { sum=sum+i; i++; }
-
三个表达式都可以省略。
- 例如:
for(;;) // 死循环 等价于 while(1) sum=sum+i;
- 注意:循环将无休止的执行下去,相当于while(1)。
-
-
实例 33
用for语句计算1+2+3+4+…+100 之和。- 源文件
01-cbase\32-for.c
- 源代码
#include <stdio.h> int main(int argc, char const *argv[]) { int sum = 0; for (int i = 1; i <= 100; i++) // c99允许在for循环内定义变量并初始化 { sum = sum + i ; // sum += i } printf("sum=%d\n",sum); /* * 第1步: 执行(int i = 1) ; * 第2步: 执行(i <= 100) , 结果为真 , 执行(sum = sum + i ) , sum = 1 * 第3步: 执行(i++) i = 2; * 第4步: 执行(i <= 100) , 结果为真 , 执行(sum = sum + i ) , sum = 3 * 第5步: 执行(i++) i = 3; * ... * 第n步: i = 100 , 执行(i <= 100) , 结果为真 , 执行(sum = sum + i ) , * 第n+1步: 执行(i++) i = 101; * 第n+2步: i = 101 , 执行(i <= 100) , 结果为假 , for循环退出 sum (1+2+3+...+100) * sum = 5050 */ return 0; }
- 运行结果
sum=5050
-
实例34
- 输出100以内的奇数
- 源文件
01-cbase\33-for.c
- 源代码
#include <stdio.h> int main(int argc, char const *argv[]) { for (int i = 1; i <= 100; i++) { if (i % 2 == 1) // 这个数就是奇数 { printf("i=%d\n", i); } } return 0; }
- 输出结果
i=1 i=3 i=5 i=7 ... i=95 i=97 i=99
-
实例35
-
输出三位数的水仙花数(100-999)
个位的立方 + 十位的立方 + 百位的立方 还等于这个数 , 这个数就是水仙花数
例如:
153 == 1*1*1 + 3*3*3 + 5*5*5 // 个位的立方 + 十位的立方 + 百位的立方 还等于这个数 , 这个数就是水仙花数
- 源文件
01-cbase\34-flower.c
- 源代码
#include <stdio.h> int main(int argc, char const *argv[]) { int ge, shi, bai, ret; for (int i = 100; i < 1000; i++) { ge = i % 10; // 得到个位的数 shi = i % 100 / 10; // 得到十位的数 bai = i / 100; // 得到百位的数 ret = ge * ge * ge + shi * shi * shi + bai * bai * bai; if(ret == i ) { printf("%d ",i); } } return 0; }
- 运行结果
153 370 371 407
-
-
for循环嵌套结构
for (表达式1;表达式2;表达式3) { for (表达式1;表达式2;表达式3) { 语句块1; } }
-
实例35
- 用for循环嵌套语句实现如下图案, 5行5列的*
* * * * * * * * * * * * * * * * * * * * * * * * *
- 源文件
01-cbase\35-for.c
- 源代码
#include <stdio.h> int main(int argc, char const *argv[]) { for(int i=0;i<5;i++) // 0,1,2,3,4, for循环可以循环5次 { for(int j=0;j<5;j++) // 0,1,2,3,4 for循环可以循环5次 { printf("* ") ; // 外层循环5次 , 内层循环5次 , 一共25次 } printf("\n"); } return 0; }
- 运行结果
* * * * * * * * * * * * * * * * * * * * * * * * *
-
实例36
- 输出图案
* * * * * * * * * * * * * * *
- 源文件
01-cbase\36-for.c
- 源代码
#include <stdio.h> int main(int argc, char const *argv[]) { for(int i=0;i<5;i++) // 外层循环控制行数 { for(int j=0;j<=i;j++) // 内层循环控制列数 随着行数的增加列也在增加,因此j<=i { printf("* "); } printf("\n"); } return 0; }
- 运行结果
* * * * * * * * * * * * * * *
-
实例37
- 输出图案
* * * * * * * * * * * * * * *
- 源文件
01-cbase\37-for.c
- 源文件
#include <stdio.h> int main(int argc, char const *argv[]) { for(int i=0;i<5;i++) // 外层循环控制行数 { for(int j=0;j<5-i;j++) // 内层循环控制列数 随着行数的增加列也在减少,因此j<=i { printf("* "); } printf("\n"); } return 0; }
- 运行结果
* * * * * * * * * * * * * * *
-
实例38
- 输出图案
* * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- 源文件
01-cbase\38-for.c
- 源代码
#include <stdio.h> int main(int argc, char const *argv[]) { for(int i=0;i<5;i++) // 外层循环控制行数 { for(int j=0;j<5-i;j++) // 内层循环控制列数 随着行数的增加列也在减少,因此j<=i { printf("* "); } printf("\n"); } for(int i=0;i<5-1;i++) // 外层循环控制行数 { for(int j=0;j<=i+1;j++) // 内层循环控制列数 随着行数的增加列也在增加,因此j<=i { printf("* "); } printf("\n"); } return 0; }
- 运行结果
* * * * * * * * * * * * * * * * * * * * * * * * * * * * *