C语言的循环与分支-2

描述

上期我们介绍了分支语句的两种句型:if 语句和 switch case语句。 而在c语言中我们经常会需要重复地进行一些指令,但是不断的编辑重复代码不仅很繁琐,还容易出现bug,因此循环语句的使用就非常有必要。今天要介绍的就是循环语句相关的知识。

本期主要介绍三种循环语句

1) while语句

2) do while语句

  1. for 语句
    
  2. 代码规范化
    
  • while语句

我们已经掌握了 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;
}

C语言

通过运行结果可以看到,当表达式为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,会发生什么呢?

C语言

可以看到当加入了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;
}

C语言

上面我们知道了break的作用,那么continue和break有什么区别呢,通过运行结果可以看到,当输出到4时,代码进入了一个死循环,而不是像break一样终止,这是为什么呢?我来解释一下,continue的意思为继续,当代码执行到continue时,会跳过本次循环而继续下一次,从代码中看到,当i==5时,循环跳过,那么i++不会执行,i的值就不会改变,那么i==5回到表达式判断5<10,进入循环,那么这个时候i==5就又会触发continue,然后i++又不能执行,就造成i的值一直为5,一直跳过,就成了一个死循环。

  • do while语句

语法结构:

do {
     循环体语句;
} while(条件判断语句);

执行流程:

①执行初始化语句

②执行循环体语句

③执行条件控制语句

④执行条件判断语句,看其结果是true还是false

如果是false,循环结束

如果是true,循环继续执行

⑤回到②继续

do while语句与while很相似,只不过do while语句是先执行循环体语句后进行条件判断

此循环语句使用的较其他两种较少,一般是在一些小游戏(猜数字,三子棋)中使用

  • for循环

语法结构:

for (表达式1; 表达式2; 表达式3)
{
        语句;
}

首先要强调两点:

  1. 表达式1、表达式2和表达式3之间是用分号“ ;”隔开的,千万不要写成逗号。

  2. 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 速度那么快,也不在乎那点效率。所以前面说“尽量”,没有要求一定要那样写。
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分