上期我们介绍了分支语句的两种句型:if 语句和 switch case语句。 而在c语言中我们经常会需要重复地进行一些指令,但是不断的编辑重复代码不仅很繁琐,还容易出现bug,因此循环语句的使用就非常有必要。今天要介绍的就是循环语句相关的知识。
本期主要介绍三种循环语句
1) while语句
2) do while语句
for 语句
代码规范化
我们已经掌握了 if 语句
if(条件)
语句;
当条件满足的情况下,if语句后面的语句执行,否则不执行。这个语句只会执行一次。
但我们发现生活中很多实际的例子是:同一件事情我们需要循环执行多次。
那如何去满足上述需求呢?c语言中引入了:while语句,可以实现循环。
while语句的语法结构:
while(表达式)
循环语句;
还是使用一个代码来解释while循环的执行过程:
#include
int main()
{
int i = 1;
while (i<=10)
{
printf("%d\\n", i);
i++;
}
return 0;
}
通过代码可以看到,表达式i<=10在i==1的情况下判断为真,所以循环体中的语句执行,最后打印出1-10,那么我们可以知道,当表达式为真时,while循环才会执行,当表达式为假,循环则不会执行。那么如果表达式是一个非0的数,循环会不会一直执行呢?
#include
int main()
{
while (1)
{
printf("a");
}
return 0;
}
通过运行结果可以看到,当表达式为1时,while循环会一直执行循环体,也就变成了一个死循环。
while循环中的break:
#include
int main()
{
int i = 1;
while (i<=10)
{
printf("%d\\n", i);
if (i==5)
{
break;
}
i++;
}
return 0;
}
通过前面的代码我们知道这个代码是用于打印1-10,那么如果在i==5的时候加入break,会发生什么呢?
可以看到当加入了break之后,当执行到i==5时,后面的循环并没有执行,那么可以理解为break语句的意思是终止循环。
while循环中的continue语句
#include
int main()
{
int i = 1;
while (i<=10)
{
if (i == 5)
{
continue;
}
printf("%d\\n", i);
i++;
}
return 0;
}
上面我们知道了break的作用,那么continue和break有什么区别呢,通过运行结果可以看到,当输出到4时,代码进入了一个死循环,而不是像break一样终止,这是为什么呢?我来解释一下,continue的意思为继续,当代码执行到continue时,会跳过本次循环而继续下一次,从代码中看到,当i==5时,循环跳过,那么i++不会执行,i的值就不会改变,那么i==5回到表达式判断5<10,进入循环,那么这个时候i==5就又会触发continue,然后i++又不能执行,就造成i的值一直为5,一直跳过,就成了一个死循环。
语法结构:
do {
循环体语句;
} while(条件判断语句);
执行流程:
①执行初始化语句
②执行循环体语句
③执行条件控制语句
④执行条件判断语句,看其结果是true还是false
如果是false,循环结束
如果是true,循环继续执行
⑤回到②继续
do while语句与while很相似,只不过do while语句是先执行循环体语句后进行条件判断
此循环语句使用的较其他两种较少,一般是在一些小游戏(猜数字,三子棋)中使用
语法结构:
for (表达式1; 表达式2; 表达式3)
{
语句;
}
首先要强调两点:
表达式1、表达式2和表达式3之间是用分号“ ;”隔开的,千万不要写成逗号。
for(表达式1;表达式2;表达式3)
的后面千万不要加分号,很多新手都会犯这种错误——会情不自禁地在后面加分号。
因为 for 循环只能控制到其后的一条语句,而在C语言中分号也是一个语句——空语句。所以如果在后面加个分号,那么 for 循环就只能控制到这个分号,下面大括号里面的语句就不属于 for 循环了。
执行流程:
//求解表达式1。
//求解表达式2。若其值为真,则执行 for 语句中指定的内嵌语句,然后执行第3步;若表达式2值为假,则结束循环,转到第5步。
//求解表达式3。
//转回上面第2步继续执行。
//循环结束,执行 for 语句下面的语句。
从这个执行过程中可以看出,“表达式1”只执行一次,循环是在“表达式2”“表达式3”和“内嵌语句”之间进行的。
for循环的最简单形式:
for (循环变量赋初值; 循环条件; 循环变量增值)
{
语句;
}
下面我们使用for循环写一个简单的代码
例:<求 1+2+3+4+…+100 的总和。>
# include
int main(void)
{
int i;
int sum = 0; //
for (i=1; i<=100; ++i) //++是自加的意思, ++i相当于i = i + 1
{
sum = sum + i; /*等价于sum += i;但是不建议这么写, 因为sum = sum + i看起来更清楚、更舒服*/
}
printf("sum = %d\\n", sum);
return 0;
}
三种循环的区别:
for循环和while循环先判断条件是否成立,然后决定是否执行循环体(先判断后执行)
do…while循环先执行一次循环体,然后判断条件是否成立,是否继续执行循环体(先执行后判断)
1)if、else、for、while、do 都只能控制到其后的一条语句,如果要控制多条语句必须加大括号 {}
。但基于代码规范化,if、else、for、while、do 后面的执行语句不论有多少行,就算只有一行也要加 {}
。
2)像 if、for、while 等关键字之后应留一个空格再跟左括号 (
,以突出关键字。
此外上面的程序还有一个知识点要跟大家说一下:从功能上讲, for(i=1; i<=100;++i)
完全可以写成 for(i=1; i<101; ++i)
,而且建议大家尽量使用这种写法。也就是说,循环语句的循环条件尽量写成半开半闭的,不管是 for 循环还是 while 循环。
for(i=1; i<101; ++i)
实际上是 1≤i<101,是半开半闭的;而 for(i=1; i<=100; ++i)
实际上是 1≤i≤100,是全闭的。那么为什么建议使用半开半闭的呢?因为如果写成 i<=100 的话,那么每次判断的时候都要判断两次,即 i<100 和 i==100,而写成 i<101 的话每次只需要判断一次。
也许有人说:程序在执行 i<=100 的时候不是将它转换成 i<100||i==100 吗?这样由“短路或”的知识可知,如果前面的为真那么后面的不就不会执行了吗?这样不也是判断一次吗?不是这样的,系统是不会将 i<=100 转换成 i<100||i==100 的,每次判断的时候 i<100 和 i==100 都要判断。
但是写成半开半闭也有一个问题,就是会影响对代码的理解。有时候写成全闭的区间理解起来才顺畅,而写成半开半闭反而不易理解,比如 `<=`右边是变量或表达式的时候。这时候要以可读性为第一要素,即哪种好理解就使用哪种。现在 CPU 速度那么快,也不在乎那点效率。所以前面说“尽量”,没有要求一定要那样写。
全部0条评论
快来发表一下你的评论吧 !