while的语法与if的语法结构类似,下面我们从它们的对比开始学习,if语句:
while语句:
可以发现if语句是判断括号中的表达式是否为真,比如上图就是判断n是否的等于1,如果判断结果为真,那么进入if,执行语句,但是只会执行一次,比如上图只打印了一个“hello world”。 但是while语句却在一直死循环地打印“hello world”,因为while的语法也是先判断括号中得表达式是否为真,上图就是判断n是否为1,如果判断为真,那么进入while执行语句,但是执行完要再次判断括号中的表达式结果是否为真,如果为真,那么就再进入去执行语句,上述例子可以看到,n没有改变,所以n=1是一直成立的,也就造成了代码死循环了。 总结:⾸先上来就是执⾏判断表达式,表达式的值为0,也就是假,循环直接结束;表达式的值不为0,即结果为真,则执⾏循环语句,语句执⾏完后再继续判断,是否进⾏下⼀次循环。
练习1:在屏幕上打印数字1~10 练习2:输入一个正整数,逆序打印它的每一位数字,比如输入1234,那么就打印4 3 2 1
答案放在文章最后
for 循环是三种循环中使⽤最多的, for 循环的语法形式如下:
for(表达式1; 表达式2; 表达式3)//注意表达式间用;隔开
语句;//如果循环体想包含更多的语句,可以加上⼤括号
表达式1用来初始化变量,表达式2用来判断循环条件,表达式3用来调整循环变量 for循环执行流程如下:
接下来我们将while循环和for循环进行对比来学习for循环,要求:在屏幕上打印数字1~10
while循环
for循环:
可以看出:for 和 while 在实现循环的过程中都有初始化、判断、调整这三个部分,但是 for 循环的三个部分⾮常集中,便于代码的维护,⽽如果代码较多的时候 while 循环的三个部分就⽐较分散,所以从形式上 for 循环要更优⼀些。
计算1~100之间3的倍数的数字之和
答案在文末
相较于while循环和for循环,do······while循环的使用是最少的,while 和 for 这两种循环都是先判断,条件如果满⾜就进⼊循环,执⾏循环语句,如果不满⾜就跳出循环,它的基本格式如下:
do
语句;
while(表达式);
do while 循环则是先直接进⼊循环体,执⾏循环语句,然后再执⾏ while 后的判断表达式,表达式为真,就会进⾏下⼀次,表达式为假,则不再继续循环,相当于至少会循环语句一次,循环之后再判断是否进入下一次循环。 学习了while循环和for循环,就比较好理解do······while循环,我们现在举一个同样的例子: 使用do······while循环实现:在屏幕上打印1~10的整数:
分析:首先初始化一个变量i为1,然后直接先执行一次循环内容,再到while判断循环条件。
要求:输⼊⼀个正整数,计算这个整数是⼏位数?
例如:输入1234,输出:4
答案在文末
在循环执⾏的过程中,如果某些状况发⽣的时候,需要提前终⽌循环,这是⾮常常⻅的现象。C语⾔中提供了 break 和 continue 两个关键字,就是应⽤到循环中的。 • break 的作⽤是⽤于永久的终⽌循环,只要 break 被执⾏,直接就会跳出循环,继续往后执⾏。 • continue 的作⽤是跳过本次循环中 continue 后边的代码,在 for 循环和 while 循环中有所差异的,而在while循环和do·····while循环中基本大同小异。
1.break: 试着思考如下代码的结果:
你的答案是不是1 2 3 4 5呢?那么就进入这个代码的陷阱了,它的正确答案应该是:
解析:当i等于5时,break直接跳出整个循环了,所以不会执行下面的打印语句,也就导致5没有被打印,所以答案是1 2 3 4
你的答案是1 2 3 4 6 7 8 9 10吗?很可惜,你又掉进坑里了,continue的作用是跳过当次循环continue后的代码,上图中continue跳过了打印5,但是同时也跳过了i的自增1,导致i其实还是5,重新判断循环时又会重复以上的动作,打印1 2 3 4后就进入了死循环:
如果把while循环换成for循环答案是什么呢?
这下答案就是上面说过的1 2 3 4 6 7 8 9 10,这下就只跳过了打印5,并不会死循环,因为continue只会跳过它后面的循环代码,而在for循环中,循环变量的调整并不在continue后,而在for循环里面,所以跳过5打印后,循环可以正常执行,这也是之前提到的在while循环和for循环中的continue会略有差异 while循环中使用continue如果跳过了变量的调整语句,那么就可能导致死循环,而for循环则没有这个顾虑。do······while循环和while循环大同小异,此处不再赘述。
此处我们举一个例子讲解循环的嵌套 要求:找出100~200之间的素数,并打印在屏幕上。注:素数⼜称质数,只能被1和本⾝整除的数字。 分析:
代码实现:
#include <stdio.h>
int main()
{
int i = 0;
for (i = 100; i <= 200; i++)//产生100到200的数字
{
int j = 0;//注意j要定义到for循环内部
//如果定义在外部,那么j不会被重置
//那么就无法每次循环都产生2到i-1的数字
int flag = 0;//flag作为一个标志,为0时表示i为素数
//为1时表示i不是素数
//它也需要每次循环重置,必须定义在内部
for (j = 2; j <= i - 1; j++)//产生2到i-1的数字
{
if (i % j == 0)
{
flag = 1;//如果i能够整除j,说明此时的i
//不是素数,就把标志flag调整为1
break;//现在我们已经知道i不是素数了,所以
//直接跳出循环
}
}
if (flag == 0)//这里的含义是,经过上面的循环如果
//flag没有被改为1,还是之前的0
//说明i没有被任何j整除,所以i是素数
printf("%d ", i);
}
return 0;
}
运行结果为:
C语⾔提供了⼀种⾮常特别的语法,就是 goto 语句和跳转标号, goto 语句可以实现在同⼀个函数内跳转到设置好的标号处。 例如:
解析:在前面我们定义了goto语句的标志next,然后在下面使用next就可以让代码直接从定义标志处,跳转到使用标志处,上图中就跳过了haha的打印 和continue语句进行对比,continue会跳过本次循环后的所有语句,而goto只是跳转到标志处 但是goto 语句如果使⽤的不当,就会导致在函数内部随意乱跳转,打乱程序的执⾏流程,所以我们的建议是能不⽤尽量不去使⽤;但是 goto 语句也不是⼀⽆是处,在多层循环的代码中,如果想快速跳出使⽤ goto 就⾮常的⽅便,因为跳出一个循环要用一个break,多个循环就要多个break,直接使用goto语句可以直接跳出,比如以下伪代码:
for(...)
{
for(...)
{
for(...)
{
if(disaster)
goto next;
}
}
}
next:
·····
可以看出如果想跳出多层循环,goto语句就非常实用。
(1)
(2)
解析:
答案一: 计算1~100之间3的倍数的数字之和
答案二:尝试着优化一下代码,如果能直接产⽣3的倍数的数字就省去了多余的循环和判断
答案: