目录
循环的基本概念
循环是编程中非常重要的一个概念,它可以让程序重复执行一段代码,直到满足某个条件才停止。在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(循环条件);
可以看到,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;
}