C语言进阶:7、循环语句

循环语句的基本工作方式:

    通过条件表达式判定是否执行循环体;    

    条件表达式遵循if语句表达式的原则;

do、while、for语句的区别:

        do语句先执行再判断,循环体至少执行一次;

        while语句先判断后执行,循环体可能不执行;

        for语句先判断再执行,相比while更加简洁。

do...while的循环方式:

	do
	{
		//loop
	}
	while(condition);

while语句的循环方式:

	while()
	{
		//loop
	}

for语句的循环方式:

for(i=0; condition; i++)
{
	//loop
}

观察下面示例代码,体会三种不同的循环:

扫描二维码关注公众号,回复: 146231 查看本文章
int f1(int n)
{
	int i=1;
	int s=0;
	
	if(n>0)    //注意要先进行判断
	{
		do
		{
			s += i;
			i++;
		}while(i <= n);
	}
	
	return s;
}

int f2(int n)
{
	int ret=0;
	
	while(n>0)
	{
		ret += n;
		n--;
	}
	
	return ret;
}

int f3(int n)
{
	int ret=0; 
	int i=0;
	
	for(i=0; i<=100; i++)
	{
		ret += i;
	}
	
	return ret;
}

划重点:break和continue的区别:

            break表示终止循环的执行;

            continue表示终止本次循环,进入下次循环执行。

问题:switch语句中能否使用continue关键字?为什么?

        不能。continue,为循环而生。

判断下面示例代码会输出什么?

#include <stdio.h>

void f1(int n)
{
	int i=0;
	for(i=1; i<=n; i++)
	{
		if( i%2 == 0)
		{
			break;  //符合条件,直接跳出循环
		}
		printf("%d\n", i);
	}
	
	printf("\n");
}

void f2(int n)
{
	int i=0;
	for(i=1; i<=n; i++)
	{
		if( i%2 == 0)
		{
			continue;  //符合条件,跳出此次循环,进入下一次循环,不符合条件,打印
		}
		printf("%d\n", i);
	}
	
	printf("\n");
}

int main()
{
    f1(10);
    f2(10);
	return 0;
}


在Linux下使用Gcc编译运行结果为:

delphi@delphi-vm:~/will$ gcc test.c
delphi@delphi-vm:~/will$ ./a.out
1

delphi@delphi-vm:~/will$ gcc test.c
delphi@delphi-vm:~/will$ ./a.out
1
3
5
7
9

do...break语句:暴力结束循环体,并且不会造成内存泄漏。

观察下面示例代码,体会do...break的作用:

do
{
    break;
}while(0);

#include<stdio.h>
#include<malloc.h>

int func(int n)
{
	int i=0;
	int ret =0;
	int *p = (int *)malloc(sizeof(int)* n);
	
	do{
		if(p ==NULL) break; 
		//直接return是错误的,因为申请的内存没有释放
		if( n<5) break;   
		//return 内存泄漏
		if( n>100) break;  
		//return 直接结束函数
		
		for(i=1; i<n; i++)
		{
			p[i] = i;
			printf("%d\n", p[i]);
		}
		
		ret = 1;	
	}
	while(0);
	
	free(p);
	print("Free(p)\n");
	return ret;
}

在上述代码的循环体中,只要符合条件,则退出循环,并且可以释放内存空间,不会造成内存泄漏。

如果直接使用return,则函数直接结束,内存泄漏。

		if(p ==NULL) return ret; 
		                            //直接return是错误的,因为申请的内存没有释放
		if( n<5) return ret;   
		                            //return 内存泄漏
		if( n>100) return ret;  
		                            //return 直接结束函数
		
		for(i=1; i<n; i++)
		{
			p[i] = i;
			printf("%d\n", p[i]);
		}
		
		ret = 1;

使用do...break语句可以避开某些语句,并且不会造成内存泄漏。

小结:

for循环先进性判断再进入循环体,适用于循环次数固定的场合;

while循环也是先判断再进入循环体,适用于循环次数不固定的场合;

do...while循环先执行循环体再进行条件循环,至少执行一次循环体,并且

do
{
    break;
}while(0);
对于防止内存泄漏,有很好的作用。


猜你喜欢

转载自blog.csdn.net/qq_28388835/article/details/80156879