[嵌入式C][入门篇] 快速掌握基础3 (运算符)

开发环境:

  1. 网页版:跳转
  2. 本地开发(Vscode):跳转

文章目录

  • 一、 简介
  • 二、算术运算符
    • (1)示例代码:
    • (2)++和--的先后顺序(直接看效果)
  • 三、逻辑运算符
    • (1)示例代码
  • 四、位运算符
    • (1) 真值表
    • (2) 示例代码
  • 五、赋值运算符
    • (1) 示例代码
  • 六、比较运算符
    • (1) 示例代码
  • 七、杂项运算符
    • (1) 示例代码
  • 八、运算符的优先级

一、 简介

运算符类型作用
算术运算符用于处理四则运算
赋值运算符用于将表达式的值赋给变量
比较运算符用于表达式的比较,并返回一个真值或假值
逻辑运算符用于根据表达式的值返回真值或假值
位运算符用于处理数据的位运算
sizeof运算符用于求字节数长度(编译器预处理,不影响运行效率)

二、算术运算符

运算符描述实例
+把两个操作数相加A + B 将得到 30
-从第一个操作数中减去第二个操作数A - B 将得到 -10
*把两个操作数相乘A * B 将得到 200
/分子除以分母B / A 将得到 2
%取模(取余)运算符,整除后的余数B % A 将得到 0
++自增运算符,整数值增加 1A++ 将得到 11
自减运算符,整数值减少 1A-- 将得到 9

(1)示例代码:

#include <stdio.h>
int main() {int a = 21;int b = 10;int c ;printf("a + b = %d\n", a + b);printf("a - b = %d\n", a - b);printf("a * b = %d\n", a * b);printf("a / b = %d\n", a / b);printf("a % b = %d\n\n", a % b);c = a++;  // a赋值后再加 1 ,c 为 21,a 为 22printf("c = %d, a = %d\n", c, a);c = a--;  // a赋值后再减 1 ,c 为 22 ,a 为 21printf("c = %d, a = %d\n", c, a);
}

在这里插入图片描述

(2)++和–的先后顺序(直接看效果)

在这里插入图片描述

#include <stdio.h>
int main(){int c;int a = 10;c = a++; printf("先赋值后运算:c=%d, a=%d\n", c, a); // a赋值后再加1,c 为 10,a 为 11a = 10;c = a--; printf("先赋值后运算:c=%d, a=%d\n", c, a); // a赋值后再减1,c 为 10 ,a 为 9a = 10;c = ++a; printf("先运算后赋值:c=%d, a=%d\n", c, a); // a加1后再赋值,c 为 11,a 为 11a = 10;c = --a; printf("先运算后赋值:c=%d, a=%d\n", c, a); // a加1后再赋值,c 为 9,a 为 9
}

三、逻辑运算符

C 语言的比较运算中, “真”用数字“1”来表示, “假”用数字“0”来表示

运算符术语描述实例
&&a && b如果a和b都为真,则结果为真,否则为假。
||a || b如果a和b有一个为真,则结果为真,二者都为假时,结果为假。
!!a如果a为假,则!a为真; 如果a为真,则!a为假。

(1)示例代码

#include <stdio.h>
#include <stdbool.h>
// true = 1 = 真
// false = 0 = 假
int main() {bool a = true;bool b = true;bool c = false;bool d = false;printf("---[与]需要条件同时满足才能为真---\n\n");printf("a && b = %d\n" , a && b); // 真 && 真 = 真printf("a && c = %d\n" , a && c); // 真 && 假 = 假printf("c && d = %d\n\n" , c && d); // 假 && 假 = 假printf("---[或]只有任意一个条件满足即可---\n\n");printf("a || b = %d\n" , a || b); // 真 || 真 = 真printf("a || c = %d\n" , a || c); // 真 || 假 = 真printf("c || d = %d\n\n" , c || d); // 假 || 假 = 假printf("---[非] 取反---\n\n");printf("!(a && b) = %d\n" , !(a && b)); // !(真 && 真 = 真) = 假printf("!(a && c) = %d\n" , !(a && c)); // !(真 && 假 = 假) = 真
}

在这里插入图片描述

四、位运算符

运算符术语描述实例
&位与有0为0,全1为10 & 0 = 0;
0 & 1 = 0;
1 & 0 = 0;
1 & 1 = 1;
|位或有1为1 ,全0位00 | 0 = 0;
0 | 1 = 1;
1 | 0 = 1;
1 | 1 = 1;
^位异或相同为0,不同为10 ^ 0 = 0;
0 ^ 1 = 1;
1 ^ 0 = 1;
1 ^ 1 = 0;
~位取反0变1,1变0~1 = -2;
~0 = -1;
<<左移左移 n 位相当于乘以 2 的 n 次方。A << 2 将得到 240,即为 1111 0000
>>右移右移n位相当于除以 2 的 n 次方A >> 2 将得到 15,即为 0000 1111

