1.do 、while 、for的区别
- do语句先执行后判断,循环体至少执行一次
- while语句先判断后执行,循环体可能不执行
- for语句先判断后执行,相比while更简洁
2.实验示例
#include "stdio.h"
//实现n累加到1
int fun1(int n)
{
int ret = 0;
if(n>0)
{
do{
ret +=n;
n--;
}while(n>0);
}
return ret;
}
int fun2(int n)
{
int ret=0;
while(n>0)
{
ret+=n;
n--;
}
return ret;
}
int fun3(int n)
{
int ret=0;
int i = 0;
for(i=1;i<=n;i++)
{
ret += i;
}
return ret;
}
int main()
{
int sum1=0;
int sum2=0;
int sum3=0;
sum1 = fun1(100);
sum2 = fun2(100);
sum3 = fun3(100);
printf("sum1==%d \r\n",sum1);
printf("sum2==%d \r\n",sum2);
printf("sum3==%d \r\n",sum3);
return 0;
}
得到结果
可以发现,累加场景,for是最适合的。
3.下面讨论下break和continue的区别
- break表示终止循环的执行
- continue表示终止本次循环,进入下次循环执行
思考∶
switch 能否用continue关键字?为什么?
答案是不能的,switch是分支语句,并不是循环语句,continue只用于循环语句。
实验分析一下break和continue。
#include "stdio.h"
void fun1(int n)
{
int i = 0;
for(i = 1;i <= n; i++)
{
if((i % 2)== 0)
{
break;//碰到偶数就跳出循环,打印了1
}
printf("%d",i);
}
printf("\n");
}
void fun2(int n)
{
int i = 0;
for(i = 1;i <= n; i++)
{
if((i % 2)== 0)
{
continue;//打印所有的奇数
}
printf("%d",i);
}
printf("\n");
}
int main()
{
fun1(10);//1
fun2(10);//1 3 5 7 9
return 0;
}
4.do和break的妙用:一个很好的避免内存泄露的方法
#include "stdio.h"
int fun(int n)
{
int i =0;
int ret=0;
int *p = (int*)malloc(sizeof(int)*n);
do{
if( NULL == p) break;
if( n<5 ) break;
if( n>100) break;
for(i=0;i<n;i++)
{
p[i]=i;
printf("%d\n",p[i]);
}
ret = 1;
}while(0);
printf("free(p)\n");
free(p);
return ret;
}
int main()
{
if((fun(10)))
{
printf("OK!\n");
}
else
{
printf("ERROR!\n");
}
return 0;
}
5.小结
(1)for循环先进行判断再进入循环体
(2)for循环适合于循环次数固定的场合
(3)while循环先进行判断再进入循环体执行
(4)while循环适合于循环次数不定的场合
(5)do … while循环先执行循环体再进行条件判断
(6)do … while 循环至少执行一次循环体