首页 > 其他分享 >04. 流程控制

04. 流程控制

时间:2023-02-19 12:23:36浏览次数:35  
标签:语句 控制 04 int 流程 循环 printf 执行 表达式

一、流程控制

  流程控制就是用来控制程序运行中各语句执行顺序的语句。基本的流程结构为:顺序结构分支结构(或称选择结构),循环结构

  • 顺序结构:程序自上到下执行,中间没有任何判断和跳转;
  • 分支结构:根据条件,选择性的执行某段代码,有 if……elseswitch……case 两种分支语句;
  • 循环结构:根据循环条件,重复性的执行某段代码,有 whiledo……whilefor 三种循环语句;

二、顺序结构

  顺序结构 是 C语言 程序默认的执行流程,按照代码的先后顺序,从上到下依次执行,中间没有任何的判断和跳转

image

#include <stdio.h>

int main()
{
    printf("你好,世界!\n");
    printf("Hello world!\n");

    return 0;
}

三、分支结构

  选择语句 也被称为 分支语句,它通过给定的条件进行判断,从而决定执行两个或者多个分支中哪一只。因此,在编写选择语句之前,应该首先明确判断条件是什么,并确定判断结果为“真”或“假”时应分别执行什么样的操作/算法。在 C语言 语言中选择语句主要提供了两种,一个是 if 语句,另一个则是 switch 语句

3.1、if语句

3.1.1、if语句的单分支结构

if(关系表达式)
{
    语句体;
}

  执行流程

  1. 首先计算 关系表达式 的值
  2. 如果关系表达式的值为 真(非0)执行语句体
  3. 如果关系表达式的值为 假(0)不执行语句体
  4. 继续执行后面的其它语句

image

#include <stdio.h>

int main()
{
    int number;

    printf("请输入一个数:");
    scanf("%d",&number);

    if (number > 10)
        printf("你输入的数字比10大\n");
  
    printf("你输入的数字是:%d\n",number);

    return 0;
}

在语句体中,如果只有一句代码,大括号可以省略不写,建议不要省略;

3.1.2、if语句的双分支结构

if(关系表达式)
{
    语句体1;
} 
else 
{
    语句体2;
}

  执行流程

  1. 首先计算 关系表达式 的值
  2. 如果关系表达式的值为 真(非0) 就执行 语句体1
  3. 如果关系表达式的值为 假(0) 就执行 语句体2
  4. 继续执行后面的其它语句

image

#include <stdio.h>

int main()
{
    int number;

    printf("请输入一个数:");
    scanf("%d",&number);

    if (number > 10)
        printf("你输入的数字比10大\n");
    else
        printf("你输入的数字等于10或者比10小\n");
  
    printf("你输入的数字是:%d\n",number);

    return 0;
}

3.1.3、if语句的多分支结构

if(关系表达式1)
{
    语句体1;
} 
else if (关系表达式2)
{
    语句体2;
} 
……
else 
{
    语句体n+1;
}

  执行流程

  1. 首先计算 关系表达式1 的值
  2. 如果为 真(非0) 就执行 语句体1;如果为 假(0) 就计算 关系表达式2 的值
  3. 如果为 真(非0) 就执行 语句体2;如果为 假(0) 就计算 关系表达式3 的值
  4. ……
  5. 如果 所有的关系表达式 结果都为 假(0),就执行 else 子句中的 语句体n+1
  6. 继续执行其它语句

image

#include <stdio.h>

int main()
{
    int number;

    printf("请输入一个数:");
    scanf("%d",&number);

    if (number > 10)
        printf("你输入的数字比10大\n");
    else if(number < 10)
        printf("你输入的数字比10小\n");
    else
        printf("你输入的数为10\n");
  
    printf("你输入的数字是:%d\n",number);

    return 0;
}

else 结构是可选的;

如果多个条件表达式之间是“互斥”关系,哪个判断和执行语句声明在上面还是下面,无所谓;

