带你窥探分支和循环语句全貌——这一篇就够了

简介: 带你窥探分支和循环语句全貌——这一篇就够了

前言

在C语言中,语句可分为5类:表达式语句、函数调用语句、控制语句、复合语句、空语句。本篇将详细介绍控制语句。

控制语句用于控制程序的执行流程,以实现程序的各种结构方式(顺序结构、循环结构、选择结构),它们由特定的语句定义符组成。

C语言有9种控制语句,可分为以下三类:

  1. 条件判断语句也叫分支语句:if语句、switch语句
  2. 循环执行语句:do while语句、while语句、for语句
  3. 转向语句:break语句、goto语句、continue语句、return语句

1.分支语句(选择结构)

大学好好学习,校招拿到好offer,走上人生巅峰,迎娶白富美;不好好学习,毕业回家卖红薯;或其他。

这就是选择。

1.1 if语句

在C语言中,if语句即可以实现单分支,又可以实现多分支。那语法结构是怎么样呢?

//语法结构
//单分支
if(表达式)
     语句;
//多分支
if(表达式)
  语句1;
else
  语句2;
//更多分支
if(表达式1)
  语句1;
else if(表达式)
  语句2;
else
  语句3;

Tips:

  • 在C语言中,如果表达式结果为真,则语句执行。而C语言规定0表示假,非0表示真。
  • 如果上述表达式成立,要执行多条语句,要将代码块放在{ }中。
  • 当出现悬空else时,else和离它最近的if匹配,而非和它对其的else匹配。
  • 在判断常量表达式时(例如判断5和sum是否相等),建议读者写成5==sum(这样写可以防止读者在实际写代码的过程中,少写一个=,把判断语句写成赋值语句)

1.2 switch语句

switch语句也是一种分支语句,常常用于多分支的情况。

比如如果出现以下情况:

输入4-7,相应的输出星期四到星期七。

如果我们写成if…else if…else if…这种形式,无疑太过复杂。而C语言给出了一种好的解决方法——switch语句

//switch语句
switch(整形表达式)
{
  语句项;    //语句项是一些case语句
}       //如下:
        //case 整型表达式:
        //    语句;

1.2.1 在switch语句中的break

在switch语句中,我们没办法直接实现分支,搭配break后才能实现真正的分支。

例如:我们要求输入4和5,输出weekday;输入6和7,就输出weekend

我们的代码可以这样实现:

#include <stdio.h>
int main()
{
  int day = 0;
  scanf("%d", &day);
  switch (day)
  {
  case 4:
  case 5:
    printf("weekday\n");
    break;
  case 6:
  case 7:
    printf("weekend\n");
    break;
  }
  return 0;
}
  • break的实际效果是将语句列表分为不同的分支部分。
  • switch()中只能是常量表达式。
  • 编程好习惯:在最后一个case语句后加一条break语句。(这样写可以避免在以后自己或他人要修改该代码时,在以前的最后一个case语句后面忘记添加break语句)

1.2.2 default语句

在实际过程中,如果表达式的值与所有的case标签的值都不匹配要怎么办呢?

其实也没什么,结构就是跳过所有语句罢了。但有意思的是, 程序并不会停止也不会报错(这种情况下,C不认为是个错误)。

如果不想忽略不匹配的所有标签,我们可以在语句列表中添加一条default语句。

  • 当switch表达式的值并不匹配所有case标签的值时,default后面的语句就会执行。
  • 每一个switch语句只能出现一条default语句
  • default语句可以出现在语句列表中的任何位置,执行时会像执行case标签一样执行default语句
  • 编程好习惯:在每一个switch语句中加一个default语句,甚至可以在后面再加一个break语句。

2. 循环语句

  • while
  • for
  • do while

下面我们来看一个简单的循环

2.1 while循环

在生活中很多情况是:同一件事需要完成多次,而if语句只能执行一次,那要怎么办呢?

C语言引入了while语句可以实现循环

while 语法结构:

while (表达式)
  循环语句;

while语句的执行流程图:

Instance:如何在屏幕上打印1-10的数字。

我们可以这样实现:

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

2.1.1 while语句中的break

break介绍

//break 代码实例
#include <stdio.h>
int main()
{
  int i = 0;
  while (i <= 10)
  {
    if (i == 5)
      break;
    printf("%d ", i);
    i = i + 1;
  }
  return 0;
}

这些代码输出结果是什么呢?

总结:

break在while循环中的作用:

其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环,所以while中的break是用于永久终止循环的。

2.1.2 while语句中的continue

continue介绍

//continue  代码实例
#include <stdio.h>
int main()
{
  int i = 0;
  while (i < 10)
  {
    i = i + 1;
    if (i == 5)
      continue;
    printf("%d ", i);
  }
  return 0;
}

这段代码只是把break改成continue,代码输出结果是什么呢?

运行代码后我们发现除5之外,其他数字都正常输出。

总结:

continue在while中的作用就是:

continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接跳转到while的判断部分,进行下一次循环的入口判断。

2.2 for循环

首先我们来看for循环的语法:

2.2.1 语法

for(表达式1:表达式2:表达式3)
  循环语句;   
//表达式1为初始化部分,用于初始化循环变量的。
//表达式2为条件判断部分,用于判断循环什么时候终止
//表达式3为调整部分,用于循环部分的调整

for循环的执行流程图:

Tips:

  • 对比for循环和while循环,我们可以发现while循环中依然存在循环的三个必要条件,但由于风格的问题使得while循环的3个部分可能偏离较远,导致查找修改不够集中和方便。所以for循环的风格更甚一筹,使用频率也跟高。
  • 在for循环中,break和continue得意义和while循环是一样的。
  • 建议1:不可在for循环体内修改循环变量,防止for循环失去控制。
  • 建议2:for循环控制变量的取值采用“前闭后开区间”写法。

2.2.2 一些for循环变种

我们来看以下4段代码,看看结果如何,打印多少个hehe。

#include <stdio.h>
int main()
{
  //代码1
  for (;;)
  {
    printf("hehe\n");
  }
  //代码1运行,会死循环打印hehe
  //代码2
  int i = 0;
  int j = 0;
  for (; i < 10; i++) 
  {
    for (; j < i; j++)
    {
      printf("hehe\n"); //j初始化省略,j在第一次循环结束后会,不会从0开始,而是保持原来的值
    }
  }
  //代码2运行,打印10个hehe
  //代码3——使用多哥变量控制循环
  int x, y;
  for (x = 0, y = 0; x < 2 && y < 5; x++, y++)
  {
    printf("hehe\n");
  }
  //代码3运行,打印2个hehe
  return 0;
}
  1. for循环中,初始化和调整部分的省略就是什么都不做。
  2. for循环中,判断部分的省略意味着判断恒为真。

2.3 do…while()循环

2.3.1 do语句的语法

do
  循环语句;
while(表达式);

2.3.2 执行流程

2.3.3 do语句的特点

do语句循环时,至少执行一次,但场景有限,所以不经常使用。

#include <stdio.h>
int main ()
{
  int i = 1;
  do
  {
    printf("%d ", i); //不管如何,先执行代码块中内容,在判断是否在执行
    i++;
  } while (i <= 10);
  return 0;
}

- do while语句中的break和continue的意义和while语句以及for语句效果是一样的。

3.goto语句

C语言提供了可以随意滥用的goto语句和标记跳转的标号。理论上goto语句是没有必要的,实践中没有goto语句也可以很容易写出代码。但在某些场合下,goto语句还是可以用的着的,最常见的用法就是终止程序在某些深度嵌套的结构处理过程中。

例如:一次跳出两层或多层循环。(多层循环这种情况下使用break是达不到目的的,它只能从内层循环退出到上一层循环)

goto语句真正适合的场景如下:

for (...)
{
  for (...)
  { ...
    for (...)
    {
      if (disaster)
        goto error;
    }
  }
}
error:
  if(disaster)
    //处理错误情况

结尾

本篇文章到这就结束了,希望能帮读者更好的了解控制结构的全貌,建立一个完整逻辑框架。创作不易,如果觉得本篇文章对你有帮助,记得点赞加关注哦。感谢你的支持!

C简单程序详解,带你快速入门C语言


相关文章
|
6月前
|
存储 SQL Java
好多人都说存储过程很难?认真看这篇文章就够了
好多人都说存储过程很难?认真看这篇文章就够了
|
6月前
|
C语言
(保姆级)一篇搞懂分支语句
(保姆级)一篇搞懂分支语句
106 6
|
1月前
|
设计模式 安全 Java
条件语句的多层嵌套问题优化,助你写出不让同事吐槽的代码!
条件语句的多层嵌套问题优化,助你写出不让同事吐槽的代码!
|
程序员 C语言 C++
轻轻松松几分钟,看完锤爆流程控制结构。
轻轻松松几分钟,看完锤爆流程控制结构。
分支语句和循环语句(超详细保姆级,适合初学者)下
分支语句和循环语句(超详细保姆级,适合初学者)
53 0
|
C语言
分支语句和循环语句(超详细保姆级,适合初学者)上
分支语句和循环语句(超详细保姆级,适合初学者)
77 0
|
人工智能 数据可视化 数据挖掘
你只管提需求,大模型解决问题:图表处理神器SheetCopilot上线
你只管提需求,大模型解决问题:图表处理神器SheetCopilot上线
251 0
|
存储 算法 编译器
抽丝剥茧C语言(中阶)分支与循环练习
抽丝剥茧C语言(中阶)分支与循环练习
抽丝剥茧C语言(中阶)分支语句和循环语句(下)
抽丝剥茧C语言(中阶)分支语句和循环语句
|
编译器 程序员 C语言
抽丝剥茧C语言(中阶)分支语句和循环语句(上)
抽丝剥茧C语言(中阶)分支语句和循环语句