在c语言中,循环结构是一个重要的部分。在此,对循环结构相关知识进行梳理,以帮助更好的理解。
一、while循环
while()需要三个必要的行为:
1.初始化
2.判断(测试)
3.更新
缺少以上三种行为之一都可能会导致程序进入死循环。
int main()
{
int a=1;//初始化计数器
while(a<10)//判断(测试)
a++;//更新
//当需要执行多条语句时
while(测试)
{
语句1;
语句2;
a++;
}
return 0;
}
在使用while()语句时,遇到一个问题:在遇到多组输入的时候,应该怎么办?如下题:
在题目中,有多组输入,需要分别对多组输入比较大小,但具体有几组输入未知,在这种情况下该怎么办?通过查阅资料,得到了解决办法:超详解 - 如何理解C语言中while(scanf(“%d“, &num) != EOF)这一表达式?_!=eof-CSDN博客
scanf()会返回成功读取的数据的个数,如果读取失败,则会返回EOF。
因此,可以使用while(scanf("%d",&a)!=EOF)来对函数的循环入口进行控制。
二、for循环
for()函数与while函数最大的区别是将三种行为组合在一起。
for(初始化;判断;调整)
int main()
{
int a;
for(a = 1/*初始化*/;a<10/*测试*/;a++/*调整*/)
语句;
return 0 ;
}
值得注意的是,for(initialize(表达式1);test(表达式2);update(表达式3))
表达式1只执行一次,并且除了给变量赋值,也可以执行printf()函数;
任意语句都可以省略(但分号不能省略),但省略表达式二(test)会导致一直判断为真,使循环一直运行;
表达式三(update)除了类似于a++此类的递增语句,可以使用任意合法的表达式,只需要在每次迭代时能够更新表达式的值即可;
for循环中的3个表达式可以是不同的变量(可以但并不推荐,易造成混淆)
三、do ...while循环
while()和for()循环都是入口条件循环,而do while()则是出口条件循环。do while会在判断条件的真假之前执行一次。若while条件为真,则继续执行,为假或为零时则停止。
int mian()
{
do
{
statement
}
while(expression);//注意这里while()后面一定有一个分号
return 0;
}
四、goto语句
goto语句可以进行跳转。
int main()
{
goto loop;//(从这里直接跳转到loop)
xxx;
xxxx;
loop://注意这里后面是冒号
xxxxxxx;
return 0;
」
值得注意的是,loop可以用其他的非关键字替代;loop可以在goto 语句的上面,也可以在goto语句的下面;慎用goto语句,因为滥用goto语句很可能导致程序出错。
五、continue&break
一般而言,程序进入循环后,在下一次循环测试之前会执行完循环体的所有语句,而continue语句与break语句的作用是根据具体的条件忽略一部分循环内容,但在具体的实现功能上,两者有所差别。
continue会使程序跳过本次迭代的剩余部分,并开始下一轮迭代。
//求10-20之间的奇数
int main()
{
int num;
for(num=10; num<=20; num++)
{
if(num%2==0)
continue;//判断出num是偶数,就直接进行下一次迭代,略过printf()
printf("%d\n",num);
}
return 0;
}
break则会使程序直接终止包含它的循环,并继续执行下一阶段。
//求100-200之间的素数
int main(void)
{
int num = 100;
int check;
int div =1;
for(num = 100;num<=200;num++)
{
check = 0;
for(div=2;div< num;div++)
{
if(num%div==0)
break;//直接终止内层嵌套的for循环,开始检查下一个num是否是素数
else if(num-div==1)
check =1;
}
if(check==1)
printf("%4d",num);
}
return 0 ;
}
值得注意的是,不管是break语句或者是continue语句,都只会影响包含他的当前循环。换言之,如果在两层及以上的循环中使用continue或break,需要注意continue与break究竟影响的是哪一个。
p.s.笔者在学习的时候犯了一个很奇怪的错误:以为break与continue会影响if语句,而在做题时得出了错误的结果!if语句是分支结构,并不是循环结构,break与continue并不会直接影响到它。究其原因,可能是笔者在学习switch语句时有所混淆。
六、注意=与==
笔者在学习循环时,在循环的判断上经常犯一个问题,我想这也是所有初学者都容易犯的问题:while(num=1)
本意是想判断num是否为1,结果==不小心写成了赋值符号=,就导致num在执行到这里总会被赋值为1,对于while即是条件总是为真(即经常用到的while(1)),从而导致循环体一直执行,成为死循环。
因此,可以养成习惯,写成while(1==num)。由于C语言并不支持赋值给常量,所以如果将==误写成=,编译器会报错,由此可以进行检查。
关系运算符用于构成关系表达式,关系表达式为真时值为1,假时值为0。通常用关系表达式作为测试条件的语句可以使用任何表达式作为测试条件,非零为真,零为假。
欢迎大家在评论区交流!行文难免错漏,恳请大家斧正~