4.5 while子句
C语言唯一存在差别的地方就是它的expression部分,这和if语句类似。while语句的语法:
while( expression )
statement
循环的测试在循环体开始执行之前进行,所以如果测试的结果一开始就是假,循环体就根本不会执行。同样,当循环体需要多余语句来完成任务时,可以使用代码块来实现。
#include
#include
int main( void ){
int i = 2;
int count = 0;
printf( "test value of while expression: n" );
while( 0 ){
printf( "the loop don't execute.n" );
}
while( i ){
printf( "the value of i is %dn", i );
printf( "use block to finish the tash of while body!" );
count++;
printf( "the loop execute %d time.n", count );
i--;
}
return EXIT_SUCCESS;
}
4.5.1 break和continue语句
在while循环中可以使用break语句,用于永久终止循环。在执行完break语句之后,执行流下一条执行的语句就是循环正常结束后应该执行的那条语句。
在while循环中可以使用continue语句,它用于永久终止当前的那次循环。在执行完continue语句之后,执行流接下来就是重新测试表达式的值,决定是否继续执行循环。
这两条语句的任何一条如果出现于嵌套的循环内部,它只对最内层的循环起作用,无法使用break或continue语句影响外层循环的执行。
4.5.2 while语句的执行过程
菱形表示判断、方框表示需要执行的动作,箭头表示它们之间的控制流
while语句的操作过程。它的执行从顶部开始,就是计算表达式expr值。如果它的值是0,循环就终止;否则就执行循环体,然后控制流回到顶部,重新开始下一个循环。例如,下面的循环从标准输入复制字符到标准输出,直至找到文件尾结束标志。
while( (ch = getchar()) != EOF ){
putchar(ch);
}
如果循环体内执行了continue语句,循环体内的剩余部分便不再执行,而是立即开始下一轮循环。在循环体只有遇到某些值才会执行的情况下,continue语句相当有用。
while( (ch = getchar()) != EOF )
{
if( ch < '0' || ch > '9' )
{
continue;
}
}
另一种方法是把测试转移到if语句中,让它来控制整个循环的流程。这两种方法的区别仅在于风格,在执行效率上并无差别。
#include
#include
int main( void ){
int ch;
while( (ch = getchar()) != EOF ){
if( ch >= '0' && ch <= '9' ){
printf( "%c", ch );
}
}
return EXIT_SUCCESS;
}
如果循环体内执行了break语句,循环就将永久性退出。例如,我们需要处理一列以一个负值作为结束标志的值:
while( scanf("%f", &value) == 1 )
{
if ( value < 0 )
{
break;
}
}
另一种方式是把这个测试加入到while表达式中,如下所示:
while( scanf("%f", &value) == 1 && value >= 0 ){
然而,如果在值能够测试之前必须执行一些计算,使用这种风格就显得比较困难。
提示:
偶尔,while语句在表达式中就可以完成整个语句的任务,于是循环体就无事可做。在这种情况下,循环体就用空语句来表示。单独用一行来表示一条空语句是比较好的做法,如下面的循环所示,它将丢弃当前输入行的剩余字符。
while ( (ch = getchar()) != EOF && ch != 'n' )
;
清楚地显示循环体是空的,不至于使人误以为程序接下来的一条语句才是循环体。
#include
#include
int main( void ){
float value;
while( scanf("%f", &value) == 1 && value >= 0 )
{
printf( "%f ", value );
}
return EXIT_SUCCESS;
}
#include
#include
int main( void ){
int outer_var = 6;
int inter_var = 7;
int outer_i = 0;
int inter_i;
printf( "outer_var = %d, inter_var = %dn", outer_var, inter_var );
printf( "the loop begins:n" );
while( outer_i < outer_var ){
printf( "outer_i = %dn", outer_i );
inter_i = 0;
while( inter_i < inter_var ){
printf( "inter_i = %d ", inter_i );
inter_i++;
if( inter_i == 3 ){
printf( "internal loop continue " );
continue;
}
else if( inter_i == 5 ){
printf( "internal loop break " );
break;
}
}
printf( "n" );
outer_i++;
}
printf( "outer loop ends.n" );
return 0;
}



