上期我们深入学习了分支语句,如果还不是很了解点开我主页去找到分支语句学习吧!
本篇文章内容顺序是紧接着分支语句。
人生就是日复一日地不断重复,既有相同的事情,也有相似的事情,却无论如何也无法回到最初!
接下来介绍三种循环语句:
通俗地讲,如果掌握了if语句,那么while语句对你来说也是很简单的,只不过区别就在于前者只会执行一次,后者循环执行。
while语句语法结构和写法:
int main()
{
while (1)
{
puts("666");
}
return 0;
//会输出什么?
}
注意:写法和if相似,并且大括号问题与if相同,这里不在赘述,具体请看上一篇。
int main()
{
while (1)
{
puts("666");
}
return 0;
//会输出什么?
}
运行结果:
死循环下去,因为while后面的表达式值是1,永远为真,所以循环语句会一直打印。
(过于简单,在座的各位没有不会的吧?)
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d ", i++);
}
return 0;
}
break大家应该不陌生,在分支语句switch里讲到过,它的作用是跳出当前switch语句。那么在循环里的作用还是这样吗?
还是拿上面的例子:
int main()
{
int i = 1;
while (i <= 10)
{
if(5 == i)
break;
printf("%d ", i++);
}
return 0;
}
这时候打印什么呢?
A. 1 2 3 4
B. 1 2 3 4 5
C. 1 2 3 4 5 6 7 8 9 10
D. 1 2 3 4 6 7 8 9 10
运行结果:
这里打印完4,i++变成5,if语句成立执行break,终止循环,不再执行下列语句。
break在while循环中的作用:
其实在循环中只要遇到break,就停止后面的所有的循环,直接终止循环。
所以:while中的break是用于永久终止循环的。
那把上面代码中的break换成continue结果是什么?
结果是1 2 3 4并且光标还一直闪程序陷入了死循环,为什么会这么呢?给大家解释下continue的在循环里的作用:
continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,
而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。
因为continue会直接跳到循环判断部分,下面的i++没法执行,if条件一直成立所以程序会死循环。
那么再改一下上面的代码,这时运行的结果是什么?
int main()
{
int i = 1;
while (i <= 10)
{
i++;
if(5 == i)
continue;
printf("%d ", i);
}
return 0;
仔细想想
}
运行结果:
2~11没有打印5,原因是当i为5的时候执行continue,直接跳到判断部分,因此下面的语句没有执行。
总结: while循环中的break是用于终止循环,continue是跳过本次循环中后面的代码,直接跳到判断部分进行下一次的循环判断。
我们已经知道了while循环,但是我们为什么还要一个for循环呢?
举个例子,用while打印1-10:
main()
{
int i = 1;
//初始化部分
while (i <= 10)//判断部分
{
printf("%d ", i);
i++;
//调整部分
}
}
//我开始偷懒了,主函数返回类型和返回值都没写,可以但不建议。
这三个部分任何一个发生了变化就很容易对整个循环的逻辑产生影响,但是有个问题,这三个部分的位置比较分散,如果这段代码很长,想修改这个循环,就需要找到这三个部分,如果不小心修改错了代码就会出现问题,所以有个更好的方式,也就是接下来要介绍的for循环,这个循环是用到的最多的一种循环。
for循环语法形式:
for(表达式1; 表达式2; 表达式3)
{
循环语句;
}
表达式1
表达式1为初始化部分,用于初始化循环变量的。
表达式2
表达式2为条件判断部分,用于判断循环时候终止。
表达式3
表达式3为调整部分,用于循环条件的调整。
和while的三个部分是相同的,那如何用for循环打印1-10?
main()
{
int i = 0;
for(i=1; i<=10; i++)
{//初始化 判断 调整
printf("%d ", i);
}
}
这里的for循环把三个部分都调整到了一起,使得这三个部分比较集中,所以修改的时候会很容易控制循环,因此for是用的最普遍的。
初始化部分在整个循环里只会执行一次。后面就跟它没有关系了。
这里的和while里的会有什么区别呢?
还是拿上面的代码:
main()
{
int i = 0;
for(i=1; i<=10; i++)
{
if(i == 5)
{
break;
}
printf("%d ", i);
}
}
这时会输出什么呢?
注意:如果是嵌套循环,break只能跳出它所在的循环体。
那换成continue会不会还是1 2 3 4死循环呢?
main()
{
int i = 0;
for(i=1; i<=10; i++)
{
if(i == 5)
{
continue;
}
printf("%d ", i);
}
}
不难发现,这里的5被跳过去了,大家注意:和while不同的是,for里的continue也会跳过后面的代码,但它是直接跳到调整部分,所以程序不会像while一样死循环。
建议:
- 不可在for 循环体内修改循环变量,防止 for 循环失去控制。
- 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
第一个好理解,解释下第二个:
int i = 0;
//前闭后开的写法
for(i=0; i<10; i++)
{}
//两边都是闭区间
for(i=0; i<=9; i++)
{}
前者的代码可读性比较高,这里只是推荐并不是绝对。
#include
int main()
{
//代码1
for(;;)
{
//for循环中的初始化部分,判断部分,调整部分
//是可以省略的,但是不建议初学时省略,容易导致问题。
printf("hehe\n");
}
//死循环
//代码2
int i = 0;
int j = 0;
//这里打印多少个hehe?
for(i=0; i<10; i++)
{
for(j=0; j<10; j++)
{
printf("hehe\n");
}
}
//100个hehe
//代码3
int i = 0;
int j = 0;
//如果省略掉初始化部分,这里打印多少个hehe?
for(; i<10; i++)
{
for(; j<10; j++)
{
printf("hehe\n");
}
}
//3个hehe
//代码4-使用多余一个变量控制循环
int x, y;
for (x = 0, y = 0; x<2 && y<5; ++x, y++)
{
printf("hehe\n");
}
return 0;
}
这里以上代码写法都不推荐,很容易出问题且不美观。
//请问循环要循环多少次?
#include
int main()
{
int i = 0;
int k = 0;
for(i =0,k=0; k=0; i++,k++)
k++;
return 0;
}
这里需要注意的是判断条件,k被赋值为0,而不是等于0,被赋值为0,表达式的结果为假,所以一次循环也不进去。
do
{
循环语句;
}while(表达式);
打印1-10:
main()
{
int i = 1;
do
{
printf("%d ", i);
i++;
} while (i <= 10);
}
它的特点是,先执行循环语句,在判断,所以循环体至少要循环一次。
使用场景有限,不是经常使用。
注意:while表达式后面要有分号。
do while循环里的continue和break作用和while语句相同,这里就不在赘述。
到这里三种循环语句就结束了,大家要知道解决C语言问题,最基础并且用到的最多的就是分支和循环结构了,后面很多的困难复杂的代码更离不开这两个结构,但是很基础也很好理解,并没有什么难度,主要注意语法格式以及三种循环的使用场景。
那我们下期再见了,拜拜~
下期预告:函数