C语言循环深入浅出

目录

循环的基本概念

为什么要使用循环?

循环

While循环

while循环的语法以及注意事项

for循环

for循环的语法和注意事项

do  while循环

总结

循环的应用


循环的基本概念

循环是编程中非常重要的一个概念,它可以让程序重复执行一段代码,直到满足某个条件才停止。在C语言中,循环有三种类型:for循环、while循环和do   while循环。这些循环结构可以帮助程序员简化代码,提高代码的可读性和可维护性。循环结构可以用于处理大量数据(避免了手动重复操作)、更加灵活和高效地处理各种问题。在本文中,我将介绍C语言中的循环结构,包括它们的语法、用法和示例以及需要特别注意的部分,我认为了解循环结构是非常重要的,懂得其原理,才能更好的利用。

为什么要使用循环?

因为循环可以提高代码的可读性和可维护性:使用循环可以使代码更加简洁明了,易于理解和修改。最重要的是它可以使程序员大大地减少了代码量,避免了手动重复编写相同的代码。下面举个小栗子感受一下:我们要写一个从1加到20的程序

#include<stdio.h>
int main()
{
	int sum = 0;
	sum = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20;
	return 0;
}

可以看到,如果我们需要程序做同样类似并且有一定规律的操作的时候,如果我们一个个手动去写,那么将会导致代码冗长、难以维护和修改。此外,如果需要修改操作,比如:1+3+5+7····就需要在每个重复的代码块中进行修改,这还会增加出错的可能性。例子中可能数字比较少不够直观,但是如果是从1加到100呢?加到10000呢?这听着手都颤抖了~~

循环

在循环中,通常以循环条件和循环变量调整部分控制循环,循环中判断条件是0为假(不执行循环),非0为真(执行循环),循环常用的关键字:break(跳出循环)、continue(跳过这次循环,也就是说,程序执行到continue,那么continue后面的所以代码都不会执行直接进入下一次循环)

While循环

//定义循环变量

while(循环条件)//循环变量
{
    //循环体
    //调整循环变量调整部分
}

while循环的循环变量需要在while循环之前初始化定义。while执行顺序:进入while循环首先判断循环条件是否满足,如果满足则执行循环体语句,否则跳出循环。以上面的例子:1加到20举例子

//从1开始加到20
#include<stdio.h>
int main()
{
	int i = 0;  //定义循环变量
	int sum = 0;
	while (i <= 20)
	{
		sum = sum + i; //重复操作1+2+3+4+5·····20
		i++;  //控制循环变量调整部分,用于下一次循环时判断循环条件是否满足
	}
	printf("%d\n", sum);//打印从1加到20的值
	return 0;
}

在while循环中,我们通常会使用一个变量(循环变量)来控制循环的执行次数或者终止条件。上面代码中的i就是一个循环变量,每循环一次i就加1,知道i>20,此时的条件就是为假(0),就终止了循环。while循环循环条件可以是非0的任何常量(不为0,那就是真),这表示死循环

while(1) //可以是整数也可以是负数,只要不是0的常量,都是死循环
{
    //循环体
}

while循环的语法以及注意事项

while循环如果循环体里边没有循环变量(这里以i为例)调整,那么此时的循环条件永远都是真的,程序会一直死循环,

#include<stdio.h>
int main()
{
	int i = 0;
	while (i < 10)
	{
		printf("%d\n",i);
	}
    //循环体里边没有循环变量调整,程序会死循环打印0
	return 0;
}

如果不想死循环,那就在循环体里加上循环变量去调整,至于循环变量怎么去调整,就看你需要循环多少遍去设定d

#include<stdio.h>
int main()
{
	int i = 0;
	while (i < 10)
	{
		printf("%d\n",i);
        i++;//循环变量每次加1,也就是说,i直到等于10才会跳出循环,此时程序打印0到9共10个数字
	}
	return 0;
}

那么此时我只想打印0到5的数字呢?这时就需要用到我上面讲的循环中常用的关键字:break了

#include<stdio.h>
int main()
{
	int i = 0;
	while (i < 10)
	{
        if(6 == i)
            break;//i=6的时候,执行if语句中的break,直接跳出循环
		printf("%d",i);
        i++;
	}
	return 0;
}

 

可以看到程序就打印了0,1,2,3,4,5就跳出循环了,那么我要打印0,1,2,3,5,6,7,8,9呢?此时我们就需要用到continue了,可以设定一个条件:当i等于4时,我们跳过这次循环

#include<stdio.h>
int main()
{
	int i = 0;
	while (i < 10)
	{
		if (4 == i)
			continue;//跳过此次循环,执行下一次循环
		printf("%d ", i);
		i++;
	}
	return 0;
}

可以看到,程序并没有按照我们所想的当i等于4的时候跳过执行下一次循环的情况去执行,而是程序现在变成了死循环,这是为什么呢?这是因为程序当i等于4时,遇到了continue,此时,循环体里边continue的后面的所有代码都不会执行了,直接进行下一次循环。不执行的代码包括了循环变量的调整,此时就相当于循环体里边没有了循环变量调整,就像我上面所说的一样,循环体里边没有了循环变量调整,那么程序就会死循环,至于为什么程序没有一直打印3呢?这是因为程序的逻辑错误,本来循环遍历调整i好好的,你突然给我整没,程序也不知道咋办了。正确的做法应该是

#include<stdio.h>
int main()
{
	int i = 0;
	while (i < 10)
	{
		i++;
		if (4 == i)
			continue;
		printf("%d ", i);
	}
	return 0;
}

 可以看到我把循环变量调整i放到了continue的上面,这意味着continue再也无法直接跳过循环变量i了,此时程序打印了我们想要的结果

for循环

for(循环变量初始化部分;循环条件;循环变量调整部分)
{
    //循环体
}

流程图中的表达式1,表达式2,表达式3对应上面的从左往右开始数

 

for循环的执行顺序是:表达式1(循环变量初始化部分),表达式2(循环判断条件),循环体,表达式3(循环变量调整部分),其中表达式1(循环变量初始化部分)只执行一次。

举个小栗子:打印1到9的数字

#include<stdio.h>
int main()
{
	int i = 0;
	for (i = 1; i < 10; i++)
	{
		printf("%d ", i);
	}
	return 0;
}

跟while循环相比,for循环更灵活,可读性更高,因为for循环的三个表达式都聚拢在了一起,当我们一看到for循环的时候,马上就可以知道这个循环的三个表达式的参数,而当代码量多的时候while循环不行,因为你有可能不知道你定义的循环变量在哪里了。毕竟while的循环变量是在循环之前就已经定义的,而且还无法把i等于多少写在while循环的表达式中

for循环的语法和注意事项

for循环的三个表达式都可以省略,这样的话,会使程序死循环。但是应用场景很少,不建议去使用,因为容易出问题

for(; ;)
{
    //循环体
}

 

for循环如果只省略了第一个表达式,那么程序会把循环变量初始化为0,表示循环变量从0开始

#include<stdio.h>
int main()
{
	int i = 0;
	for (; i<10; i++)
	{
		printf("%d ",i);
	}
	return 0;
}

 注意:for循环中,除了省略第一个表达式不会导致程序死循环,其余的两个表达式省略其一或者两个都省略,程序都会死循环

for循环可以像while循环那样把循环变量调整部分放在循环体中吗?我的答案是:不建议,因为这也会可能导致出问题。下面举例子感受一下

#include<stdio.h>
int main()
{
	int i = 0;
	for (i=0; i<10; )
	{
		if (5 == i)
			continue;
		printf("%d ",i);
		i++;
		
	}
	return 0;
}

 可以看到打印结果光标一直不懂了,证明程序死循环了,程序的逻辑错误了,像上面while循环的的举例子那样,循环变量i被跳过了,程序不知道怎么办了。所以我不建议把for的循环变量调整部分放在循环体里边。

do  while循环

do
{
    //循环体
}while(循环条件);

教妹学Java(十七):do-while 循环_沉默王二的博客-CSDN博客

 可以看到,do  while循环是不管三七二十一,上来就是干(执行),然后执行了一次循环体后才判断。也就是说do while循环无论怎么样,最少会执行一次,但是使用的场景有限,直接上代码,我们还是打印0到9的数字

#include<stdio.h>
int main()
{
	int i = 0;
	do
	{
		printf("%d ", i);
		i++;
	} while (i < 10);
	return 0;
}

 do while循环跟while循环一样,循环变量调整是写在循环体里边的,如果循环体里边没有循环变量调整,那么程序就会变成死循环。我们来看看do while 中的break和continue,do while中的break

#include<stdio.h>
int main()
{
	int i = 0;
	do
	{
		if (5 == i)
			break;
		printf("%d ", i);
		i++;
	} while (i < 10);
	return 0;
}

 do while中的continue

#include<stdio.h>
int main()
{
	int i = 0;
	do
	{
		if (5 == i)
			continue;
		printf("%d ", i);
		i++;
	} while (i < 10);
	return 0;
}

 可以看到此时光标一直定再那里,说明程序的逻辑出问题了,因为循环变量调整被跳过了,i突然就没了,程序也不知道咋办了。正确做法:把循环变量i放到continue的上方,这样才能保证得到我们预期得到的结果。

总结

在while和 do while循环中,在用到continue时循环变量调整不要放在continue的后面,防止程序逻辑出错。在for循环中不建议把循环变量调整部分放在循环体中。

循环的应用

下面给大家写一个猜数字小游戏,这里的数字我设定了范围,是从1~100的数字

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
    printf("****************************************\n");
    printf("********** 1、Play  **********************\n");
    printf("********** 2、Exit  ***********************\n");
    printf("*****************************************\n");

}

void game()
{
    int ret = rand() % 100 + 1; //1~100之间的数
    //printf("%d",ret);
    while(1)
    {
        printf("请猜数字:");
        int input = 0;
        scanf("%d",&input);
    if( input == ret )
    {
        printf("恭喜你找到了\n");
        break;
    }
    else if( input < ret )
    {
        printf("猜小了\n");
    }
    else
    {
        printf("猜大了\n");
    }
    }

}

int main()
{
    srand((unsigned int) time(NULL));  //应使用函数将其初始化为某个独特的值。srand()初始化给个时间戳time可以一直变化
    int input = 0;
    do
    {
        menu();
        printf("请选择:");
        scanf("%d",&input);
        switch( input )
        {
            case 1:
                game();
                break;

            case 0:
                printf("退出游戏\n");
                break;
            default:
                printf("输入错误,请重新输入:");
                break;
        }
    }while( input );
    return 0;
}

  • 15
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值