循环语句分析:
do...while语句的循环方式:
while语句的循环方式:
for语句的循环方式:
三种循环语句的使用对比:
do...while
当我们给f1的参数是-100时,结果如下:
这不是我们想要的结果,我们希望实参小于0时,f1函数什么都不做,但是这个do...循环却至少执行了一次do中的语句。对程序进行改进。
在坚持要使用do...while循环的前提下我们只能加一个if判断语句,如下:
在做这样的累加操作的时候,do...while并不适合。我们修改成while循环的方式:
while适合求累加和的操作。
下面添加for循环求累加和的程序:
for循环求累加和更加一目了然。for循环是最适合最累加的。
break和continue的区别:
break可以用到switch语句里面,也可以用到循环语句里面,那么continue是否可以用到switch语句中呢?
continue是为循环语句设计的,与分支语句没有任何关系。
示例程序如下:
1 #include <stdio.h> 2 3 void f1(int n) 4 { 5 int i = 0; 6 7 for(i=1; i<=n; i++) 8 { 9 if( (i % 2) == 0 ) 10 { 11 break; 12 } 13 14 printf("%d ", i); 15 } 16 17 printf(" "); 18 } 19 20 void f2(int n) 21 { 22 int i = 0; 23 24 for(i=1; i<=n; i++) 25 { 26 if( (i % 2) == 0 ) 27 { 28 continue; 29 } 30 31 printf("%d ", i); 32 } 33 34 printf(" "); 35 } 36 37 int main() 38 { 39 f1(10); 40 f2(10); 41 42 return 0; 43 }
第11行的break如果执行到,会直接跳出第7行的for循环。
第28行的continue如果执行到,会跳到下一次for循环,不会跳出for循环,只会跳过31行的打印。
执行结果如下:
do和break的妙用:
示例程序如下:
1 #include <stdio.h> 2 #include <malloc.h> 3 4 int func(int n) 5 { 6 int i = 0; 7 int ret = 0; 8 int* p = (int*)malloc(sizeof(int) * n); 9 10 do 11 { 12 if( NULL == p ) break; 13 14 if( n < 5 ) break; 15 16 if( n > 100) break; 17 18 for(i=0; i<n; i++) 19 { 20 p[i] = i; 21 printf("%d ", p[i]); 22 } 23 24 ret = 1; 25 }while( 0 ); 26 27 printf("free(p) "); 28 29 free(p); 30 31 return ret; 32 } 33 34 int main() 35 { 36 if( func(10) ) 37 { 38 printf("OK "); 39 } 40 else 41 { 42 printf("ERROR "); 43 } 44 45 return 0; 46 }
我们让do...while循环只执行一次,free一个NULL指针也是没有问题的。这个do...while循环用break暴力跳出的方式,意义在于强制我们在返回之前一定要释放p所指向的内存。
执行结果如下:
改成下面这种,在条件不成立立即返回的情况:
当我们在main函数中给func传入的数是1000的时候,结果如下:
可以看到这种情况下没有释放指针。
如果在每个不成立的条件后先释放一次指针再返回会使得程序很臃肿。
小结:
for循环先进行判断再进入循环体
for循环适合于循环次数固定的场合
while循环先进行判断再进入循环体执行
while循环适合于循环次数不定的场合
do...while循环先执行循环体再进行判断
do...while循环至少执行一次循环体