欢迎小伙伴的点评✨✨ 本篇章系列是对C语言的深度思考和总结、关于C语言内容会持续更新。
文章目录
前言
前面介绍了程序中常用到的顺序结构和选择结构,但是只有这两种结构是不够的,还需要用到循环结构(或称重复结构)。因为在日常生活中或是在程序所处理的问题中常常遇到需要重复处理的问题。
一、用while语句实现循环
while 语句的一般形式如下:
while(表达式) 语句
其中的“语句”就是循环体。循环体只能是一个语句,可以是一个简单的语句,还可以是复合语句(用花括号括起来的若干语句)。执行循环体的次数是由循环条件控制的,这个循环条件就是上面一般形式中的“表达式”,它也称为循环条件表达式。当此表达式的值为“真”(以非0值表示)时,就执行循环体语句;为假(以0表示)时,就不执行循环体语句。
while 语句可简单地记为:只要当循环条件表达式为真(即给定的条件成立),就执行循环体语句。
注意: while 循环的特点是先判断条件表达式,后执行循环体。
二、用do…while语句实现循环
除了 while 语句以外,C语言还提供了 do … while 语句来实现循环结构。
do … while 语句的执行过程是:先执行循环体,然后再检查条件是否成立,若成立,再执行循环体。这是和 while 语句的不同。
注意: do … while 语句的特点是,先无条件地执行循环语句,然后判断循环条件是否成立。
do … while 语句的一般形式为
do
语句
while (表达式);
三、用for语句实现循环
除了可以用 while 语句和 do … while 语句实现循环外 ,C语言还提供了 for 语句实现循环,而且 for 语句更为灵活,不仅可以用于循环次数已经确定的情况,还可以用于循环次数不确定而且而只给出循环结束条件的情况,它完全可以代替 while 语句。
for(表达式1 ;表达式 2; 表达式 3)
语句
括号中3个表达式的主要作用是:
表达式1 :设置初始条件,只执行一次。可以为零个 、一个或多个变量设置处置(如 i = 1)。
表达式2 :是循环条件表达式,用来判定是否继续循环。在每次执行循环体前执行此表达式,决定是否继续执行循环。
表达式3 :作为循环的调整,例如使循环变量增值,它是在执行完循环体后才进行的。
最常用的 for 语句形式是:
for(循环变量赋初值;循环条件;循环变量增值)
语句
3.1、for 语句说明:
(1) for 语句的一般形式如下:
for(表达式1;表达式2;表达式3) 语句
可以改写为while 循环的形式:
表达式 1 ;
while 表达式2
{
语句
表达式 3
}
二者无条件等价。
(2) “表达式 1” 可以省略,即不设置初值,但表达式1后的分号不能省略。例如:
for ( ; i <= 100 ; i++) sum = sum + i ; //for语句中没有表达式 1
应当注意:由于省略了 表达式 1 ,没有对循环变量赋初值 ,因此,为了能正常执行循环,应在for语句之前给循环变量赋以初值。
即
i = 1; //对循环变量 i 赋初值
for ( ; i < 100 ; i++ ) // for 语句中没有表达式 1
(3) 表达式 2 也可以省略 ,即不用表达式 2 来作为循环条件表达式 ,不设置和检查循环的条件。如:
for(i = 1; ; i++) sum = sum + i; //没有表达式 2
此时循环无终止地进行下去 ,也就是认为表达式 2 始终为真,它相当于。
i = 1;
while (1)
{
sum = sum + i ;
i++;
}
循环无终止地进行,i的值不断加大,sum 的值也不断累加。
(4) 表达式 3 也可以省略,但此时程序设计者应另外设法保证循环能正常结束。例如:
for( i = 1 ; i<100 ; ) //没有表达式 3
{
sum = sum + i ;
i++; //这时可以在循环体外中使循环变量增值
}
在上面的 for 语句中只有表达式 1和 表达式 2 ,而没有表达式 3 。i++ 的操作不放在表达式 3 的位置 ,而作为循环体的一部分,效果是一样的,都能使循环正常结束。如果在循环体中无此 “ i++ ; ” 语句,则循环体无止境地执行下去。
(5) 如果表达式 1 和 表达式 3 都没有 ,只有表达式 2 ,即只给循环条件。
当然,应当在for 语句前给循环变量赋初值,否则循环无法正常执行。即:
i = 1; //给循环变量赋初值
for ( ; i<=100; ) //没有表达式 1 和表达式 3 ,只有表达式 2
{
sum = sum + i ;
i++ ; //在循环体中使循环变量增值
}
相当于
i = 1;
while ( i <=100)
{
sum = sum + i ;
i++;
}
可见 for 语句比 while 语句功能强,除了可以给循环条件外 ,还可以赋初值,使循环变量自动增值等。
(6) 甚至可以将 3 个表达式都可以省略,例如:
for( ; ; ) printf(" %d\n " , i);
相当于
while (1) printf(" %d\n " , i);
即不设初值,不判断条件(认为表达式 2为真值),循环变量也不增值 ,无终止地执行循环体语句 ,显然这是没有实用价值的。
(7) 表达式 1 可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的其他表达式。例如:
i = 1;
for(sum = 0 ; i <= 100 ; i++) sum = sum + i ;
表达式 3 也可以是与循环控制无关的任意表达式 。但不论怎样写 for 语句,都必须使循环能正常执行。
(8) 表达式 1和表达式 3 可以是一个简单的表达式,也可以是逗号表达式,即包含一个以上的简单表达式,中间用逗号间隔。如:
for( sum = 0 , i = 1 ; i <= 100 ; i++ ) sum = sum +i;
或
for( i = 0, j = 100 ; i <= j ; i++ , j --) k = i + j ;
在逗号表达式内 按自左至右顺序求解 ,整个逗号表达式的值为最右边的表达式的值。例如:
for ( i = 1 ; i <=100 ; i++ ,i++) sum = sum + i ;
相当于
for( i = 1 ; i <=100 ; i+2) sum = sum + i ;
(9) 表达式 2 一般是关系表达式(如 i<=100) 或 逻辑表达式 (如 i<=100) 或 逻辑表达式(如 a < b && x < y) ,但也可以是数值表达式或字符表达式,只要其值为非零,就执行循环体。分析下面两个例子:
① for( i = 0 ; ( c = getchar () ) ! = ‘a’ ; i += c);
在表达式 2 中先从终端接收一个字符赋给 c ,然后判断此赋值表达式的值是否不等于’a’ ,如果不等于’a’ ,就执行循环体。它的作用是不断输入字符,将它们的ASCII 码相加,直到输入一个’a’ 符为止。
注意: 此for语句的循环体为空语句,把本来要在循环体内处理的内容放在表达式 3中,作用是一样的。可见 for 语句功能强,可以在表达式中完成本来应在循环体内完成操作。
②for( ; ( c = getchar() ) != ‘a’ ; )
printf( “%c”, c);
for语句中只有表达式 2,而无表达式 1和表达式 3。其作用是每读入一个字符后立即输出该字符,直到输入一个 ”换行“ 为止。
请注意 ,从终端键盘向计算机输入时,是在按Enter 键以后才将一批数据一起送到内存缓冲区中去的。因此不是从终端输入一个字符马上输出一个字符,而是在按 Enter键后数据才送入内存缓存区,然后每次从缓存区读一个字符,在输出该字符。
(10) C99 允许在 for 语句的 ”表达式 1“ 中定义变量并赋值,如:
for( int i = 1 ; i <=100 ; i++) //定义循环变量 i , 同时赋初值 1
sum = sum + 1 ;
显然 ,这可以 使程序简练 ,灵活方便。但应注意:所定义的变量的有效范围只限于 for 循环中,在循环外不能使用此变量。
从上面介绍可以知道,C语言的 for 语句使用十分灵活,变化多端,可以把循环体和一些与循环控制无关的操作也作为表达式 1 或表达式 3 出现,这样程序可以短小简洁。但应注意:过分地利用这一特点会使for 语句显得杂乱,可读性降低,最好不要把与循环控制无关的内容放到for 语句中。
四、循环的嵌套
一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。内嵌的循环中还可以嵌套循环,这就是多层循环。各种语言中关于循环的嵌套的概念都是一样的。
3种循环( while 循环 、do … while 循环 和 for 循环 ) 可以互相嵌套。例如,下面几种都是合法的形式:
(1)
while()
{
…
while( ) // 内层循环
{
…
}
}
(2)
do
{
…
do
{
…
}while( ) ; //内层循环
}while( ) ;
(3)
for( ; ; )
{
for( ; ; ) //内层循环
{
…
}
}
(4)
while( )
{
…
do
{
…
}while( ) ; //内层循环
}
(5)
for( ; ; )
{
…
while( ) //内层循环
{
…
}
}
(6)
do
{
…
for( ; ; ) //内层循环
{
…
}
}while( );
五、几种循环的比较
(1) 3种循环都可以用来处理同一问题,一般情况下它们可以互相代替。
(2) 在 while 循环和 do…while 循环中,只在 while 后面的括号内指定循环条件,因此为了使循环能正常结束,应在循环体中包含使循环趋于结束的语句(如i++,或 i =i+1等)。
for 循环可以在表达式3中包含使循环趋于结束的操作,甚至可以将循环体中的操作全部放到表达式3中。因此 for 语句的功能更强,凡用 while 循环能完成的,用 for 循环都能实现。
(3) 用 while 和 do…while 循环时,循环变量初始化的操作应在 while 和 do…while 语句之前完成。而 for 语句可以在表达式1中实现循环变量的初始化。
(4) while 循环、do…while 循环和 for 循环都可以用 break 语句跳出循环,用 continue 语句结束本次循环。
六、改变循环的执行状态
6.1、用break 语句提前终止循环
如前所述,用 break 语句可以使流程跳出 switch 结构,继续执行 switch 语句下面的一个语句。实际上,break语句还可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句。
break语句的一般形式为
break ;
其作用是使流程跳到循环体之外,接着执行循环体下面的语句。
注意 break 语句只能用于循环语句和 switch 语句之中,而不能单独使用。
6.2、用 continue 语句提前结束本次循环
有时并不希望终止整个循环的操作,而只希望提前结束本次循环,而接着执行下次循环。这时可以用 continue 语句。
continue 语句的一般形式为
continue ;
其作用为结束本次循环,即跳过循环体中下面尚未执行的语句,转到循环体结束点之前,接着执行 for 语句中的”表达式 3“ (在本例中是 n++) ,然后进行下一次是否执行循环的判定。
6.3、break 语句和 continue 语句的区别
continue 语句只结束本次循环 ,而不是终止整个循环的执行。而 break 语句则是结束整个循环过程,不再判断执行循环的条件是否成立。
七、总结
循环程序设计是很重要的,许多问题都需要通过循环来处理。