C语言循环语句详解(while,do while,for)

  1. while
  2. for
  3. do-while

while循环

在讲while之前先讲两个概念

  1. continue : 跳过continue后面的代码,跳到循环开始的地方。
  2. break : 永久终止循环。
while的循环原理

上课截的图
while(条件){
语句;
}
先不看continue和break,简单的概括就是,满足括号里的条件就继续执行,直到不满足为止。
实际操作就不演示的,应该一看就知道了。

getchar和putchar的原理

详细讲解原理在我的文章“getchar,putchar和缓冲区详解”里面有,这里只是简单的说下使用规则。
getchar就是在键盘上取得一个字符,以整数的形式存入(整数就是字符的ascii码)
putchar就是输出一个字符(以ascii码形式输出)在这里插入图片描述

如图,从键盘取得一个’a’,然后getchar把它储存起来(ascii形式)。之putchar把ascci码转换(‘97’转换成’a’,‘52’转换为’4’),所以就是上面的运行结果。(这里不过多阐述,详细见我的相关文章)。

for循环

  1. for循环的使用
    for(expr1;expr2;expr3){
    循环语句;
    }
    expr1是初始化(初始化一个或几个变量),expr2是条件判断,如果不符和就跳出循环,如果条件符合则执行循环语句,然后再执行expr3(调整)

当然for循环的三个部分是可以省略的,但不建议新手一开始就别乱省略,比如:

省略了for循环的判断部分
如果省略了for循环的判断部分的话,那么判断的调节就会恒为真,也就是会一直循环下去,然后身为新手的你就莫名其妙的整了一个bug。
当然,如果你能够很好的把控的话那又是另外一说了。

打印50个CSDN
在这里插入图片描述
这是没有乱省略的,但是如果乱省略的话:

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

这看起来和上面的差不多,i和j都一开始就赋值了,赋了0,是不是结果就一样?在这里插入图片描述
但结果其实是这个。

因为当第一轮循环执行完后,i的值是1,j的值是10,当第二次循环开始后,第二个for并没有给j赋初值0,j的值就还是10,于是没有打印,然后i变成了2,然后直到i=6后,打印结束。

  1. 执行过程上课截图的
    这里continue和break的用法是和while说到的一样的用法。

  2. continue和break的实操

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

这是输出0~9的代码,然后我只想输出0到5的数字在这里插入图片描述
就像上面这样,当5=i的时候,我用break跳出循环就达到目的了。
如果我想输出0~9除5的数字在这里插入图片描述
代码就像上面所写,当5=i的时候就用continue跳过后面的语句,所以我把continue放到前面来就实现了需求。

  1. 建议
    a.不要(尽量)在循环体内修改变量,防止失去控制。如:
for(i=0;i<10;i++)    //这是对的
for(i=0;i<10;)
i++                 //虽然结果一样但不建议,可能会出现问题

如:

int main() {
	int i = 0;
	for (i = 0; i < 10; i++) {
		if (5 == i) {
		continue;
		}
		printf("%d\n", i);

	}
	return 0;
}

原本是这样输出0到9除5,如果在循环体内修改变量:
在这里插入图片描述
就会是这样,光标一直在闪烁(表示程序还在运行),进入死循环。因为当i=5的时候,continue会跳过后面的语句,i++就没有执行,然后进入下一轮i还是5,然后一直循环。

b.建议for语句的循环控制变量的取值是“前闭后开区间”写法
比如,打印0到9

for(i=0;i<10;i++)      //[0,10),一般习惯是这样,而且相对这个看得习惯点
for(i=0;i<=9;i++)     //这就看得不是很习惯,当然结果也一样

当然并不是要死磕,还是要根据情况而定的,比如:

打印100到200

for(i=100;i<=200;i++)
	printf("%d ",i);      //这是[100,200]这没办法,如果写成下面这样就太不习惯了
for(i=100;i<201;i++)
	printf("%d ",i);      //这种写法就离谱至极

虽然结果一样但给人的感觉却不一样,所以还是要因具体情况来定,不要死磕。

  1. 使用多余一个变量控制循环
    如:在这里插入图片描述
    在这里插入图片描述
    相信不需要过多的阐述,但值得注意的是for条件判断表达式那里的’&&‘不可以写为’,'因为会被当成逗号表达式。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

它忽略了’i < 10’,只是运算了一下,但结果还是取’j < 10’。所以这个程序就不管 i 等于多少了,只判断 j 什么时候小于10(一共循环了8次),然后循环才结束。所以 i 是16(循环了8次), j 是10(循环了8次)

  1. 小陷阱
#include <stdio.h>
int main(){
	int i = 0, k = 0;
	for(i = 0, k = 0;k = 0;i++, k++){
		k++;
	}
	return 0;
}

它将会循环几次?

答案是不进行循环

因为for中间是判断条件,题目中是’k=0’,所以for进行判断的时候,中间表达式的结果是0(假),从而使条件不满足,for不进行循环。

#include <stdio.h>
int main(){
	int i = 0, k = 0;
	for(i = 0, k = 0;k == 0;i++, k++){
		k++;
	}
	return 0;
}

这样的话只会进行一次循环就结束。

do while

  1. 使用方法
do 
循环语句;
	while(表达式);

就是这么简单直接,和while的执行流程差不多,唯一的区别就是使用do while循环时候,不管满不满足条件,先做(所以叫do while)一遍再说,然后再进行判断是否满足条件。

  1. 执行流程
    在这里插入图片描述
    (自己按照图片做的,画的不怎么样,凑合着看就行)在这里插入图片描述
    这就使do while实用的场景,就是这么用,相信你一看就懂。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值