如果多个条件表达式之间有“交集”关系,需根据实际情况,考虑清除应该将哪个结构写在上面;

如果多个条件表达式之间有 “包含”关系,通常情况下,需要 将范围小的声明在范围大的上面。否则,范围小的没机会执行;

3.2、switch语句

switch(表达式)
{
    case 常量表达式1:
        语句体1;
        break;
    case 常量表达式2:
        语句体2;
        break;   
    ……
    case 常量表达式n:
        语句体n;
        break;  
    default:
        语句体n+1;
        break;
}

  执行流程

  1. 首先计算 表达式 的值
  2. 依次和 case 后面的值 进行比较,如果 有对应的值,就会执行相应的语句,在执行过程中,遇到 break 就会结束
  3. 如果 所有的 case 后面的值 和 表达式 的值都不匹配,就会执行 default 里面的语句体,然后结束整个 switch 语句

  格式说明

  • 表达式:表达式的结果是 整型变量
  • case:后面跟的是 要和 switch 中的表达式进行比较的常量表达式,它只能是 枚举常量数值常量字符常量常变量宏定义常量 的一种,且 case 给出的值不能重复
  • break:表示中断,结束的意思,用来 结束 switch 语句,break 关键字是可选的
  • default:表示 所有情况都不匹配的时候,就执行该处的内容,相当于 if……else 中的 else,default 结构是可选的,而且位置是灵活的;

  如果在语句体中 没有写 break 关键字,可能会导致 case穿透现象case穿透现象 的执行流程如下:首先还是会拿着小括号中表达式的值跟下面的每一个 case 进行匹配,如果匹配上了,就会执行相应的代码,如果此时发现了 break,那么结束整个 switch 语句。如果没有发现 break,那么程序会继续执行下一个 case 语句体,一直遇到 break 或者 右大括号为止;

image

#include <stdio.h>

int main()
{
    int day;

    printf("请输入一个星期数:");
    scanf("%d",&day);

    switch(day)
    {
        case 1:
            printf("你输入的是星期一\n");
            break;
        case 2:
            printf("你输入的是星期二\n");
            break;
        case 3:
            printf("你输入的是星期三\n");
            break;
        case 4:
            printf("你输入的是星期四\n");
            break;
        case 5:
            printf("你输入的是星期五\n");
            break;
        case 6:
            printf("你输入的是星期六\n");
            break;
        case 7:
            printf("你输入的是星期天\n");
            break;
        default:
            printf("你输入的星期数不对\n");
            break;
    }

    return 0;
}

凡是可以使用 switch……case 的结构,都可以转换为 if……else 。反之,不成立;

分支结构,既可以使用 switch……case(同时,switch 中表达式的取值不多时)又可以使用 if……else 时,优先使用 switch……case;

四、循环结构

  循环就是重复的做某件事情;它具有明确的开始和停止标志;一组被重复执行的语句称之为 循环体,能否继续执行,取决于 循环的终止条件。在 C语言 中循环分为 for循环while循环do..while循环;循环结构具有以下四个组成部分:

  • 初始化部分(init_statement)
  • 循环条件部分(test_exp)
  • 循环体部分(body_statement)
  • 迭代部分(alter_statement)

  通常情况下,循环结构都是因为②中循环条件返回false;

4.1、for循环

for(①初始化条件;②循环条件;④迭代条件)
{
    ③循环体;
}

  执行流程

  1. 执行 初始化语句
  2. 执行 条件判断语句,看其结果是 真(非0) 还是 假(0)
    • 如果是 假(0)循环结束,继续执行后面的其它语句
    • 如果是 真(非0)执行循环体语句
  3. 执行 条件控制语句
  4. 回到②继续执行 条件判断语句

image

#include <stdio.h>

int main()
{
    int i;

    for (i = 0; i < 10; i++)
    {
        printf("Hello world!\n");
    }

    return 0;
}

初始化语句作为循环的开始,只会执行一次

