首页 > 编程笔记

C语言for循环语句的用法(非常详细)

for 语句是C语言中最为灵活的循环结构之一,不但可以用于循环次数确定的情况,也可以用于循环次数不确定(只给出循环结束条件)的情况。

C语言 for 循环语句的一般格式如下:

for(表达式1; 表达式2; 表达式3)
    循环体语句;

它的执行过程如下。
  1. 计算表达式1的值。
  2. 判断表达式2,如果其值为非 0(真),则执行循环体语句,然后执行第③步;如果其值为 0(假),则结束循环,执行第⑤步。
  3. 计算表达式3。
  4. 返回,继续执行第②步。
  5. 循环结束,执行 for 后面的语句。

该循环的流程图如下:
C语言for循环语句执行流程示意图

请看下面的例子:
int i;
int sum=0;
for(i=0;i<=100;i++)
    sum+=i;
在本例中:
它的执行过程是,先给循环变量 i 赋初值为 0,再判断 i 是否小于等于 100,如果为真,执行语句 sum+=i,将 i 的值自增 1,再判断 i 是否小于等于 100,如果为真,再执行循环体并且 i 自增 1……一直到 i<=100 不成立时,循环结束。因此上面代码的作用是计算 1+2+…+100 的和。

为了更容易理解,可以将 for 语句的形式改写为:

for(循环变量赋初值; 循环条件; 循环变量增值)
    循环体语句;

示例1

经典问题:打印出 [100,999] 范围内所有的“水仙花数”,所谓“水仙花数”是指一个 3 位数,其各位数字的立方和等于该数本身。例如,153 是一个“水仙花数”,因为 153=13+53+33

代码实现如下:
#include <stdio.h>
int main()
{   int a,b,c;
    int i;
    for(i=100; i<1000; i++) /*从100循环到1000,依次判断每个数是否是水仙花数*/
    {
         a=i%10; /*分解出个位*/
         b=(i/10)%10; /*分解出十位*/          
         c=i/100; /*分解出百位*/
         if(a*a*a+b*b*b+c*c*c==i) /*判断3个数的立方数和是否等于该数本身,若是则打印出来*/
            printf("%d\t",i);
    }

    return 0;
}
运行结果:
153     370     371     407

【代码说明】
第 03~04 行定义变量,用 a、b、c 分别存放每个 3 位数的个位、十位和百位;i 是循环控制变量,控制从 100~999 之间的数。

第 05~12 行是 for 循环,其中:
【范例分析】
本范例中利用 for 循环控制 100~999 的数,每个数分解出个位、十位和百位,然后再判断立方和是否等于该数本身。

在编写 for 循环时,注意3个表达式所起的作用是不同的,而且3个表达式的运行时刻也不同,表达式1在循环开始之前只计算一次,而表达式2和3则要每循环一次就执行一次。

如果循环体的语句多于一条,则需要用花括号括起来作为复合语句使用。

示例2

计算n!,n!=1*2*…*n。
#include <stdio.h>  
int main()
{   int i,n;
    long t=1;
    printf("请输入一个整数:");
    scanf("%d",&n); /*用户从键盘输入一个整数*/
    for(i=1;i<=n;i++) /*从1循环到n*/
        t=t*i;                     
    printf("%d!为%ld\n",n,t); /*输出n! */
}
运行结果:

请输入一个整数:5
5!为120


【范例分析】
本范例中利用循环变量 i 存放自然数 1,2,…,n;变量 t 存放阶乘,初值为 1,重复执行的是 t=t*i,即:

当i=1时,t=t*i=1 (1!)
当i=2时,t=t*i=1*2 (2!)
当i=3时,t=t*i=1*2*3 (3!)
……
当i=n时,t=t*i=1*2*…*(n-1)*n (n!)


累加与累乘是比较常见的算法,这类算法就是在原有的基础上不断地加上或乘以一个新的数。这类算法至少需要设置两个变量,一个变量作为循环变量控制自然数的变化,一个变量用来存放累加或累乘的结果,通过循环将变量变成下一个数的累加和或累乘积。所以一般求阶乘时存放阶乘的循环变量的初值应设置为 1,求累加初值应设置为 0。

for 循环扩展形式

1) 表达式12和表达式3可以是一个简单的表达式,也可以是逗号表达式(即包含了一个简单表达式),例如:

for(i=0,j=100; i<j; i++,j--)
    k=i+j;

这里的循环控制变量可以不止一个。而且表达式1也可以是与循环变量无关的其他表达式。

2) 循环条件可由一个较复杂表达式的值来确定,例如:

for(i=0; s[i]!=c && s[i]!= '\0'; ++i)


3) 表达式2一般是关系表达式或逻辑表达式,但也可以是数值表达式或字符表达式,只要其值不等于 0 就执行循环体。例如:

for(k=1; k-4; k++)
    s=s+k;

仅当 k 的值等于 4 时终止循环。k-4 是数值表达式。

for 循环省略形式

for 循环语句中的 3 个表达式都是可以省略的。

1) 省略“表达式1”,此时应在 for 语句之前给循环变量赋初值。例如:

i=1;
for(; i<=100; i++)
    sum+=i;


2) 省略“表达式2”,表示不判断循环条件,循环无终止地进行下去,也可以认为表达式2始终为真。例如:

for(i=1; ; i++)
    sum+=i;

上面的代码将无休止地执行循环体,一直做累加和。为了终止循环,就要在循环体中加入 break 语句和 goto 语句等。

3) 省略“表达式3”,此时应在循环体内部实现循环变量的增量,以保证循环能够正常结束。例如:

for(i=1;i<=100;){
    sum+=i;
    i++;
}

相当于把表达式3写在了循环体内部,作为循环体的一部分。

4) 省略“表达式1”和“表达式3”,此时只给出了循环条件。例如:

i=1;
for(; i<=100; ) {
    sum+=i;
    i++;
}

相当于把表达式1放在了循环的外面,表达式3作为循环体的一部分。这种情况与C语言 while 语句完全相同。

5) 3个表达式都省略,既不设初值,也不判断条件,循环变量不增值,无终止地执行循环体。例如:

for(; ;)
    循环体语句;

优秀文章