该专栏主要介绍 C 语言的基本语法,作为《程序设计语言》课程的课件与参考资料,用于《程序设计语言》课程的教学,供入门级用户阅读。
循环结构是结构化程序中的三种基本结构之一,和顺序结构、选择结构共同作为这种复杂程序的基本构造单元。
while 循环的语法格式如下:
while (表达式)
{循环体}
while 循环的执行过程如下:
(1)计算 while 后括号内的表达式的值,当它的值为非 0 时,执行步骤(2),否则退出循环。
(2)执行循环体。然后执行步骤(1)。
while 循环的特点是先计算表达式的值,然后根据表达式的决定是否执行循环体中的语句。如果表达式的值一开始就为 “假”,则循环一次也不执行。例如:
int i=3;
while (i<3){printf("i=%d",i);
}
其中,printf 函数是while 循环的循环体,但是一次也不执行,因为循环一开始,while 后面的表达式就不成立。
例如:求 1+2+3+……+100 的结果
程序如下:
#include
int main()
{int i=1,sum=0;while (i<=100){sum+=i;i++;}printf("sum=%d",sum);return 0;
}
以上程序的执行结果为:

例如:用公式 π/4=1-1/3+1/5-1/7+1/9-……求 π 的值,直到最后一项的绝对值小于 10^(-4)为止。
程序如下:
#include
#include
int main()
{int i=1;float pi=0,t=1,s=1;while (fabs(t)>1e-4){pi+=t;i+=2;s=-s;t=s/i;}pi=4*pi;printf("pi=%f\n",pi);return 0;
}
以上程序的执行结果为:

do-while语句构成的循环称为 “直到型循环”,语法格式如下:
do
{循环体
} while (表达式);
其中,“表达式” 称为循环条件。循环执行的过程如下:
(1)执行 do 后面的循环体。
(2)计算机 while 后面的表达式的值,如果为 “真” 则继续执行循环体,如果 “表达式” 的值为假,则退出循环结构。
例如:计算 1 + 1/2 + 1/3 + 1/4 +…… + 1/50。程序如下:
#include
int main()
{int i=2;float sum=1; do{sum=sum+1.0/i;i++;} while (i<=50);printf("sum=%f\n",sum);return 0;
}
以上程序的执行结果为:

for 循环的语法格式如下:
for(表达式1; 表达式2; 表达式3){循环体;
}
for 循环的执行过程为:
(1)计算 “表达式1”。
(2)计算 “表达式2”,如果值为真(非0),执行循环体,否则退出循环。
(3)计算 “表达式3”,然后转向步骤(2)。
说明:
(1)for 循环的执行方式和 while 循环类似。for 循环与 while 循环相比,在格式上显得更紧凑。for 循环的形式可以改写为 while 循环的形式。
表达式1;
while (表达式2){循环体;表达式3;
}
(2)for 循环的【表达式1】可以写在 for 循环之前,此时,for 语句中有两个表达式,但【表达式2】之前的分号不能省略。即:
表达式1;
for(; 表达式2; 表达式3){循环体;
}
例如:
#include
int main()
{int i,sum;for(i=1,sum=0;i<=100;i++){sum+=i;}printf("sum=%d\n",sum);return 0;
}
以上程序可以写成如下格式:
#include
int main()
{int i=1,sum=0;for(;i<=100;i++){sum+=i;}printf("sum=%d\n",sum);return 0;
}
(3)如果省略【表达式2】,即不在【表达式2】的位置判断循环条件,将形成死循环。此时,应该在循环体中设置退出循环的机制。例如:
#include
int main()
{int i,sum=0;for(i=1;;i++){if(i>100) break;sum+=i; }printf("sum=%d\n",sum);return 0;
}
(4) 如果省略【表达式3】,即不在此位置进行循环变量的修改,则应该在循环体中编写使循环趋向于结束的语句。例如:
#include
int main()
{int i,sum=0;for(i=1;i<=100;){sum+=i; i++;}printf("sum=%d\n",sum);return 0;
}
(5)可以省略【表达式1】和【表达式3】,仅有【表达式2】。例如:
#include
int main()
{int i=1,sum=0;for(;i<=100;){sum+=i; i++;}printf("sum=%d\n",sum);return 0;
}
(6)for 语句中的【表达式1】、【表达式2】或【表达式3】都可以省略,甚至三个表达式可以同时省略,但是分号不能省略。例如:
#include
int main()
{int i=1,sum=0;for(;;){if(i>100) break;sum+=i; i++;}printf("sum=%d\n",sum);return 0;
}
(7)使用逗号表达式表示【表达式1】和【表达式3】可以使 for 语句更简洁。例如:
#include
int main()
{int i,sum;for(i=1,sum=0;i<=100;sum+=i,i++);printf("sum=%d\n",sum);return 0;
}
(8)【表达式2】一般是关系表达式或逻辑表达式,也可以是数值表达式或字符表达式,只要其值为非 0,就执行循环体。例如:
#include
int main()
{char ch;for(;ch=getchar()!='\n';);printf("ch=%c\n",ch);return 0;
}
例1:求斐波那契数列 1,1,2,3,5,8,…的前40项,公式如下:
fn=1 (n=1)
fn=1 (n=2)
fn=f(n-1)+f(n-2) (n>2)
程序如下:
#include
int main()
{long f1=1,f2=1,f;int i;printf("%12ld%12ld",f1,f2);for(i=3;i<=40;i++){f=f1+f2;printf("%12ld",f);if (i%4==0) printf("\n");f1=f2;f2=f;} return 0;
}
以上程序的执行结果为:

