C语言-循环结构

while
do while
for
break
continue

while循环

while循环的一般形式为:

while(/* 表达式 */){
    /* 语句块 */;
}

意思是,先计算“表达式”的值,当值为真(非0)时,执行“语句块”;执行完“语句块”,再次计算表达式,如果为真,继续执行“语句块”······这个过程会一直重复,知道表达式值为假(0),就跳出循环,执行while后面的代码。

我们通常将“表达式”称为循环条件,把“语句块”称为循环体,整个循环的过程就是不停的判断循环条件,并执行循环体代码的过程。

我们要注意如果循环条件中不包含变量,会发生什么;

  • 循环条件成立时的话,while循环会一直执行下去,永不结束,称为“死循环”。例如:
#include <stdio.h>
int main(){
    while(1){
        printf("1");
    }
    return 0;
}
  • 循环条件不成立的话,while循环就会一次都不执行。例如:
#include <stdio.h>
int main(){
    while(0){
        printf("1");
    }
    return 0;
}

do-while循环

do-while循环的一般形式为:

do{
    /* 语句块 */
}while(/* 表达式 */);

do-while循环和while循环不同的是:他会先执行“语句块”,然后再判断表达式是否为真,如果为真则继续执行循环,如果为假,则终止循环。因此也就是说do-while循环至少执行一次“语句块”。

for循环

for循环的一般形式为:

for(/* 表达式1 */; /* 表达式2 */; /* 表达式3 */){
    /* 语句块 */
}

它的运行过程:

  1. 先执行“表达式1”。
  2. 再执行“表达式2”,如果它的值为真(非0),则执行循环体,否则结束循环。
  3. 执行完循环体后再执行“表达式3”,然后执行“表达式2”,判断它的值是否为真(非0),则执行循环体,否则结束循环。
  4. 重复执行步骤3,直到“表达式2”的值为假,结束循环。

for循环的三个表达式

for循环中的“表达式1(初始化条件)”、“表达式2(循环条件)”和“表达式3(自增或者自减)”都是可选项,都可以省略(但是分号;必须留下)。

  1. 修改“从1加到100的和”的代码,省略“表达式1(初始化条件)”:
#include <stdio.h>
int main()
{
    int i = 1, sum = 0;
    for( ; i<=100; i++)
    {
        sum+=i;
    }
    printf("%d",sum);
}
  1. 省略“表达式2(循环条件)”,如果他不做其他处理将导致整个循环陷入死循环。死循环就是循环永远成立,它会一直执行下去。
#include <stdio.h>
int main()
{
    int i, sum=0;
    for(i=1; ; i++) 
        sum=sum+i;
}
  1. 省略“表达式3(自增或者自减)”,就不会修改“表达式2(循环条件)”中的变量,这时可在循环体中插入修改变量的语句。
#include <stdio.h>
int main()
{
    int i, sum=0;
    for(i=1;i<=100;)
    {
        sum+=i;
        i++;
    }
}
  1. 它也可以将全部表达式都删除,那for(;;)就相当于while(1)
  2. “表达式1”可以是初始化语句,也可以是其他语句。例如:
#include <stdio.h>
int main()
{
    int i,sum;
    for(i=1,sum=0;i<=100;i++)
        sum+=i;
    printf("%d",sum);
}
  1. “表达式2”一般为关系表达式或者逻辑表达式,也可以是字符或者数字,只要其值非零,就执行循环。例如:
for(i=0;(c=getchar())!='\n';i+=c);

break 关键字

当break关键字用于循环时,会终止当前循环而执行循环后面的代码,而break语句经常和if语句连用,即满足条件然后跳出循环。在多层循环中break关键字只能向外跳出一层循环。例如:

#include <stdio.h>
int main()
{
    int i=1, j;
    while(1)
    {  // 外层循环
        j=1;
        while(1)
        {  // 内层循环
            printf("%-4d", i*j);
            j++;
            if(j>4) break;  //跳出内层循环
        }
        printf("\n");
        i++;
        if(i>4) break;  // 跳出外层循环
    }
    return 0;
}

运行结果:

1   2   3   4
2   4   6   8
3   6   9   12
4   8   12  16

continue 语句

continue语句的作用时提前结束本次循环,直接进入下一次循环。

#include <stdio.h>
int main()
{
    char c = 0;
    while(c!='\n')
    {  //回车键结束循环
        c=getchar();
        if(c=='4' || c=='5')//按下的是数字键4或5
        {  
            continue;  //跳过当次循环,进入下次循环
        }
        putchar(c);
    }
    return 0;
}

运行结果:

0123456789↙
01236789

break与continue的对比;break用来结束所有循环,循环语句不在有执行的机会,而continue是结束本次循环,提前进入下一次循环,如果循环条件成立,则继续执行循环。

循环的嵌套

理解了上面那些程序,我们就来谈谈,循环的嵌套,我们用一个简单的九九乘法表来。

#include <stdio.h>
int main()
{
    int i,j;
    for(i=0;i<10;i++)
    {
        for(j=0;j<=i;j++)
        {
            printf("%d*%d=%d    ",i,j,i*j);
        }
        printf("\n");
    }
    return 0;
}

运行结果:

1*1=1
2*1=2   2*2=4
3*1=3   3*2=6   3*3=9
4*1=4   4*2=8   4*3=12  4*4=16
5*1=5   5*2=10  5*3=15  5*4=20  5*5=25
6*1=6   6*2=12  6*3=18  6*4=24  6*5=30  6*6=36
7*1=7   7*2=14  7*3=21  7*4=28  7*5=35  7*6=42  7*7=49
8*1=8   8*2=16  8*3=24  8*4=32  8*5=40  8*6=48  8*7=56  8*8=64
9*1=9   9*2=18  9*3=27  9*4=36  9*5=45  9*6=54  9*7=63  9*8=72  9*9=81

Posts in this Series