C语⾔——循环结构详解(while、for、dowhile循环)⽬录
while循环
⾸先我们先来看看while循环的语法结构:
while(表达式)
循环体;
它的意思是,如果表达式为真,循环体就⼀直执⾏。
来看⼀个简单的实例:使⽤while循环打印⼀下变量1-10
是不是很简单呢?
但是在以后的代码中,我们还会遇到像break、continue这样的语句。让我们⼀起来看看。
break和continue
break:在while循环中,break⽤于永久终⽌本次循环。
continue:在while循环中,continue⽤于跳过本次循环中continue后⾯的代码,直接去判断部分,看是否进⾏下⼀次循环。
听起来是否有点费⼒?没关系,我们⽤代码实现⼀下。
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
continue;
printf("%d ", i);
i++;
}
return 0;
}
思考⼀下,运⾏结果会是怎样的?会不会打印出5呢?答案是否定的。
为什么会产⽣这种结果?
i=4之前,循环都是正常进⾏的。当i的值为5时,满⾜if⾥⾯的表达式“i==5”,执⾏continue语句,跳过本次循环中剩下的“printf("%d ", i);与 i++;”,跳过“printf("%d ", i)”时,⾃然不会打印5,同时,也跳过了“i++”,⽆法实现变量的递增,因此结果只打印到4。
getchar和putchar
明⽩了break和continue的原理后,我们接着来分析⼀个代码:
#include<stdio.h>
int main()
{
int ch = 0;
while ((ch = getchar()) != EOF)
putchar(ch);
return 0;
}
这段代码中出现了两个陌⽣的东西:getchar和putchar,⼀起来认识⼀下。
getchar():从键盘获取⼀个字符。不是真的直接从键盘读,getchar和键盘中有⼀个缓冲区,当键盘没有输⼊时,缓冲区⾥什么都没有,当我们从键盘上输⼊a并按enter时,其实相当于给缓冲区放⼊了“a”和“\n”。
getchar()的⼯作原理:从⼀个stream上读取⼀个字符,或从⼀个stdin上得到⼀个字符(注意是⼀个)
那么什么是stream呢?
stream:标准输⼊,也就是从键盘输⼊
它的返回类型是int类型,为什么?
int ch = getchar();
因为当正确读取的时候,返回的是字符的ASCII码值,错误读取的时候,返回的是EOF(end of file⽂件结束标志),EOF的本质是-1。⼩tips:运⾏程序时,按快捷键crtl+z读取就会结束
putchar():输出⼀个字符
⽰例:
putchar(ch);
我们来分析下这段代码:
#include<stdio.h>
int main()
{
char password[20] = { 0 };
printf("请输⼊密码:>");
scanf("%s", password);//为什么没有取地址?password是个数组数组的数组名本来就是个地址
printf("请确认密码(Y/N):>");
int ch = getchar();
if (ch == 'Y')
printf("确认成功!\n");
else
{
printf("确认失败~\n");
}
return 0;
while语句简单例子}
它的思路是这样的:电脑让我们输⼊密码,我们输⼊⼀串字符,然后按Y或N来确认。
但是我们运⾏的时候发现,还没有输⼊Y或N,直接就确认失败了,
问题到底出在哪⾥?
不管是getchar还是scanf,这些输⼊函数都要去中间的缓冲区拿东西。⽽当我们输⼊完密码后,还会按⼀下enter,enter会触发scanf去读内容,当读取的时候,只把输⼊的密码拿⾛,不会拿enter导致的“\n”,程序继续执⾏,getchar直接就把缓冲器⾥⾯的“\n”拿⾛放在“ch”⾥⾯,“\n”不等于“Y”,执⾏else后⾯的语句,所以直接就输出了确认失败。
显然,这和我们的预期是不符的,那要怎么解决呢?
让缓冲区⾥没东西,清除掉\n,清理缓冲区
怎么清理?见下⽅代码:
/
/清理缓冲区
getchar();//处理\n
int ch = getchar();
if (ch == 'Y')
printf("确认成功!\n");
else
{
printf("确认失败~\n");
}
运⾏结果如下,可见,我们成功的清除掉了缓冲区⾥⾯的“\n”。
但是我们⼜会发现,当密码含空格时,也会直接输出“确定失败”,这⼜是为什么?
(假如我们输⼊的密码为“123 abc")因为空格前的(123)会被scanf拿⾛给password,⽽剩下的字符(abc)仍在缓存器中,
⽽getchar只能读取⼀个字符,⽤刚刚的⽅法就不能把剩下的东西清理⼲净,怎么清理掉剩下的东西?这时候就要⽤到while循环了。
在if else语句前加⼊这个while循环:
//清理缓冲区中的多个字符
int tmp = 0;
while ((tmp = getchar()) != '\n');
{
;
}
int ch = getchar();
好了,现在我们来⼩⼩的总结⼀下while循环,它分为三个部分:初始化部分、判断部分和调整部分。
int i = 1;//初始化
while (i <= 10)//判断部分
{
printf("%d ", i);
i++;//调整部分
}
但是当代码⽐较长的时候,区分这三个部分就会⿇烦,⽽for循环结构就很⼀⽬了然。
for循环
先来看看for循环的基本语法
for(表达式1;表达式2;表达式3)
循环语句
for循环中的表达式1、表达式2、表达式3分别对应while循环的三个部分:初始化部分、判断部分和调整部分。三个部分放⼀起,从形式上讲优于while循环。
我们来⽤for循环打印1-10:
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
printf("%d ", i);
}
return 0;
}
是不是更简洁了呢?
来看看for循环的操作流程:
在for循环中,同样会遇到break语句和continue语句。
for循环⾥的break也是⽤于终⽌整个循环。
continue跳过本次循环,会执⾏下⼀次循环。
那么while循环和for循环⾥⾯的continue语句有什么区别呢?
while循环可能会跳过调整部分,⽽for循环不会。
⼀些建议:
1. 不要在循环体内修改循环变量,防⽌for循环失去控制
2. 建议for语句的循环变量采取“前闭后开”的写法
如果判断部分省略的话,会判断部分恒为真,循环就可能会出现⼀些问题,所以不建议⼤家随便省略。我们来看⼀个例⼦:
#include<stdio.h>
int main()
{
int i = 0;
int j = 0;
for (i = 0; i <3; i++)
{
for (j = 0; j < 3; j++)
{
printf("apple\n");
}
}
return 0;
}
会输出⼏个“apple”呢?

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。