写这篇文章,我深有感触,在写代码的过程中,我们经常会出现最后的结果达不到我们预期的效果的情况,我们一定一定要耐下心来,一步一步地去思考,是哪里出了问题,怎么能解决问题,这样的一个过程是十分重要的,是能让我们越来越接近真相的过程。学习编程的路肯定不是一帆风顺的,但我们要有能够克服任何苦难的决心,这是最重要的。


在这篇文章中,我们将会对循环语句有一个更加深入的了解

并且我们还能了解到getchar与putchar的相关知识

让我们开始吧!

目录

一.while循环

1.while循环语法

2.break和continue 在while循环中

(1).break

(2).continue

3.两个代码的练习

第一个代码

第二个代码

二.for循环

1.for循环语法

2. break和continue在for循环中

(1).break

(2).continue

continue在for循环和在while循环中有所不同

三.do...while()循环

1.do...while()循环的语法

2.break和continue在do...while循环中

(1).break

(2).continue



一.while循环

1.while循环语法

while语句又称当型循环语句,其语法为:

while (表达式)

 循环语句

其具体执行过程如下:

(1)计算表达式的值。若为真,则转步骤(2),否则退出循环,执行while的下一条语句

   (2)执行循环语句(即循环体),并返回步骤(1) 

 

 这里试着使用while循环打印1~10的数

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

2.break和continue 在while循环中

(1).break

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

运行的结果如图

总结:

break在while循环中的作用

其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环

所以:while中的break是用于永久终止循环的。

(2).continue

如果将刚刚的break换成continue

那么运行的结果又会发生什么变化呢?

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

4后面的光标在闪动,说明此时程序进入了死循环 

原因是,与break语句不同,

continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接 跳转到while语句的判断部分。进行下一次循环的入口判断

如图中红色框框内的代码在continue的作用下会被跳过,i++不会被执行,所以i就一直为5,进去死循环

3.两个代码的练习

让我们再看两个跟while循环有关的代码,再看之前,我们需要先了解一下getchar和putchar

getchar

在msdn中,我们查找到getchar的解释

int ch = getchar() ;   //获取字符

printf("%c\n",ch) ;       //打印获取的字符

这里我们会有这样的疑问:我们的 ch 获取的是一个字符,为什么放到int整型里去?

原因有两个

  1. 虽然getchar返回的是个字符,但是字符的存储值是它的 ASCII码值,如 ’a‘对应的ASCII码值就是97
  2. getchar读取失败的时候返回EOF,而EOF是-1,是个整数

getchar - 获取(输入一个字符)

putchar - 输出一个字符

putchar

在msdn中的定义

int ch = getchar() ;   //获取字符

putchar (ch);//输出一个字符

getchar 和 putchar 可以用scanf 和printf代替,且scanf和printf的功能更全,getchar和putchar只能操作字符 

第一个代码

这个代码会将你输入的字符打印出来,如果想停止:ctrl+z 可以让getchar返回一个EOF

我们写这样的代码有什么意义呢?实际上是有意义的,我们这里再举一个例子

#include <stdio.h>
int main()
{char input[20] = { 0 };//创建一个数组printf("请输入密码:>");scanf("%s", input);printf("请确认密码(Y/N):>");int ch = getchar();if (ch == 'Y'){printf("确认成功\n");}else{printf("确认失败\n");}return 0;
}

看这个代码时,可能会有疑问,为什么scanf函数里的input没有取地址,

是因为数组名本身就是一个地址,所以不需要再取地址


这样一个程序,我们的本意是输入密码后需要用户确认密码是否正确,可当程序走起来后我们发现,在我们还没有输入时,已经打印出了“确认失败”

下面我们就来分析一下程序出问题的原因 ,全部在这张图上了

解决方法 :把输入缓冲区里scanf没有拿走的\n拿走 ,改进如下

#include <stdio.h>
int main()
{char input[20] = { 0 };//创建一个数组printf("请输入密码:>");scanf("%s", input);getchar();   //拿走\nprintf("请确认密码(Y/N):>");int ch = getchar();if (ch == 'Y'){printf("确认成功\n");}else{printf("确认失败\n");}return 0;
}

我们成功了!!!

下面是还可能出现的错误的情况:如果密码当中有“ ”(空格)

当用户输入的密码中含有空格时,又出现了刚刚的错误的情况,我们再来分析

我们可以发现这时需要拿走更多的字符,所以我们使用while循环 

while ((tmp = getchar()) != '\n')  //只要不是/n,就说明没拿完,就进入循环
    {
        ;                                             //空语句(什么也不干)
    } 

