一、for语句的一般形式
1.说明
for(表达式1;表达式2,表达式3){
循环体语句;
}
其中表达式1为赋初值表达式(可以是一个i=1的赋值表达式也可以是i=1,sum=0的逗号表达式),用于对循环变量赋初值(是循环的开始)。
表达式2为循环条件表达式,如果满足该表达式则循环,不满足则跳出循环(控制着循环是否进行)。
表达式3为增值表达式,用来修改循环变量(控制着循环次数,如果没有增值表达式就会进入死循环)。
2.实例
输入一个数,求它的阶乘。
3.代码
#include "stdio.h"
int main() {
int n;
int jc = 1;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
jc *= i;
}
printf("%d!=%d", n, jc);
return 0;
}
4.运行结果
5.易错点
1.再给循环变量赋初值的时候要考虑到是否让循环变量参与计算,比如本题,i参加了阶乘的计算,如果再把它从0开始的话,不管我们的n输入什么值,阶乘都为0,所以这个时候就要把它赋值为1。
2.如果循环变量不是用的前面定义好的变量,那么这里就不能忘了在赋初值表达式加int。
3.注意三个表达式之间是;而不是,。
4.for(表达式1,表达式2,表达式3)后面是{而不是;。
5.for和if一样,一种是带{},一种是不带{},带{}的如果满足for的循环条件表达式则执行{}里面的语句,不带{}的只有下面的一行代码属于for循环体语句里的内容(注意这里判断一行语句并非是真正的行列里的一行而是依靠;区分的,每行语句以分号结尾) 。
6.相关报错
1.[错误] 'i' 未在此范围内声明
原因:未在i前面加int
解决办法:在i前面加int
2.[错误] 期待 ';' 在此之前: '<=' 符号
原因:将for的三个表达式之间的;写为,
解决办法:将,改为;
- [错误] name lookup of 'i' changed 对于 ISO 'for' scoping [-fpermissive]
原因:在for(表达式1,表达式2,表达式3)后面加了;
解决办法:将for(表达式1,表达式2,表达式3);改为for(表达式1,表达式2,表达式3)
4.[错误] 期待 ';' 在此之前: ')' 符号
原因:for表达式里必须有两个;
解决办法:在)前面加;
二、省略式
1.说明
for循环语句的三个表达式均可省略,但是表达式之间的分号不能省略。
2.省略
1.省略表达式1
for(int i=0;i<n;i++)可以变为:
int i=0;
for(;i<n;i++)
2.省略表达式2
for(int i=1;i<=n;i++){sum+=i;}可以变为:
for(int i=1;;i++){
if(i>n){break;}
sum+=i;
}
3.省略表达式3
for(int i=1;i<=n;i++){sum+=i;}可以变为:
for(int i=1;i<=n;){
sum+=i;
i++;
}
三、小试牛刀
1.题目
爱因斯坦曾提出这样一个数学题:有一条长台阶,若每步跨2阶,最后剩下1阶;若每步跨3阶,最后剩下2阶;若每步跨5阶,最后剩下4阶;若每步跨6阶,最后剩下5阶;只有每步跨7阶,最后1阶不剩。编写程序计算这条阶梯共有多少台阶。
2.代码
#include "stdio.h"
int main() {
int x;
for (int i = 1;; i++) {
x = 7 * i;
if (x % 2 == 1 && x % 3 == 2 && x % 5 == 4 && x % 6 == 5) {
printf("x=%d", x);
break;
}
}
return 0;
}
3.运行结果