C语言-入门-基础-语法-流程控制(七)

x33g5p2x  于2022-07-05 转载在 其他  
字(4.9k)|赞(0)|评价(0)|浏览(467)

流程控制基本概念

默认情况下程序运行后,系统会按书写顺序从上至下依次执行程序中的每一行代码。但是这并不能
满足我们所有的开发需求, 为了方便我们控制程序的运行流程,C语言提供3种流程控制结构,不同的流程控制结构可以实现不同的运行流程。这3种流程结构分别是顺序结构、选择结构、循环结构 基本上能然计算机像人一样去干活那么流程控制就是核心,没有流程控制,就没有现在的所有软件可以这么说,简单来说你家电灯的开关都是使用的流程控制

顺序结构

按代码的书写顺序从上至下依次执行 ,这个就不多说了,傻子都知道

选择结构

对给定的条件进行判断,再根据判断结果来决定执行代码

C语言中提供了两大选择结构, 分别是if和switch

选择结构if

if

如果表达式为真,执行语句块1,否则不执行

#include <stdio.h>

int main() {
    int age=25;
    if (age >= 18) {  // true
        printf("开网卡\n");   //执行
    }
    printf("买烟\n");
    return 0;
}
if else

如果表达式为真, 则执行语句块1, 否则执行语句块2 ,else不能脱离if单独使用

#include <stdio.h>

int main() {
    int age=11;
    if (age > 18) {   //false
        printf("开网卡\n"); 
    } else { 
        printf("喊家长来开\n");  //执行 
    }
    printf("买烟\n");
    return 0;
}
if else if
  • 如果"表达式1"为真,则执行"语句块1", 否则判断"表达式2",如果是真,执行"语句块2", 否则再判断"表达式3", 如果是真, 执行"语句块3", 当表达式1、2、3都不满足,会执行最后一个else语句
  • 众多大括号中,只有一个大括号中的内容会被执行
  • 只有前面所有添加都不满足, 才会执行else大括号中的内容

#include <stdio.h>

int main() {
    int age=11;
    if(age>40){   // false
        printf("给房卡");
    }else if(age>25){
        printf("给名片");
    }else if(age>18){
        printf("给网卡");
    }else{  
        printf("给好人卡"); // 执行
    }
    printf("买烟\n");
    return 0;
}
if嵌套

if中可以继续嵌套if, else中也可以继续嵌套if

if注意点

任何数值都有真假性

当if else后面只有一条语句时, if else后面的大括号可以省略 (不推荐)

当if else后面的大括号被省略时, else会自动和距离最近的一个if匹配

如果if else省略了大括号, 那么后面不能定义变量

选择结构switch

由于 if else if 还是不够简洁,所以switch 就应运而生了,他跟 if else if 互为补充关系。switch 提供了点对点判断方式, 在效率上是比if要快的看下图的匹配模式就知道了

从上图可以看出来,if 需要一层一层的判断,而switch能直接定位到目标只需要一次判断 ,所以在,大量需要判断的单一条件场景多用switch但是switch代替不了if, 因为switch判断条件比较单一

计算"表达式"的值, 逐个与其后的"常量表达式"值相比较,当"表达式"的值与某个"常量表达式"的值相等时, 即执行其后的语句, 然后跳出switch语句 如果"表达式"的值与所有case后的"常量表达式"均不相同时,则执行default后的语句
示例

注意:

  1. switch条件表达式的类型必须是整型, 或者可以被提升为整型的值(char、short) ,否则编辑报错
  2. case的值只能是常量, 并且还必须是整型, 或者可以被提升为整型的值(char、short)
  3. case后面常量表达式的值不能相同
  4. case后面要想定义变量,必须给case加上大括号 case 1:{ 代码 }
  5. switch中只要任意一个case匹配, 其它所有的case和default都会失效. 所以如果case和default后面没有break就会出现穿透问题
  6. switch中default可以省略
  7. switch中default的位置不一定要写到最后, 无论放到哪都会等到所有case都不匹配才会执行(穿透问题除外)

if和Switch转换
看上去if和switch都可以实现同样的功能, 那么在企业开发中我们什么时候使用if, 什么时候使用
switch呢?

  • if else if 针对于范围的多路选择
  • switch 是针对点对点选择

比如判断用户输入的数据是否大于100

从上面2张图就能看出来if和switch 在什么环境下使用(比较大小和范围使用if, 判断等于使用switch …)

循环结构

C语言中提供了三大循环结构, 分别是while、dowhile和for 循环结构是程序中一种很重要的结构。其特点是,在给定条件成立时,反复执行某程序段, 直到条件不成立为止。 给定的条件称为"循环条件",反复执行的程序段称为"循环体"

如果通过上图你不理解,比如: 你早上起来吃饭然后上班,晚上下班吃饭,睡觉, 反反复复每天都是这样,这就是循环 ,那么你可能会说我可以休假啊,那么这就设计到循环过程中的条件判断了,所以这就是计算机程序 ,循环在计算机中特别重要,一些自动化脚本和自动化的程序等等都是可以, 脱离人的掌控去自动执行的, 这就是为啥计算机提升了人的效率的主要原因, 如果没有循环所有任务都需要靠手动一个个执行

循环结构while

构成循环结构的几个条件

  • 循环控制条件 (循环退出的主要依据,来控制循环到底什么时候退出)
  • 循环体 (循环的过程中重复执行的代码段)
  • 能够让循环结束的语句(递增、递减、真、假等 ,能够让循环条件为假的依据进行退出循环)