例2:任意输入一个正整数,判断是否为素数。
程序如下:
#include
#include
int main()
{int x,i,w=1;printf("请输入一个正整数:");scanf("%d",&x);if(x<1) printf("输入数据非法\n");for (i=2;i
以上程序的执行结果为:

在循环体中可以通过 break 语句立即终止循环的执行。
说明:
(1)break 语句只用于循环语句或 switch 语句。在循环语句中,break 常常和 if 语句一起使用,表示当条件满足时,立即终止循环。
(2)循环语句可以嵌套使用,break 语句只能终止其所在的循环。
例如:任意输入一个正整数,判断是否为素数。
#include
#include
int main()
{int x,i;printf("请输入一个正整数:");scanf("%d",&x);if(x<1) printf("输入数据非法\n");for (i=2;i=sqrt(x)) printf("%d是素数\n",x);else printf("%d不是素数\n",x);return 0;
}
以上程序的执行结果为:

例:从键盘上连续输入字符,并统计字母的个数,直到输入换行符(\n)时结束。
程序如下:
#include
int main()
{int sum=0;char ch;do {ch=getchar();if (ch>=65&&ch<=90||ch>=97&&ch<=122) sum++;} while(ch!='\n');printf("一共输入了%d个字母\n",sum);return 0;
}
以上程序的执行结果为:

continue 语句的功能是结束本次循环。即:跳过本次循环中余下尚未执行的语句,接着再次进行循环条件的判定。
在 while 和 do-while 循环中,continue 语句使流程直接跳到循环控制条件的判断部分,以决定循环是否继续执行。
在 for 循环中,遇到 continue 语句后,跳过循环体中余下的语句,对【表达式3】求值,然后进行【表达式2】的判断,决定 for 循环继续执行。
例:输出 100~200 之间所有能被 3 整除的整数。
程序如下:
#include
int main()
{int i,n=0;for(i=100;i<=200;i++){if(i%3!=0) continue;printf("%6d",i);n++;if(n%5==0) printf("\n");}return 0;
}
以上程序的执行结果为:

一个循环结构的循环体内又包含另一个循环结构,称为循环的嵌套。
利用循环嵌套可以解决复杂问题,一般把内嵌的循环称为内循环,外层的循环称为外循环。
例:求 1!+3!+5!+…+(2n-1)!
程序如下:
#include
int main()
{int i,j,n=5,p;long sum=0;for(i=1;i<=n;i++){p=1;for (j=1;j<=2*i-1;j++)p=p*j;sum+=p;}printf("%ld",sum);return 0;
}
以上程序的执行结果为:

使用嵌套循环时,应注意以下几点:
(1)for 循环、while 循环和 do-while 循环可以相互嵌套,无论如何嵌套,都必须满足内层循环完整地包含在外层循环中,不能形成循环的交叉。
(2)嵌套循环的层数没有限制,但嵌套的层数太多,会消耗大量的内存,并且程序的可读性变差。
(3)内外层循环尽量不要使用相同的循环控制变量。