嵌入式学习(五)--C语言(第三章)(流程控制)

流程控制


目录

         一、程序运行的顺序结构:

二、逻辑表达式

        1. 关系运算符

        2. 逻辑运算符

        3. 三目运算符

三、分支结构

        1. if 分支

                1)简单分支:

                2)阶梯分支:

                3)嵌套分支:

        2. switch 分支

                1)基本形式:

                2)嵌套形式:

四、循环结构

        1. while 循环

                1)基本形式:

                2)执行流程:

                3)死循环:

        2. do...while 

                1)基本形式:

                2)执行流程:

        3. for 循环

                1)基本形式:

                2)执行流程:

                3)双层 for 循环:

        4. goto

                1)基本形式:

五、辅助控制语句

        1. break

        2. continue

        3. return


一、程序运行的顺序结构:

        ●  顺序结构

        ●  分支结构

        ●  循环结构

二、逻辑表达式

        1. 关系运算符

                ○  表达式的值只有两种:真(1)、假(0)

                ○  为了避免 == 和 = 混淆,一般 == 常量放在左边

运算符含义
>大于
<小于
>=大于等于
<=小于等于
==等于
!=不等于

5 > 3                         // 判断 5 是否大于 3,结果为真(1)

7 < 2                         // 判断 7 是否小于 2,结果为假(0)

10 >= 10                   // 判断 10 是否大于等于 10,结果为真(1)

6 <= 4                       // 判断 6 是否小于等于 4,结果为假(0)

3 == 3                       // 判断 3 是否等于 3,结果为真(1)

5 != 8                        // 判断 5 是否不等于 8,结果为真(1)

a > b                         // 判断变量 a 的值是否大于变量 b 的值

x <= y + 2                 // 判断变量 x 的值是否小于等于 y+2 的结果

        2. 逻辑运算符

                ○  截断特性:

                        ■  逻辑与左边为假,右边不再计算

                        ■  逻辑或左边为真,右边不再计算

运算符含义
&&逻辑与(既..又..)
||逻辑或(要么..要么..)
!逻辑非(真取非得假、假取非得真)

                ○  &&真值表:一假为假,全真为真

真值表

                ○  || 真值表:一真为真,全假为假

真值表

                ○  ! :真取非得假,假取非得真

        3. 三目运算符

                ○  三目运算符结合方向自右至左

例如:a ? b : c ? d : e
会被解析为:a ? b : (c ? d : e),而非 (a ? b : c) ? d : e

                ○  逻辑表达式 ? 表达式1 : 表达式2;

                        ■  示例

/* 若 a 大于 b,max 等于 a,否则等于 b */
max = a > b ? a : b;

/* 若 score 大于等于 60,result 为 "及格",否则为 "不及格" */
result = score >= 60 ? "及格" : "不及格";

/* 若 x 等于 0,num 为 100,否则 num 等于 x */
num = x == 0 ? 100 : x;

/* 嵌套使用,n 为正 sign 是 1,为负是 - 1,为 0 则是 0 */
sign = n > 0 ? 1 : (n < 0 ? -1 : 0);

/* 若 a 是偶数输出 "偶数",否则输出 "奇数 */
(a % 2 == 0) ? printf("偶数") : printf("奇数");

三、分支结构

        1. if 分支

                ○  实现判断逻辑,用if分支

                ○  同一类数据执行不同操作,用if分支

                1)简单分支:

                        ■  if 后面必须加表达式,else 后面不能加表达式

                        ■  if 可以脱离 else 单独使用,但是 else 不能脱离if单独使用

                        ■  if 和 else 不加大扩号默认控制一句代码,最好加上大括号

if (表达式)
{
    语句块1;
}
else 
{
    语句块2;
}

                        ■  示例

/* 比较两数,若第一个数大则打印第一个数,反之则交换 */
if (a <= b) 
{
    temp = a;
    a = b;
    b = temp;
}

printf("结果: %d\n", a);
                2)阶梯分支:
if (表达式1)
{
    语句块1;
}
else if (表达式2)
{
    语句块2;
}
else if (表达式3)
{
    语句块3;
}
else 
{
    语句块4;
}
                3)嵌套分支:

                        ■  尽量避免深层次嵌套(最多嵌套 3 - 5 层)

if (表达式1)
{
    语句块1;
    if (表达式2)
    {
        语句块2;
        if (表达式3)
        {
            语句块3
        }
    }
    else 
    {
        语句块4;
    }
}
else 
{
    语句块5;
}

        2. switch 分支

                1)基本形式:

                        ■  switch 后面必须为整形表达式

                        ■  case 后面必须为常量,不能为变量或者表达式

                        ■  switch与case后面的值比一次,然后顺序向下执行直到遇到break,或者switch结                                束才会停止

switch (整形表达式)
 {
    case 常量1:语句块1;break;
    case 常量2:语句块2;break;
    case 常量3:语句块3;break;
    default:
        语句块4;
 }

                        ■  示例