while循环执行流程

  1. 首先会判定"循环控制条件"是否为真, 如果为假直接跳到循环语句后面
  2. 如果"循环控制条件"为真, 执行一次循环体, 然后再次判断"循环控制条件"是否为真, 为真继续
  3. 执行循环体,为假跳出循环
  4. 重复以上操作, 直到"循环控制条件"为假为止

#include <stdio.h>

int main() {
    int count = 0;
    while (count < 3) {
        printf("发射子弹~哔哔哔哔\n");
        count++;
    }
    printf("循环执行完毕\n");
    return 0;
}
  1. 判断循环控制条件是否为真,此时0 < 3为真
  2. 执行循环体中的代码, 打印"发子弹"
  3. 执行"能够让循环结束的语句" count = 1
  4. 再次判断循环控制条件是否为真,此时1 < 3为真
  5. 执行循环体中的代码, 打印"发子弹"
  6. 执行"能够让循环结束的语句" count = 2
  7. 再次判断循环控制条件是否为真,此时2 < 3为真
  8. 执行循环体中的代码, 打印"发子弹"
  9. 执行"能够让循环结束的语句" count = 3
  10. 再次判断循环控制条件是否为真,此时3 < 3为假, 跳过循环语句
  11. 执行循环语句后面的代码, 打印"循环执行完毕"

while循环注意事项:

  • 任何数值都有真假性 0(false),1(true) ,如果条件一直是true,那么就会死循环(看情况使用)
  • 当while后面只有一条语句时,while后面的大括号可以省略 (不推荐)
  • 如果while省略了大括号, 那么后面不能定义变量(不推荐)
  • 最简单的死循环while (1); (不推荐)

循环结构do while

do whilewhile其实差不多,就是条件在循环体执行完毕后在判断, 也就是最差循环体也会执行一次

示例

do-while循环执行流程

  • 首先不管while中的条件是否成立, 都会执行一次"循环体"
  • 执行完一次循环体,接着再次判断while中的条件是否为真, 为真继续执行循环体,为假跳出循环
  • 重复以上操作, 直到"循环控制条件"为假为止

应用场景(先进行执行,然后在效验)

while和do…while应用场景

  • 绝大多数情况下while和dowhile可以互换, 所以能用while就用while
  • 无论如何都需要先执行一次循环体的情况, 才使用do…while
  • do...while 曾一度提议废除,但是他在输入性检查方面还是有点用的

循环结构for

#include <stdio.h>

int main() {
    for (int i = 0; i < 10; i++) {
        printf("发射子弹~哔哔哔哔\n");
    }
    return 0;
}

for循环执行流程

  • 首先执行"初始化表达式",而且在整个循环过程中,只会执行一次初始化表达式
  • 接着判断"循环条件表达式"是否为真,为真执行循环体中的语句
  • 循环体执行完毕后,接下来会执行"循环后的操作表达式",然后再次判断条件是否为真,为真
  • 继续执行循环体,为假跳出循环
  • 重复上述过程,直到条件不成立就结束for循环

for循环注意事项和while差不多

  1. while能做的for都能做, 所以开发中能用for就用for, 因为for更为灵活 ,而且对比while来说for更节约内存空间
  2. 如果初始化表达式的值, 需要在循环之后使用, 那么就用while ,如果初始化表达式的值, 不需要在循环之后使用, 那么就用for
  3. 在for循环初始化表达式中定义的变量, 只能在for循环后面的{}中访问
  4. 最简单的死循环 for(;;);

四大跳转

C语言中提供了四大跳转语句, 分别是return、break、continue、goto ,break:

break

结束当前操作,只适用switch和循环结构

break注意事项:

  1. break离开应用范围(for , switch),存在是没有意义的
  2. 在多层循环中,一个break语句只向外跳一层
  3. break下面不可以有语句,因为执行不到

continue

结束本轮循环,进入下一轮循环 ,只适用循环结构

goto

这是一个不太值得探讨的话题,goto 会破坏结构化程序设计流程,它将使程序层次不清,且不易读,所以慎用 , goto 语句,仅能在本函数内实现跳转,不能实现跨函数跳转。但是他在跳出多重循环的时候效率还是蛮高的

return

结束当前函数,将结果返回给调用者,前提函数返回类型不是void , 同一个函数里可以有多个return,但是最终只会返回满足条件的, 如果都满足条件了,那么只会返回第一个

语法: return 表达式|值

更具体的细节需要在学到函数的时候才会使用,这里先了解即可

循环的嵌套

循环结构的循环体中存在其他的循环结构,我们称之为循环嵌套 ,一般来说一重循环解决线性的问题,而二重循环和三重循环就可以解决平面和立体的问题了

注意:

  1. 一般循环嵌套不超过三层,不然不好维护了,就是灾难
  2. 外循环执行的次数 * 内循环执行的次数就是内循环总共执行的次数
  3. 在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少 CPU跨切循环层的次数

点赞 -收藏-关注-便于以后复习和收到最新内容有其他问题在评论区讨论-或者私信我-收到会在第一时间回复感谢,配合,希望我的努力对你有帮助^_^

免责声明:本文部分素材来源于网络,版权归原创者所有,如存在文章/图片/音视频等使用不当的情况,请随时私信联系我。

相关文章