(1) 真值表

位运算符作用于位,并逐位执行操作。&、 | 和 ^ 的真值表如下所示:

pqp & q (与)p | q(或)p ^ q(异或)
00000
01011
11110
10011

(2) 示例代码

#include <stdio.h>
#include <stdint.h>
#include <string.h>
char *itoa(uint32_t value, char *string, uint8_t radix);
int main() {uint8_t a = 60;    /* 60 = 0011 1100 */  uint8_t b = 13;    /* 13 = 0000 1101 */uint8_t c = 0;char a_B[10]={0}; // 存放A值的二进制char b_B[10]={0}; // 存放B值的二进制char val_B[10]={0}; // 结果的二进制itoa(a&b, val_B, 2); // 10进制转2进制itoa(a, a_B, 2); // 10进制转2进制itoa(b, b_B, 2); // 10进制转2进制printf("[位与] 如果两个相应的位都为 1,则结果为 1,否则为 0。\r\n");printf("[位与] a & b = %d, 计算过程:\r\n", a & b); // 0000 1100 = 12printf("\t二进制:a = %s\n\t二进制:b = %s\n\t\t    val = %s\n", a_B, b_B, val_B);printf("--------------------------------------------\n\n");itoa(a|b, val_B, 2); // 10进制转2进制itoa(a, a_B, 2); // 10进制转2进制itoa(b, b_B, 2); // 10进制转2进制printf("[位或] 如果两个相应的位都为 0,则结果为 0,否则为 1。\r\n");printf("[位或] a | b = %d, 计算过程:\r\n", a | b); // 0011 1101 = 61printf("\t二进制:a = %s\n\t二进制:b = %s\n\t\t    val = %s\n", a_B, b_B, val_B);printf("--------------------------------------------\n\n");itoa(a^b, val_B, 2); // 10进制转2进制itoa(a, a_B, 2); // 10进制转2进制itoa(b, b_B, 2); // 10进制转2进制printf("[位异或] 如果两个相应的位值相同,则结果为 0,否则为 1。\r\n");printf("[位异或] a ^ b = %d, 计算过程:\r\n", a ^ b); // 0011 0001 = 49printf("\t二进制:a = %s\n\t二进制:b = %s\n\t\t    val = %s\n", a_B, b_B, val_B);printf("--------------------------------------------\n\n");itoa(a, a_B, 2); // 10进制转2进制itoa((uint8_t)(~a), val_B, 2); // 10进制转2进制printf("[取反] 将每一位的 0 变为 1,1 变为 0。\r\n");printf("[取反] ~a = %d, 计算过程:\r\n", ~a); // 1100 0011 = -61printf("\t二进制:a = %s\n\t\t    val = %s\n", a_B, val_B);printf("--------------------------------------------\n\n");itoa(a, a_B, 2); // 10进制转2进制itoa((uint8_t)(a << 2), val_B, 2); // 10进制转2进制printf("[左移] 左移 n 位相当于乘以 2 的 n 次方。\r\n");printf("[左移] a<<2 = %d, 计算过程:\r\n", a << 2); // 1111 0000 = 240printf("\t二进制:a = %s\n\t\t    val = %s\n", a_B, val_B);printf("--------------------------------------------\n\n");itoa(a, a_B, 2); // 10进制转2进制itoa((uint8_t)(a >> 2), val_B, 2); // 10进制转2进制printf("[右移] 右移n位相当于除以 2 的 n 次方。\r\n");printf("[右移] a>>2 = %d, 计算过程:\r\n", a >> 2); // 00001111 = 15printf("\t二进制:a = %s\n\t\t    val = %s\n", a_B, val_B);printf("--------------------------------------------\n\n");
}
// value 被转换的整数,*string 转换后储存的字符数组radix 转换进制数,如2,8,10,16 进制等。
char *itoa(uint32_t value,char *string,uint8_t radix) {char zm[37]="0123456789abcdefghijklmnopqrstuvwxyz";char aa[100]={0};int sum=value;char *cp=string;int i=0;if(radix < 2||radix > 36){ //增加了对错误的检测printf("error data!\r\n");return string;}if(value<0){printf("error data!\r\n");return string;}while(sum>0){aa[i++]=zm[sum%radix];sum/=radix;}for(int j=i-1;j>=0;j--){*cp++=aa[j];}*cp='\0';cp=string;//printf("%d|%s|%d\r\n", i, string,value);if (i < 8) {memmove(cp + (8-i), cp, i);for(int j=0;j<8-i;j++){*cp++='0';}} else if (i < 16 && i >8) {memmove(cp + (8-i), cp, i);for(int j=0;j<16-i;j++){*cp++='0';}} else if (i < 32 && i >16) {memmove(cp + (8-i), cp, i);for(int j=0;j<32-i;j++){*cp++='0';}}//printf("%d|%s|%d\r\n", i, string,value);return string;
}

在这里插入图片描述
在这里插入图片描述

五、赋值运算符

运算符描述实例
=等号,数学概念C = A + B 将把 A + B 的值赋给 C
+=加某个值,缩写的形式C += A 相当于 C = C + A
-=减某个值,缩写的形式C -= A 相当于 C = C - A
*=乘某个值,缩写的形式C *= A 相当于 C = C * A
/=除个值,缩写的形式C /= A 相当于 C = C / A
%=求余某个值,缩写的形式C %= A 相当于
<<=左移某个值,缩写的形式C <<= 2 等同于 C = C << 2
>>=右移某个值,缩写的形式C >>= 2 等同于 C = C >> 2
&=按位与某个值,缩写的形式C &= 2 等同于 C = C & 2
^=按位异或某个值,缩写的形式C ^= 2 等同于 C = C ^ 2
|=按位或某个值,缩写的形式C |= 2 等同于 C = C

(1) 示例代码

#include <stdio.h>
int main() {int a = 4;int c = 0;printf("a = %d\r\n", a);c = a;printf("[等号] c = a ,结果:c = %d\n", c);a += 2;printf("[相加] a += 2,等价:a = a + 2,  结果: %d\n", a);a = 4;a -= 2;printf("[相减] a -= 2,等价:a = a - 2,  结果:%d\n", a);a = 4;a *= 2;printf("[相乘] a *= 2,等价:a = a * 2,  结果:%d\n", a);a = 4;a /= 2;printf("[相除] a /= 2,等价:a = a ÷ 2, 结果:%d\n", a);a = 4;a %= 2;printf("[求余] a %= 2,等价:a = a %% 2,  结果:%d\n", a);a = 4;a <<= 2;printf("[左移] a <<= 2,等价:a = a << 2,  结果:%d\n", a);a = 4;a >>= 2;printf("[右移] a >>= 2,等价:a = a >> 2,  结果:%d\n", a);a = 4;  // 4 = 100a &= 3; // 3 = 011   如果两个相应的位都为 1,则结果为 1,否则为 0。printf("[位与] a &= 3,等价:a = a & 3,  结果:%d\n", a);a = 4;  // 4 = 100a |= 2; // 2 = 010   如果两个相应的位都为 0,则结果为 0,否则为 1。printf("[位或] a |= 2,等价:a = a | 2,  结果:%d\n", a);a = 4;  // 4 = 100a ^= 2; // 2 = 010   如果两个相应的位值相同,则结果为 0,否则为 1。printf("[位异或] a ^= 2,等价:a = a ^ 2,  结果:%d\n", a);
}

在这里插入代码片

六、比较运算符

运算符描述实例
==检查两个操作数的值是否相等,如果相等则条件为真。(A == B) 为假。
!=检查两个操作数的值是否相等,如果不相等则条件为真。(A != B) 为真。
>检查左操作数的值是否大于右操作数的值,如果是则条件为真。(A > B) 为假。
<检查左操作数的值是否小于右操作数的值,如果是则条件为真。(A < B) 为真。
>=检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。(A >= B) 为假。
<=检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。(A <= B) 为真。

(1) 示例代码

#include <stdio.h>
int main() {int a = 21;int b = 10;printf("a=%d, b=%d.  结果:1--成立  0--不成立\n", a, b);printf("a == b, 结果:%d\n", a == b);printf("a < b,  结果:%d\n", a < b);printf("a > b,  结果:%d\n", a > b);printf("a >= b,  结果:%d\n", a >= b);printf("a <= b,  结果:%d\n", a <= b);
}

在这里插入图片描述

七、杂项运算符

运算符描述实例
sizeof()返回变量的大小。sizeof(a) 将返回 4,其中 a 是整数。
&返回变量的地址。&a; 将给出变量的实际地址。
*指向一个变量。*a; 将指向一个变量。
? :三目表达式如果条件为真 ? 则值为 X : 否则值为 Y
[ ]下标运算符,数组的时候使用的a[10], b[20]
.引用运算符,结构体的时候使用a.cnt, b.size
->指向运算符,结构体指针的时候使用a->cnt, b->size

(1) 示例代码

#include <stdio.h>
#include <stdint.h>
typedef struct { // 字节对齐,按最大成员字节转换uint8_t cnt; // 编译器强制转换为uint16_tuint16_t size;
} xjq_t;
int main() {xjq_t lisun = {1, 4};uint8_t a[10], b[20];printf("取变量大小: sizeof(xjq_t),  结果:%d\n\n", sizeof(xjq_t));printf("取变量地址:&lisun,  结果:0x%X\n\n", &lisun);printf("三目运算:(lisun.cnt == 0) ? 1 : 0,  结果:%d\n\n", (lisun.cnt == 0) ? 1 : 0);a[0] = 0; a[1] = 1; a[2] = 2;printf("数组下标: a[1],  结果:%d\n\n", a[1]);printf("引用运算符: lisun.cnt  lisun.size,  结果:%d, %d\n\n", lisun.cnt, lisun.size);xjq_t *p = &lisun; // 将地址传递给指针printf("指向运算符: p->cnt  p->size,  结果:%d, %d\n\n", p->cnt, p->size);
}

在这里插入图片描述

八、运算符的优先级

优先级类别运算符平级时
1后缀() [] -> . ++ - -从左到右
2一元+ - ! ~ ++ - - (type)* & sizeof从右到左
3乘除* / %从左到右
4加减+ -从左到右
5移位<< >>从左到右
6关系< <= > >=从左到右
7相等== !=从左到右
8位与&从左到右
9位异或^从左到右
10位或|从左到右
11&&从左到右
12逻辑或 OR||从左到右
13三目运算符?:从右到左
14赋值= += -= *= /= %=>>= <<= &= ^= |=从右到左
15逗号,从左到右

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/603811.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络对讲终端 网络音频终端 网络广播终端SV-7011V使用说明

高速路sip广播对讲求助 隧道sip对讲调度SIP-7011 网络广播终端SV-7011 壁挂式对讲终端网络监听终端SIP广播终端 sip语音对讲终端SIP-7011 SV-7011网络对讲终端网络对讲、网络厂播、监听 SV-7101网络解码终端提供一路线路输出接功放或有源音箱。 SV-7102网络解码广播终端两…

HNU-数据库系统-讨论课2

第二次小班讨论课安排如下: 主题: 数据库系统设计与应用开发。 目的&#xff1a;让学生通过练习和讨论充分掌握数据库系统的设计与应用开发。 内容: 设计和实现一个数据库及应用系统。设计内容包括系统分析、系统设计、 数据库设计&#xff08;需求分析、概念结构设计、逻辑…

Ranger UserSync

作用 同步User到RangerDb 架构 解析 启动一个while(True) 进程定时同步&#xff0c;程序入口 source sink 掉接口获取Ranger User 并且Cache 计算delta 同步

JavaScript基础(24)_dom查询练习(一)

<!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><link rel"stylesheet" href"../browser_default_style/reset.css"><title>dom查询练习一</title><style>.text {widt…

Anaconda 环境中安装OpenCV (cv2)

1、使用Anaconda 的对应环境&#xff0c;查看环境中的Python版本号 (1)使用Anaconda 查看存在的环境&#xff1a;conda info --env (2)激活环境&#xff1a;conda activate XXX 2、根据版本号&#xff0c;下载对应的 python-opencv 包 &#xff08;1&#xff09;选择国内源的…

【算法Hot100系列】括号生成

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

Android RecyleView 使用 Gilde 加载图片引发的卡顿问题

Glide 是一个用于 Android 的图片加载和缓存库。它可以帮助开发者快速、高效地加载网络图片、本地文件和视频帧&#xff0c;并且能够自动缓存图片数据&#xff0c;减少网络请求。Glide 具有良好的性能和易用的 API&#xff0c;支持常见的图片加载需求&#xff0c;例如图片压缩、…

scroll、offset、client —— JS三大家族

简介&#xff1a; clientHeight: 元素的可见高度&#xff0c;不包括边框和滚动条&#xff0c;是相对于视口的大小——clientHeight (content height) (padding toppadding bottom)。offsetHeight: 元素的高度&#xff0c;包括边框和滚动条&#xff0c;但不包括外边距 —— o…

即时设计:设计流程图,让您的设计稿更具条理和逻辑

流程图小助手 在设计工作中&#xff0c;流程图是一种重要的工具&#xff0c;它可以帮助设计师清晰地展示设计思路和流程&#xff0c;提升设计的条理性和逻辑性。今天&#xff0c;我们要向您推荐一款强大的设计工具&#xff0c;它可以帮助您轻松为设计稿设计流程图&#xff0c;让…

研旭开发板资料下载地址--DSP28335资料

研旭电气开发板网盘资料 温馨提示:南京研旭提供两种网盘下载方式,第一种是奶牛快传(下载速度快,但偶尔会出现下载不了的情况),第二种是百度网盘(下载速度较慢,偶尔会出现链接失效的情况),请自行选择合适的下载方式,如有其它问题请旺旺联系客服解决哦! 1、研旭F28…

MIT 6.s081 实验解析——labs2

系列文章目录 MIT 6.s081 实验解析——labs1 MIT 6.s081 实验解析——labs2 文章目录 系列文章目录测试判断流程System call tracingsysinfo![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/ab9ca34f1fc64b6aa1df74613dc1a397.png) 测试判断流程 完成代码后将.c文…

【温故而知新】JavaScript的数组常用方法

一、概念 在JavaScript中&#xff0c;数组是一种数据结构&#xff0c;用于存储和操作有序的元素集合。这些元素可以是不同的数据类型&#xff0c;包括数字、字符串、布尔值、对象或函数等。 JavaScript中的数组具有以下特点&#xff1a; 动态长度&#xff1a;JavaScript的数…

MyBatis接口的方法上使用,定义对应的 SQL 操作

目录标题 一、Mapper&#xff1a;二、Select、Insert、Update、Delete&#xff1a;三、Results、Result&#xff1a;四、Param&#xff1a;五、# 和 $&#xff1a; MyBatis 是一款基于 Java 的持久层框架&#xff0c;它通过简化数据库操作来帮助开发者构建更好的数据库访问应用…

day08 反转字符串 反转字符串Ⅱ 替换数字 翻转字符串里的单词 右旋转字符串

题目1&#xff1a;344 反转字符串 题目链接&#xff1a;344 反转字符串 题意 字符串是数组的形式&#xff0c;使用O(1)的空间将字符串反转 双指针法 法一 代码 class Solution { public:void reverseString(vector<char>& s) {for(int i0,js.size()-1;i<s.s…

YoloV8改进策略:Shape-IoU,考虑边框形状与尺度的度量

摘要 本文尝试使用最新的Shape-IoU改进YoloV8,在我自己的数据集上实现了涨点。 论文:《Shape-IoU:考虑边框形状与尺度的度量》 https://arxiv.org/pdf/2312.17663.pdf 作为检测器定位分支的重要组成部分,边界框回归损失在目标检测任务中发挥着重要作用。现有的边界框回归…

2024年中国股市会发生怎样的格局变化?

&#xff08;1&#xff09; 本来桌面上坐了四个利益方&#xff1a; 主力 北上 游资 散户 &#xff08;1&#xff09; 主力有两种&#xff0c;一种是国家队&#xff0c;是压舱石&#xff0c;不能乱动&#xff0c;是稳定政府方投资的各种中特估金特估、科创专精特新。不能让政府的…

linux中最常用的网络命令

文章目录 linux中最常用的网络命令查看网络信息的原初 ifconfig默认无参数使用-s显示短列表配置IP地址修改MTU启动关闭网卡 网络中不中&#xff0c;先看ping行不行语法不加任何参数发送指定数目设定发送时间间隔组合使用 Linux ip命令显示网络设备设置IP地址启动关闭网卡统计方…

MIML-DA

图3呢&#xff1f;且作者未提供代码

C#编程-显示运算符重载

重载函数的概念也可以应用于运算符。在将C#运算符应用到用户定义的数据类型时,运算符重载为它们提供额外的能力。只可以重载预定义的C#运算符组。 运算符重载的必要性 大多数内置数据类型都有与它们相关的预定义运算符。例如:带有运算符+、-、*和/的C#数据类型int为数学运算…

【大数据】基于 Flink CDC 构建 MySQL 和 Postgres 的 Streaming ETL

基于 Flink CDC 构建 MySQL 和 Postgres 的 Streaming ETL 1.准备阶段1.1 准备教程所需要的组件1.2 下载 Flink 和所需要的依赖包1.3 准备数据1.3.1 在 MySQL 数据库中准备数据1.3.2 在 Postgres 数据库中准备数据 2.启动 Flink 集群和 Flink SQL CLI3.在 Flink SQL CLI 中使用…