/*
从终端接收一个分数
90 - 100  打印   S
80 - 89   打印   A
70 - 79   打印   B
60 - 69   打印   C
60以下    打印   D
*/
switch (score / 10) 
{
    case 10:              // 100分的情况(100/10=10)
    case 9:               // 90-99分(90/10=9到99/10=9)
        printf("S\n");
        break;
    case 8:               // 80-89分
        printf("A\n");
        break;
    case 7:               // 70-79分
        printf("B\n");
        break;    
    case 6:               // 60-69分
        printf("C\n");
        break;
    default:              // 0-59分(涵盖所有其他情况)
        printf("D\n");
}
                2)嵌套形式:

                        ■  双层switch中,里层结束后,不加break,外层switch会继续向下执行

四、循环结构

        ●  重复执行某段代码,使用循环

        ●  有规律的代码使用循环

        ●  已知循环次数用for循环

        ●  未知循环次数用while循环

        1. while 循环

                1)基本形式:
while (表达式)
{
    语句块:
}
                2)执行流程

                        ■  先判断 () 中的循环条件(结果为非 0 表示真,0 表示假)

                        ■  若条件为真,执行循环体,执行完后回到步骤 1 再次判断

                        ■  若条件为假,直接跳过循环体,执行后续代码

                3)死循环:

                        ■  一般使用 while 语句实现死循环

while (1)
{
    语句块:
}

        2. do...while 

                ○  先执行循环体,再判断循环条件(循环体会至少执行一次)

                1)基本形式:
do {
    语句块;
} while (表达式);
                2)执行流程:

                        ■  先执行一次 do 后的循环体

                        ■  执行完后,判断 while 后的循环条件

                                □  若条件为真(非 0),则回到 do 继续执行循环体

                                □  若条件为假(0),则退出循环,执行后续代码

                        ■  示例

/* 输出数字 1~5 */
do {
    printf("%d ", i);          // 先执行一次:输出1
    i++;
} while (i <= 5);              // 判断i是否≤5,成立则继续循环
    // 输出结果:1 2 3 4 5 
循环类型执行逻辑适用场景
while先判断,后执行(可能不执行)不确定循环是否需要执行的场景
do...while先执行,后判断循环体至少需要执行一次的场景

        3. for 循环

                1)基本形式:
for (初始化表达式; 循环条件; 循环变量更新) {
    循环体(满足条件时执行的代码)
}
                2)执行流程

                        ■  初始化:执行一次初始化表达式(如定义或赋值循环变量)

                        ■  判断条件:检查循环条件,若为真(非 0)则执行循环体,若为假(0)则退出                                                  循环

                        ■  更新变量:执行循环体后,执行循环变量更新操作(如自增 / 自减)

                        ■  重复步骤 2 和 3,直到判断条件部分为假

                        ■  示例

/* 输出数字 1~5 */

/* i从1开始,每次循环后+1,直到i>5时结束 */
for (int i = 1; i <= 5; i++)
{
    printf("%d ", i);
/* 判断i是否≤5,成立则继续循环 */
}
    // 输出结果:1 2 3 4 5 
                3)双层 for 循环:

                        ■  外层循环一次,里层循环一遍

for (初始化表达式1; 循环条件1; 循环变量更新1)
{
    for (初始化表达式2; 循环条件2; 循环变量更新2)
    {
        循环体(满足条件时执行的代码);
    }
}

                        ■  示例

/* 使用双层for循环打印99乘法表 */
#include <stdio.h>

int main() 
    {
    // 外层循环控制行数
    for (int i = 1; i <= 9; i++) {
        // 内层循环控制每行的列数
        for (int j = 1; j <= i; j++) {
            // 打印"j × i = 乘积",并控制格式对齐
            printf("%d×%d=%d\t", j, i, j * i);
        }
        // 每行结束后换行
        printf("\n");
    }
    return 0;
}

        4. goto

                ○  是一个跳转语句,用于无条件跳转到函数内的指定标签处执行代码

                1)基本形式:
// 定义标签(标签名后加冒号)
标签名:
    语句;

// 在其他位置使用goto跳转
goto 标签名;

                        ■  示例

                                □  跳转

#include <stdio.h>

int main() {
    printf("开始\n");
    
    goto end;  // 跳转到end标签处
    
    printf("这里的代码不会执行\n");  // 被跳过
    
end:  // 标签定义
    printf("结束\n");
    return 0;
}

                                □  在循环中提前退出(替代多层 break)

#include <stdio.h>

int main() {
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            if (i == 1 && j == 1) {
                goto exit_loop;  // 跳转到循环外部
            }
            printf("i=%d, j=%d\n", i, j);
        }
    }
    
exit_loop:  // 循环外的标签
    printf("已退出循环\n");
    return 0;
}

五、辅助控制语句

        1. break

                ○  跳出当前循环或者switch中

                ○  强制终止当前所在的循环,使用break

        2. continue

                ○  用于跳过循环体中剩余的代码,直接进入下一次循环

                ○  循环中想要屏蔽某几次循环使用continue

        3. return

                ○  用于终止当前函数的执行,并返回一个值给调用者

语句作用范围效果
break循环(for / while)、switch终止当前结构,跳出执行
continue循环(for / while)跳过当前循环剩余代码,进入下一次循环
return函数内任意位置终止当前函数,返回值给调用者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值