当前位置: 首页 > article >正文

【嵌入式学习2】位运算 - 控制语句

目录

## 位运算练习

## 程序执行的三大流程

## 分支语句

1、if 语句

2、if....else

3、三目运算符

4、if....else if....else

5、switch

## 分支语句总结:

使用 if:

使用 switch:

## 分支语句综合

案例需求:

## 位运算练习

二进制数 10101001 有8位,位数的计数从右往左开始,最低位(最右边的位)是第0位,最高位(最左边的位)是第7位。

// 将变量a的第1位设置为1,其他位保持不变
uint8_t a = 0b10101001;  // 0xa9
/*
    10101001
    00000010
    a | = 2 或者 a = a | 0b00000010;
    printf("%#x\n", a);
*/

// 将变量b的第3位设置为0,其他位保持不变
uint8_t b = 0b10101001;  // 0xa9
/*
    b = b & 0b11110111
    printf("%#x\n", b);
*/

// 将变量c的第7位取反,其他位保持不变
uint8_t c = 0b10101001;  // 0xa9
/*
    10101001
    10000000
    c = c ^ 0b10000000; //异或:相同0,不同1
    printf("%#x\n", c);
*/

// 将变量d的第0位和第7位取反
uint8_t d = 0b10110011;  // 0xb3;
/*
    d = d ^ 0b10000001;
    printf("%#x\n", d);

*/

// 检查变量e的第7位是否为1,如果是则输出"Bit is set",否则输出"Bit is not set"。
uint8_t e = 0b10110011; 
/*
    e = e >> 7; // 0b1,通过右移运算直接可以查看第七位数值
    if (e > 0) {
        printf("bit is set\n");
    } else {
        printf("bit is not set\n");
    }
*/

## 程序执行的三大流程

  • 顺序 : 从上向下, 顺序执行代码
  • 分支 : 根据条件判断, 决定执行代码的分支
  • 循环 : 让特定代码重复的执行

## 分支语句

1、if 语句
if (条件) {
    条件成立时,要做的事
    ……
}
2、if....else
if (条件) {
    条件成立时,要做的事
    ……
} else {
	条件不成立时,要做的事 
    ……
}
3、三目运算符
a>b?a:b;
如果a>b,整体为结果a,否则整体结果为b
4、if....else if....else
if (条件1) {
    条件1成立时,要做的事
    ……
} else if(条件2) {
	条件2成立时,要做的事 
    ……
} else {
	条件不成立时,要做的事 
    ……
}
5、switch
switch (expression) {
    case value1:
        // 代码块1
        break;
    case value2:
        // 代码块2
        break;
    default:
    	// 代码块3
}
    

## 分支语句总结:

  • 使用 if
  • 当条件复杂,涉及多个变量或逻辑运算符时。
  • 当需要判断的类型不是整数或枚举时。
  • 当分支较少(通常不超过3个)时。
  • 使用 switch
  • 当基于单个整数或枚举变量的值进行多分支选择时。
  • 当分支较多(超过3个)时。
  • 当需要更直观的代码结构时。

## 分支语句综合

案例需求:
  • 输入:年份(整数)和月份(整数)
  • 输出:该月份的天数(整数)
#include <stdio.h>

int main() {
    // 1.定义变量保存年份、月份、天数
    int year, month, day;
    // 2.输入年份和月份
    scanf("%d %d", &year, &month);
    // 3.根据月份输出天数
    switch (month) {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            day = 31;
            break;
        case 4:
        case 6:
        case 9:
        case 11:
            day = 30;
            break;
        case 2:
            // 2月   非闰年 28天  闰年 29天
            // 闰年判断:能被4整除,但不能被100整除的;或者能被400整除的年份
            if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
                day = 29;
            } else {
                day = 28;
            }
            break;
        default:
            day = -1;
    }

    printf("%d 年 %d 月 有 %d 天\n", year, month, day);

    return 0;
}

## 循环语句

为什么要使用循环语句:

  • 重复执行任务时:提高效率,处理大量数据
  • 实现特定算法逻辑:迭代,搜索与排序算法
  • 实现动态用户交互:持续输入的处理

1、while
while (条件) {
    循环体
    ……
}
2、do...while

do-while 在执行循环体之后才检查条件表达式的值

所以 do-while 语句的循环体至少执行一次,被称为直到型循环

do {
    循环体
    ……
} while (条件);
3、for
for ( init; condition; increment ) {
	循环体
}
4、死循环
int main() {
    while (1) {
        printf("死循环1\n");
    }

    for(;;) {
        printf("死循环2\n");
    }

    return 0;
}
5、嵌套循环
通过嵌套循环打印以下内容:
*
* * 
* * * 
* * * *
* * * * * 
#include <stdio.h>

int main()
{
    for(int j=0;j<5;j++)
    {
        for(int i=0;i<j+1;i++)
        {
            printf("* ");
        }
        printf("\n");
    }

    return 0;
}

解题思路:

①该题是5x5的 “*” 的矩阵输出变型,该图与 5 x 5的矩阵区别在于i和j的关系

②每一行输出的“*”数量等于该行的行数,由此可以得出第二个for中的判断关系,由于i和j'都由0开始数,所以判断条件中要变成j+1

## 跳转关键字

1、break:循环和switch专属的跳转

某一条件满足时,不再执行循环体中后续重复的代码,并退出循环

2、continue:循环专属跳转

某一条件满足时,不再执行本次循环体中后续重复的代码,但进入下一次循环判断

注意:while循环中,continue 之前一定要修改计数器(条件变量),否则会导致死循环

错误:当i等于3时,continue语句会执行,跳过i += 1和print(i),直接开始下一次循环。但是,由于i的值没有增加,循环条件i < 5始终为True,循环将永远不会结束,导致死循环。
i = 0
while i < 5:
    if i == 3:
        continue
    i += 1
    print(i)

正确:
i = 0
while i < 5:
    i += 1
    if i == 3:
        continue
    print(i)
3、goto:无条件跳转

从一组嵌套的循环中跳出可以使用goto

#include <stdio.h>

int main() {

    int i = 0;
    while (i < 3) {
        if(i == 1) {
            goto End;	// 跳转到End标签
        }
        printf("i = %d\n", i);
        i++;
    }
    
    End:
        printf("this is ending!\n");

    return 0;
}

http://www.kler.cn/a/597997.html

相关文章:

  • 游戏引擎学习第175天
  • 前端 -- 计算机图形学基础:光与三角形面(Mesh)求交
  • gonet开源游戏服务器环境配置
  • MySQL颠覆版系列————MySQL新特性(开启数据库的新纪元)上篇
  • 1. 页面级一多开发:
  • Unity摄像机基本操作详解:移动、旋转与缩放
  • Java处理Markdown格式内容转换为Word文档
  • JavaScript 性能优化实战
  • 计算机网络的分类及其性能指标
  • Redis简单介绍和安装
  • Centos7搭建Zabbix4.x监控HCL模拟网络设备:zabbix-server搭建及监控基础02
  • 系统转换、系统维护、净室软件工程、构件软件工程(高软51)
  • c++有n个范围是-1e9~1e9的数,去统计每个数的个数?
  • 位示图大小的计算
  • 【递归、搜索和回溯算法】专题三 :穷举VS暴搜VS深搜VS回溯VS剪枝
  • 【ROS实战】02-ROS架构介绍
  • 如何使用SystemVerilog SVA检查跨时钟域信号?
  • [c语言日寄]数据输入
  • GEO与AISEO的关系解析:核心差异与协同逻辑
  • Qt-Q_ENUM宏和QMetaEnum类