#include <stdio.h>
int main()
{char input[20] = { 0 };//创建一个数组printf("请输入密码:>");scanf("%s", input);int tmp = 0;while ((tmp = getchar()) != '\n')//只要不是/n,就说明没拿完,就进入循环{;//空语句(什么也不干)}printf("请确认密码(Y/N):>");int ch = getchar();if (ch == 'Y'){printf("确认成功\n");}else{printf("确认失败\n");}return 0;

我们惊喜地发现,我们又通过改变代码使这个程序执行成功了!

第二个代码

#include <stdio.h>
int main()
{int ch=0;while ((ch = getchar()) != EOF){if (ch < ‘0’ || ch > ‘9’)continue;putchar(ch);}return 0;
}

这个代码就比较简单了 就是只打印0~9的数字

但有一点需要说明

这个括号不能少((ch=getchar())!=EOF) 如果少了 ,就不是把获取的字符放进ch和EOF比较了,而是字符直接与EOF比较,不相等就为假,就为0,这时就把0赋给了ch 

二.for循环

1.for循环语法

for循环的语法:

for (表达式1;表达式2;表达式3)

     循环语句;

 表达式1

表达式1为初始化部分,用于初始化循环变量的。

表达式2

表达式2为条件判断部分,用于判断循环时候终止。

 表达式3

表达式3为调整部分,用于循环条件的调整。


这里我们同样也使用for循环来打印一下1~10的数来熟悉一下for循环

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

并且,我们用这个代码为例,来帮助我们理解for循环的流程图

现在我们对比一下for循环和while循环

int i = 0;
//实现相同的功能,使用while
i=1;//初始化部分
while(i<=10)//判断部分
{printf("hehe\n");i = i++;//调整部分
}
//实现相同的功能,使用while
for(i=1; i<=10; i++)
{printf("hehe\n");
}

可以发现在while循环中依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离 较远,这样查找修改就不够集中和方便。所以,for循环的风格更胜一筹。 for循环使用的频率也最高。 

2. break和continue在for循环中

我们发现在for循环中也可以出现break和continue,他们的意义和在while循环中是一样的。

但是还是有些差异:

(1).break

可见,break在for循环中与在while循环中类似,都是直接终止循环 

(2).continue

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

continue在for循环和在while循环中有所不同

这里执行起来并不是死循环了,而是跳过5打印了1 2 3 4 6 7 8 9 10

当i==5时,执行continue语句,跳过printf语句 ,执行 i++,之后 i为6,i==5为假,continue语句不再执行 


for语句的循环控制变量 (作为补充)

一些建议:

  1. 不可在for 循环体内修改循环变量,防止 for 循环失去控制。
  2. 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
int i = 0;
//前闭后开的写法
for(i=0; i<10; i++)
{}
//两边都是闭区间
for(i=0; i<=9; i++)
{}

第一种也就是前闭后开的写法很直观,这个循环要循环10次(但不是总是如此)

一些for循环的变种 

#include <stdio.h>
int main()
{//变种1for(;;){printf("hehe\n");}//变种2int x, y;for (x = 0, y = 0; x<2 && y<5; ++x, y++){printf("hehe\n");}return 0;
}

变种1

 for的初始化,判断,调整三个部分都可以省略

 中间的判断部分如果省略,意味着判断恒为真,就构成死循环

如果条件允许,不建议省略for循环的3个表达式 

这里看一个嵌套的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("hehe\n");}}return 0;
}

在正常情况下,这个程序会3次外循环,3次内循环,共9次 打印9次hehe

我们现在试一下省略for的第一个初始化语句

#include <stdio.h>
int main()
{int i = 0;int j = 0;for (;i < 3;i++){for (;j < 3;j++){printf("hehe\n");}}return 0;
}

结果只打印了三次, 原因是 虽然外循环还是3次,但内循环由于 j 没有初始化,在内循环第3次后,j就变成了4,内循环不再执行

变种2 

使用多于一个变量控制循环,这是允许的

for (x=0,y=0;x<2&&y<5,++x,y++)


这里,我们再拓展一道笔试题

请问循环要循环多少次?

//请问循环要循环多少次?
#include <stdio.h>
int main()
{int i = 0;int k = 0;for(i =0,k=0; k=0; i++,k++)k++;return 0;
}

答案是0次  

原因是这里的红色框中的 k=0是赋值,k被赋值为0,0为假,循环不执行

三.do...while()循环

1.do...while()循环的语法

do

         循环语句;

while  (表达式);

我们再用do...while循环来试着打印1~10的数


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

do..while的特点是:循环至少执行一次,使用的场景有限,所以不是经常使用。

流程图

 

 

 

2.break和continue在do...while循环中

(1).break

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

 

可见,break在三个循环中较为类似,都是直接终止循环,但是值得注意的是: break只能终止一层循环,如果有刚刚那种嵌套式的循环,只能终止一层

(2).continue

 

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

运行的结果是1 2 3 4死循环

