入口条件循环:while循环
在执行多次循环之前之就已经决定是否执行循环
代码格式:
- while(关系表达式)
- 语句 //可以是以分号结尾的简单语句,也可以是用花括号括起来的复合语句。
关系表达式的结果有真(非0)执行
和假(0)不执行
两种状态
所以,我们发现while循环的终止条件很重要,要实现终止就必须让测试表达式的值产生变化,直到为假。while循环才可终止,否则,没有人为干预,它就不会停止(后面会学到使用if和break语句来终止循环,现在先不说
)
看下面代码:
- #include <stdio.h>
- #include <windows.h>
- int main(){
- int a=1;
- while (a<2)
- {
- printf("破军:攻击+200\t");
- Sleep(100);
- }
- return 0;
- }
这就是写了一个不能终止循环条件
的结果,还好我加了睡觉函数
,就这我平时风扇不转的电脑
就转了起来
。谨慎谨慎!!!
何时循环终止呢? 要明确一点,只有在测试条件为假时,也就是需要让条件动起来(easy)比如循环体加一个
a++
,也可以在测试条件的地方加,等等……好,
入口条件
- #include<stdio.h>
- int main(){
- int i=2;
- while (i++<1)
- {
- printf("执行了");
- }
- }
上面代码,我们一读就会发现2本就不小于1,况且i++,所以说不满足没有进去的机会,这就是入口条件
- #include <stdio.h>
- int main(){
- int i=1;
- while (i++ < 7);
- printf("i的值=%d\n",i);
- return 0;
- }
这个代码,while条件后面直接分号,其实就是空语句,它什么也不做,意思就是循环体是空语句,最后程序结束的条件i=8,理解理解。
只有在测试条件后面单独语句(简单语句或复合语句)才是循环部分
入口条件循环:很牛的for循环
重点理解
- for把(初始化,测试和更新)组合在一起处理
- for中的表达式也叫控制表达式,他们都是完整的表达式,所以副作用都发生在对下一个表达式求值之前。
- 可以省略一个或多个表达式(分号不能省哦),只要在循环体中包含能结束循环的语句即可。
- 第一个表达式不一定必须是给变量赋值,也可以使用printf();
- 语法格式
- for(i=1;i<=100;i++){
- 循环体
- }
- #include<stdio.h>
- int main(){
- int i;
- for (;i < 2;)
- {
- printf("%d",i);
- i++;
- }
- return 0;
- }
- #include<stdio.h>
- int main(){
- int i;
- for ( printf("请输入,输入2我就结束了\n"); i != 2;)
- {
- scanf("%d",&i);
- printf("%d\n",i);
- }
- return 0;
- }
- for(初始化表达式;测试表达式;更新表达式){
- //复合语句
- }
初始化表达式在执行for之前只执行一次,然后比较测试表达式得出结果是0不执行1执行,接着更新表达式的副作用发生,遍历循环体,然后继续重复检查判断的步骤,直至测试表达式结果为0,退出循环
出口条件循环:do while循环
while和for都是入口条件循环,就是在循环之前检查条件,所以会有一次也不执行循环体的情况。因此,引入do while 先执行循环体,然后再去判断是否要进行下一次迭代,它能够使得程序至少执行一次。
代码格式:
- do
- 语句;
- while(条件);
注意:do while 循环以分号结尾,do while适用于那些特殊的至少要迭代一次的程序。
真值问题
什么是真?
在C中,表达式一定有一个值,关系表达式也不例外。那么我们通过代码来让计算机自己说说它认为的真假指的是什么。
- #include<stdio.h>
- int main(){
- int a,b;
- a=(1+1==2);
- b=(1+1==1);
- printf("true = %d; false = %d",a,b);
- return 0;
- }
原来如此!对C而言,表达式为真的值是1,表达式为假的值为0
由此,死循环就非常简单了,比如信息轰炸就可以通过死循环结合windows库来实现。是不是非常的easy呢。
- while(1)
- {
- ……
- }
1被C视为真,其他值呢,继续通过代码来试试
- #include<stdio.h>
- int main(){
- int i=2;
- while (i)
- printf("%d is true\n",i--);
- printf("%d is false\n",i);
- i=-2;
- while (i)
- printf("%d is true\n",i++);
- printf("%d is false\n",i);
- return 0;
- }
我们发现在C中
好像真假
就是非0
和0
,
- #include<stdio.h>
- int main(){
- int a=3;
- while (a)
- {
- printf("again");
- scanf("%d",&a);
- }
- return 0;
- }
关系运算符和表达式比较
while循环经常依赖测试表达式作比较,这样的表达式被称为
关系表达式
,出现在关系表达式里的运算符叫做关系运算符
。
下面复习下C语言的所有关系运算符
- < //小于
- > //大于
- >= //大于或等于
- <= //小于或等于
- == //等于
- != //不等于
用关系运算符
来构造关系表达式
,通过关系表达式的真假
决定一些操作
两个库函数fabs()和abs()
fabs()是需要包括math
库的,它是对浮点数取绝对值的函数
abs()是在stdio
库中的,它是对整数取绝对值的函数
举个栗子:
- #include<stdio.h>
- #include<math.h>
- int main(){
- double i = -3.12;
- int a=-3;
- printf("%f\n",fabs(i));
- printf("%d",abs(a));
- return 0;
- }
布尔类型_Bool
两种方法:
1.自己定义仿布尔型
2.C99为兼容C++,可以使用头文件,通过bool来使用布尔类型
1
- #define TRUE 1
- #define FALSE 0
- #include<stdio.h>
- int main(){
- _Bool a=1;
- _Bool b=2;
- _Bool c=0;
- _Bool d=-1;
- printf("a==%d \n",a);
- printf("b==%d \n",b);
- printf("c==%d \n",c);
- printf("d==%d \n",d);
- printf("sizeof(_Bool)==%d \n",sizeof(_Bool));
- return 0;
- }
2.
- #include<stdio.h>
- #include<stdbool.h>
- int main(){
- bool a = true;
- bool b = false;
- printf("a==%d b==%d\n",a,b);
- printf("sizeof(_Bool) == %d \n",sizeof(_Bool));
- return 0;
- }
优先级
简单概括:
括号 > 单目 > 算术 > 移位 > 关系 > 赋值
遇到就记住就了
其他赋值运算符
用右侧的值,根据指定的操作更新左侧的变量
- a+=b //a=a+b
- a-=b //a=a-b
- a*=b //a=a*b
- a/=b //a=a/b
- a%=b //a=a%b
好处:1. 代码紧凑 2.比较类似机器语言,这样书写代码执行效率高
逗号运算符
逗号运算符把两个表达式连接成一个表达式,并保证最左边的表达式最先求值
逗号运算符扩展了for循环的灵活性,以便在循环头中包含更多的表达式
逗号运算符并不局限于for循环中使用,只是在循环中最常用
任何表达式的后面加上了分号就是表达式语句
逗号也可以做分隔符
应用:
- #include<stdio.h>
- int main(){
- int a,b;
- for(a=2,b=3;b<10;a+=1)
- b+=a;
- printf("%d",b);
- }
如何选择循环
- 首先,确定需要得是入口条件循环还是出口条件循环
- 一般,当涉及初始化和更新变量时,用for循环比较好,而在其他情况下用while循环更好。
- 还有,那个特殊的比如至少要循环迭代一次的选择 do while
嵌套循环
指的是一个循环内包含另一个循环。
嵌套循环常用于按行和按列显示数据,一个处理所有的列,一个处理所有的行。
内层和外层循环,简单说,外层循环动一下,内层循环遍历所有,外层再动一次,内层依旧遍历所有,外层结束,内层也就和结束。
通过简单的99感冒灵(),哦,不对,99乘法表来练练理解理解
99乘法表分析
大概实现这样
分析:
- 想想打印一个直角三角形出来
- 我需要嵌套for,第一个for用来显示行,一共有9行,第二个内层for打印列,我们观察99乘法表,第一行一列,对二行二列,以此类推……第九行九列,不难发现所以去哦只需要把它的判断和行联系起来,怎样的联系,只要小于等于行就,
- 然后我在打印每一列的时候加一个水平制表符(*4个空格的·长),最后内层循环结束后在内层循环外for循环内加上一个换行符,显示出9行。最后把打印的替换成运算就完事。实践起来吧
- #include<stdio.h>
- int main(){
- for (int i = 1; i <= 9; i++){
- for(int j=1;j<=i;j++){
- printf("1\t");
- }
- printf("\n");
- }
- return 0;
- }
替换
- #include<stdio.h>
- int main(){
- for (int i = 1; i <= 9; i++){
- for(int j=1;j<=i;j++){
- printf("%d*%d=%d\t",i,j,i*j);
- }
- printf("\n");
- }
- return 0;
- }
基本OK,enn就用这个简单栗子深刻领会,你会收益很大
小结
循环是一个强大的编程工具
,C中提供了,while , for , do while 三种循环
,学习完你将掌握C的全部循环体系,按入口出口可以分为两类,入口:while , for 出口: do while
,在创建循环时
,我们要注意循环的测试条件得能使得循环结束
,循环测试中的值在使用前已经经过了初始化
,确保循环体每次都有迭代更新的值
。清晰得认识三种循环得使用场景
。此外,还有一些运算符,布尔值,优先级,库函数得零碎知识学习,它们也一样重要
想去新海诚的动漫里散个步,顺便吃个天。
到此这篇关于C语言控制语句之 循环的文章就介绍到这了,更多相关C控制语句内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/m0_53321320/article/details/118517788