如果判断条件为 真(非0),则循环继续;如果判断语句为 假(false),则循环结束;

for循环 中可以添加多个初始化条件、条件判断内容、条件控制语句,多条内容之间中间用逗号分隔;

4.2、while循环

①初始化条件;
while(②循环条件)
{
    ③循环体;
    ④迭代条件;
}

  执行流程

  1. 执行 初始化语句
  2. 执行 条件判断语句,看其结果是 真(非0) 还是 假(0)
    • 如果是 假(0)循环结束,继续执行后面的其它语句
    • 如果是 真(非0)执行循环体语句
  3. 执行 条件控制语句
  4. 回到②继续执行 条件判断语句

image

#include <stdio.h>

int main()
{
    int i;

    while(i < 10)
    {
        printf("Hello world!\n");
        i++;
    }

    return 0;
}

初始化语句作为循环的开始,只会执行一次

如果判断条件为 true,则循环继续;如果判断语句为 false,则循环结束;

for 循环和 while 循环可以相互转换的;

4.3、do...while循环

①初始化条件
do{
    ③循环体;
    ④迭代条件;
}while(②循环条件);

  执行流程

  1. 执行 初始化语句
  2. 执行 循环体语句
  3. 执行 条件控制语句
  4. 执行 条件判断语句,看其结果是 真(非0) 还是 假(0)
    • 如果是 假(0)循环结束,继续执行后面的其它语句
    • 如果是 真(非0)执行循环体语句
  5. 执行 条件控制语句
  6. 回到②继续执行 条件判断语句

image

#include <stdio.h>

int main()
{
    int i;

  
    do{
        printf("Hello world!\n");
        i++;
    }while(i < 10);

    return 0;
}

do...while循环 先执行后判断,即循环体至少执行一次;

4.4、无限循环

  for 循环的无限循环:

for(;;)
{
    循环体;
}

  while 循环的无限循环:

while(1)
{
    循环体;
}

  do...while 循环的无限循环

do{
    循环体;
} while(1);

4.5、嵌套循环

  将一个循环结构A声明在另一个循环结构B的循环体,就构成了嵌套循环;

  • 外层循环:循环结构B,控制行数
  • 内层循环:循环结构A,控制列数

  内层结构遍历一遍,相当于外层循环循环体执行一次;假设外层循环需要执行 m 次,内层循环需要执行 n 次。此时内层循环的循环体一共执行了 m*n 次;

#include <stdio.h>

int main()
{
    int i,j;

  
    for (i = 1; i <= 9; i++) 
    {
        for (j = 1; j <= i; j++) 
        {
            printf("%d * %d = %d\t",i,j,i*j);
        }
        printf("\n");
    }

    return 0;
}

4.6、break与continue的使用

  • break结束当前循环,后面不能直接写执行语句,默认跳出包裹此关键字最近的一层循环;
  • continue结束当次循环,后面不能直接写执行语句,默认结束包裹此关键字最近的循环的一次;
#include <stdio.h>

int main()
{
    int i;

    for (i = 0; i <= 5; i++) 
    {
        if (i == 3) { break; }
  
        printf("%d\n",i);
    }

    return 0;
}
#include <stdio.h>

int main()
{
    int i;

    for (i = 0; i <= 5; i++) 
    {
        if (i == 3) { continue;; }
  
        printf("%d\n",i);
    }

    return 0;
}

continue 语句只能配合循环语句使用,不能单独和 switch/if 使用;

break 除了可以用在循环中,还可以和 swtich 语句搭配使用;

五、跳转语句

  C语言 的 goto 语句可以无条件转移到程序中指定的行,goto 语句通常与条件语句配合使用,可用来实现条件转移,跳出循环体等功能。在 C程序 中,一般不主张使用 goto 语句,以免造成程序流程的混乱,使理解和调试程序都产生困难。它的格式如下:

goto 标签;
标签:语句;
标签:语句;
goto 标签;

  其中,标签是一个有效的标识符。这个标识符加上一个“:”一起出现在函数内某处,执行 goto 语句后,程序将跳转到该标识符处并执行其后的语句。另外,标签需要与 goto 语句处于同一个函数中。

#include <stdio.h>

int main()
{
    // FLAG是一个标识符
    goto FLAG;
    printf("hello world!\n");
    FLAG:
    printf("你好,世界!\n");

    return 0;
}
#include <stdio.h>

int main()
{
    int i = 0,j = 0;

    for(i = 0; i < 10; i++){
        if(i == 5){ goto FLAG; }
        printf("i = %d\n",i);
    }

    for(j = 0; j < 10; j++){
        FLAG:
        printf("j = %d\n",j);
    }
  
    return 0;
}
#include <stdio.h>

int main()
{
    // 相当于死循环
    FLAG:
        printf("hello world!\n");
    goto FLAG;

    return 0;
}

标签:语句,控制,04,int,流程,循环,printf,执行,表达式
From: https://www.cnblogs.com/kurome/p/17134507.html

相关文章

  • 96、商城业务---消息队列---RabbitMQ工作流程&概念
    流程如下:生产者先跟消息代理建立一条长连接,在长连接里开辟很多通道(channel),然后通过通道发送消息Message,其中消息必须指定路由键route-key。消息代理里面有很多交换......
  • 使用微控制器精确测量电流
    介绍片上模拟CIP,以减少或消除误差  某些应用,如电力电子、安全系统和气体监测器,可能需要测量电路中流动的电流。虽然使用模数转换器(ADC)测量电压是一个简单的过程,但测量电......
  • Qt Quick 3D - 实现车道线 - 2(片元着色器控制虚实线)
    QtQuick3D-实现车道线-2(片元着色器控制虚实线)1.导入车道线模型。(这里不再赘述,自行参考该文档:QtQuick3D-模型的导入并加载)2.CustomMaterial  这是QtQui......
  • Qt Quick 3D - 实现车道线 - 3(shader控制远近端虚化效果)
    QtQuick3D-实现车道线-3(远近端虚化效果)1.俩种方式  1.1一种是在顶点着色器里面通过计算远近端的顶点,并根据pos数值,进行除法计算,得到一个比例,再与color数值相......
  • 04-数据类型转换
    数据类型Number-强制类型转换(intfloatboolcomplex)1.强制把数据转换为整型-intfloatbool纯数字字符串#强制把数据转换为整型-intfloatbool纯数字字符......
  • 研发流程的总结
    研发流程的总结1、概念设计————产品思路的评审。2、方案设计————电子设计方案评审,结构设计方案评审,热设计评审,光学方案评审。3、样品设计————手板打样,并组......
  • NJUPT自控第一次积分赛的小总结(二)基于simpleFOC的无刷电机控制
    新人一枚,写的比较水,欢迎大佬指正!先说一下我用的物料与开发环境吧:无刷电机:makerbase的2804电机(带AS5600磁编码器)电机驱动板:simpleFOCmini(学校推荐的)......
  • 【系统架构设计师】计算机组成与体系结构 ① ( 计算机组成 | CPU | 存储器 | 总线 | I
    文章目录​​一、计算机组成与体系结构​​​​二、计算机组成结构​​​​三、CPU组成​​​​1、运算器​​​​2、控制器​​一、计算机组成与体系结构计算机组成与体......
  • Mybatisplus----DML编程控制
    乐观锁(1)业务并发现象带来的问题:秒杀执行:1、在类对象中添加version属性,在数据库表中添加version字段(默认值为1)packagecom.itheima.domain;importcom.baomidou.mybat......
  • Ubuntu18.04编译ZLMediakit支持webrtc
    背景最近在做流媒体相关的一些东西,比较了一些开源的流媒体服务,目前​​srs​​和​​ZlmediaKit​​项目是评价比较高的,今天主要在Ubuntu18.04上编译ZlmediaK......