循环语句(while,for,do...while)相关推荐

  1. day1---while循环语句和练习

    1 # -*- coding:utf-8 -*- 2 ''' 3 一.while循环语句: 4 while 条件(可以是比较运算,布尔值等): 5 循环体:(需要包含终止循环语句(否则就是死循环) 6 ...

  2. java for嵌套for循环语句_java中的for循环嵌套语句怎么执行?

    展开全部 控制语句--for:语句的嵌套应用:累加求和,计数器:循环嵌套. 一.语62616964757a686964616fe58685e5aeb931333365646232句的嵌套应用 语句嵌套 ...

  3. 单片机c语言中的循环语句,单片机c语言教程:C51循环语句

    循环语句是几乎每个程序都会用到的,它的作用就是用来实现需要反复进行多次的操 作.如一个 12M 的 51 芯片应用电路中要求实现 1 毫秒的延时,那么就要执行 1000 次空语句 才能达到延时的目的( ...

  4. 用python循环语句求素数_Python基础入门_3条件语句和迭代循环

    Python 基础入门前两篇: Python 基础入门--简介和环境配置 Python基础入门_2基础语法和变量类型 这是第三篇内容,主要简单介绍条件语句和迭代循环语句,内容也比较简单,目录如下: 条 ...

  5. shell脚本求和_【零基础学云计算】Shell编程之case语句与循环语句

    case多分支语句 循环语句 for循环语句 while循环语句 untli循环语句 Shell函数 Shell数组 case语句的结构 针对变量的不同取值,分别执行不同的命令序列 case 变量值 ...

  6. 用c语言循环语句,C语言中循环语句有哪些具体怎么用

    C提供三种基本的循环语句:for语句.while语句和do-while语句. 一.for循环 for循环是开界的. 它的一般形式为: for(;;) 语句; 初始化总是一个赋值语句,它用来给循环控制变 ...

  7. python无限循环条件循环_Python - 条件控制、循环语句 - 第十二天

    Python 条件控制.循环语句 end 关键字 关键字end可以用于将结果输出到同一行,或者在输出的末尾添加不同的字符,实例如下: Python 条件语句是通过一条或多条语句的执行结果(True 或 ...

  8. c语言中floox的头文件,PC-1211袖珍计算机在合成氨厂生产中的应用 第五讲 循环语句(FOR-NEXT语句)...

    PC-1211袖珍计算机在合成氨厂生产中的应用 第五讲 循环语句(FOR-NEXT语句) 在化工生产中为了分析两个或两个以上参数对生产的影响往往需要进行某些有规律的重复计算.这些计算在程序中可以用赋值 ...

  9. 试过不用循环语句撸代码吗?

    译者按: 通过使用数组的reduce.filter以及map方法来避免循环语句. 原文: Coding Tip: Try to Code Without Loops 译者: Fundebug 为了保证 ...

  10. for循环 lamda python_Python中if-else判断语句、while循环语句以及for循环语句的使用...

    1. if-esle流程判断语句 我们来直接看一个例子,如下,判断我们定义的用户名和用户输入的用户名是否一致.代码当中有几个注意点: 判断的时候用双等号表示判断是否一致(三个等号表示赋值) 你有没有注 ...

最新文章

  1. flutter依赖某些插件,点击运行会出现错误
  2. Python 是否是下一个 PHP?为什么?
  3. Django web : CSRF verification failed. Request aborted.
  4. LeetCode:Spiral Matrix I II
  5. 快速提高CSDN访问量 - 附脚本初代机
  6. win10下docker如何安装?
  7. 利用圆解一元二次方程
  8. syslog-ng配置说明
  9. 2018 LC3见闻
  10. vue 打印 某块内容成pdf
  11. 怎么让模糊的数字变清楚_如何用ps将模糊图片变清晰?
  12. 计算机专业英文面试,计算机专业面试英文自我介绍
  13. 瞎琢磨先生のJava笔记之读取SpringBoot配置文件的几种方式
  14. OK1028A-C实现路由器功能
  15. 在被线上大量日志输出导致性能瓶颈毒打了很多次之后总结出的经验
  16. CF1293E Xenon‘s Attack on the Gangs
  17. 火车头怎么采集头条规则写法
  18. 居家学习:新冠肺炎疫情下中国高校基于直播的远程教育体验的混合方法分析
  19. 单例模式-基类单例。。用于其他单例的派生
  20. 2017年网易实习程序员面试题

热门文章

  1. SQL语言基础及数据定义功能
  2. 如何在Ubuntu上方便使用OpenAI API key
  3. 服务器导出excel文档,服务器导出excel功能配置
  4. 求大神指导,海康威视服务器装系统装到这一步装不走了,怎么搞
  5. 科兴新冠疫苗获准紧急用于巴西3至5岁儿童
  6. vue input输入框联想输入
  7. cisco(思科)交换机操作(基本查询命令)【一】
  8. 大学计算机专业学高数吗,数学差‍的学生,大学最好别选这几个专业,不然将来恐难毕业...
  9. 我的心只悲伤七次-纪伯伦
  10. 【Android】二进制图片和Bitmap的getPixel方法解析