嵌入式0基础开始学习 ⅠC语言(2)运算符与表达式
1.运算符
什么是运算符?
用来进来某种运算的符号
如:
+ - * / (取余,取模)
a,几目运算符
根据其操作数的不同
单目运算符
该运算符只需要带一个操作数
如: ++ -- &(取地址符)
双目运算符:
该运算符只需要带两个操作数
如: + - * /
三目运算符:
该运算符需要带三个操作数
如:
a?b:c:
如果表达式a为真,那么整个表达式的值为b,否则整个
表达式的值为c
b,结合性
决定先算谁后算谁问题
从左到右,从右到左
如:
+结合性:从左到右
a+b
先算a的值,再算b的值
最后再算表达式a+表达式b的值
=结合性:从右到左
a=b
先算b的值
再将b的值,写到变量a所对应的存储单元中去
例子:
在c语言中,a+b,是否和b+a的含义一样呢?
不一定,why?
如:
i=5,j=6
(i++)+(i+j) =>5 + 6+6
(i+j)+(i++) =>(5+6)+5
c,优先级
是指在一个含有多个运算符的表达式中,先算哪一个运算符,再算哪一个运算符。
单目运算符 > 算术运算符 > 关系运算符 > 逻辑运算符 > 条件运算符 > 赋值运算符 > 逗号运算符
(1)算术运算符
进行算术运算的运算符
+ - * % / :双目运算符,结合性从左到右
例子:
5 /4 => 1(整数进行算术运算结果为整数)
5.0 / 4 =>1.25
typeof(5/4) =>int
typeof(5.0/4)=>double
(double)(3/2) => 1.0
(double)3/2 =>1.5
思考:
用c语言的表达式来描述数学表达式
数学:
a/b
c语言中:
(double)a /b
1.0*a /b
%: 取余,求模
规定,要求两个操作数都必须为整数
5%4 => 1
5%4.0=> ERROR
4%5 =>4
++:
自增运算符
i++//先使用i再++
++i//先++再使用i
--:
自减运算符
i--
--i
单目,要求操作数必须为一个”左值“(可写的地址)
例子:
5++ =>ERROR
(a+b)++ => ERROR
表达式 表达式的值 做完这个表达式之后i的值
i++ i i = i+1
++i i+1 i = i+1
i-- i i = i-1
--i i-1 i = i-1
例子:
(1)int i =5;
a= i++;//把表达式(i++)的值赋值给a,表达式i++的值为5
printf("%d\n",a);//5
printf("%d\n",i);//6
int i =5;
a = ++i;//把表达式(++i)的值赋值给a,表达式++i的值为6
printf("%d\n",a);//6
printf("%d\n",i);//6
(2)i =5;
(i++)+(i++)+(i++)
拒绝做此类题目!!!
因为它没有任何意义
如果老板要你们做这类题目
那就请你将你的BOSS直接炒鱿鱼
(2)关系运算符
用来判断两个东西关系的运算符(大小关系)
< > <= >= == !=
都是属于双目运算符,结合性都是从左到右。
关系表达式:用关系运算符连接的式子。
关系表达式的值:
关系成立 =>1
关系不成立 =>0
例子:
表达式 表达式的值
5>4 1
3<=2 0
0!=1 1
5>4>3 0
5>4>3: 是一个合法的表达式
表达式的含义(5>4)>3
拿表达式5>4的值,与3进行PK
数学含义:
5>4 并且 4>3
问题?
咱们能不能用c语言来描述数学上的5>4>3呢?
涉及到 ”并且“如何来表达?
(3)逻辑运算符
用来描述逻辑关系的运算符
! 逻辑非 单目运算符 ”取反“
!真 =>假
!假 =>真
&& 逻辑与 双目运算符 ”并且“ 结合性从左到右
真&&真 => 真
真&&假 => 假
假&&假 => 假
假&&真 => 假
|| 逻辑或 双目运算符 ”或者“ 结合性从左到右
真||真 => 真
真||假 => 真
假||假 => 假
假||真 => 真
逻辑表达式:就是用逻辑运算符连接起来的式子
逻辑表达式的值:
逻辑真(非0,1)
逻辑假 0
例子:
a = 4, b= 5;
a&&b =>1
a&&0 =>0
(3+5)||(0) => 1
!a || b =>1
4&&0 || 2 =>1
5>3 && 8<4-!0
=>5>3 && 8<4-1
=>5>3 && 8<3
=>1&&0
=> 0
练习:
用逻辑表达式来判断y(输入的年份)是否为闰年
(1)能被4整除,但是不能被100整除
(2)能被400整除
#include <stdio.h>
int main()
{
int a;
printf("请输入年份:");
scanf("%d", &a);
if(a%4==0&&a%100!=0||a%400==0)
{
printf("%d是闰年",a);
}
else
{
printf("%d不是闰年",a);
}
return 0;
}
分析一下代码的输出结构
int a,b,c,d,m,n;
a =1;
b =2;
c =3;
d = 4;
m =0;
n= 0;
(m=a<b)||(n=c<d);
printf("%d\n",m);//1
printf("%d\n",n);//0
(m=a>b)&&(n=c<d);
printf("%d\n",m);//0
printf("%d\n",n);//0
C语言运算符是”惰性运算“
(1)a&&b&&c
只有a为真时,才去判断b的值
只有a,b都为真,才去判断c的值
(2)a||b||c
只要a为真,就不需要再去判断b,c的值
只有a为假,才需要去判断b的值
只有a和b都为假,才需要去判断c的值
如果事先知道表达式的值,那么后面的运算符(表达式)就不需要执行了
,这就是c语言运算符的”惰性“
(4)位运算符
位运算符是指按bit位来进行运算
位运算符要求操作数必须为整数
有如下:
& 按位与
| 按位或
~ 按位取反
^ 按位异或
<< 按位左移
>> 按位右移
除了~是单目之外,其他的位运算符都是双目运算符,结合性都是从左到右
位运算符操作数只能是整数
所有的位运算都是把操作数变成bit序列,然后再按bit位来进行运算
~(按位取反)
1 -> 0
0 -> 1
int a = ~3;
3:
00000000 00000000 00000000 00000011
~3;
11111111 11111111 11111111 11111100 <--a最终再计算机的存储形式
%d:
符号位:
-1
逆运算:
负数:-4
%u: 2^32-4
&(按位与):
a b a&b
1 1 1
0 1 0
1 0 0
0 0 0
& 如果两个bit操作数都为1,其结果才为1,否则为0
例子: int a =3 & 5;
8bits:
0000 0011 (3)
0000 0101 (5)
&----------------
0000 0001 (1)
练习:
写一个表达式
假设有一个整型变量a,要把a的第5个bit变成0,
其他的bit保持不变,该怎么操作?
a:
xxXxxxxx
& 11011111 <= ~(00100000) <= ~(1<<5)
a = a& ~(1<<5);
结论:
一个bit位与0进行”按位与“的操作,结果为0
x&0 => 0
一个bit位与1进行”按位与“的操作,结果为原值
x&1 => x
| 按位或:
a b a|b
0 0 0
0 1 1
1 0 1
1 1 1
| 按位或,只要有一个bit操作数为1,其结果就为1
例子:
int a = 3| 5;
8bits:
0000 0011 (3)
0000 0101 (5)
|------------
0000 0111 (7)
练习;
写一个表达式
有一个整型变量a,要使a的第五位bit置1,其他的bit保持不变
该如何操作?
a:
xxXxxxxx
| 00100000 <= (1<<5)
-----------
a: xx1xxxxx
a = a | (1<<5);
结论:
一个bit位与0进行”按位或“的操作,结果为原值
x|0 => x
一个bit位与1进行”按位或“的操作,结果为1
x|1 => 1
^ 按位异或:
a b a^b
0 0 0
1 0 1
0 1 1
1 1 0
"异或" :求异,不同为1,相同为0
例子:
int a = 2 ^ 32;
8bits:
0000 0010 (2)
0010 0000 (32)
^ ----------
0010 0010 (34)
思考;
有一个整型变量a,要是a的第五位bit保留,其他的全部取反
该如何操作?
a:
xxXxxxxx
11011111
^ ------------
a = a^(~(1<<5))
结论:
一个bit位与0进行”按位异或“的操作,结果为原值
x ^ 0 => x
一个bit位与1进行”按位异或“的操作,结果为原值取反
x ^ 1 => ~x
练习:
写一个程序,交换两个整数的值,不能使用临时变量
int a=6;
int b=5;
int temp;
temp = a;
a = b;
b = temp;
printf(a); //5
printf(b); // 6
----------------------------------
a = a^b;
b = a^b;
a = a^b;
结论:
位运算只与当前位,没有进位,没有有借位
<< 按位左移
a << n 把a按bit序列整体左移n位。
高位左移后,会多出来n个bit位,直接丢弃
低位空出来的n个bit位,直接补0
如果左移后,舍弃的高位都是0(连续的0)
那么左移n位,就表示在原有的基础上,乘以
2的n次方
例子:
8bits:
1 << 4
1: 0000 0001
1<<4: 0001 0000 (1*2^4)
32bits:
7 << 8
7: 00000000 00000000 00000000 00000111
7<<8:00000000 00000000 00000111 00000000(7*2^8)
>> 按位右移
x >> n 把x的bit序列整体往右移n个bits
低位右移后,会多出n位,直接舍弃
高位会空出n位,补什么?
对于有符号的数,高位全部补 符号位!!!!
对于无符号的数,高位直接补0
练习:分析一下代码的输出结果
int a = -1;
-1;
11111111 11111111 11111111 11111111
a = a >> 31;
a >> 31:
11111111 11111111 11111111 11111111
printf("%d\n",a);// -1
printf("%u\n",a);// 2^32 -1
unsigned int a = -1;
-1:
11111111 11111111 11111111 11111111
a = a>> 31;
a >> 31:
00000000 00000000 00000000 00000001
printf("%d\n",a);// 1
printf("%u\n",a);// 1
(5)赋值运算符
= : 双目运算符,结合性从右到左
a = x; 先计算x的值,然后再把x的值,赋值给a
赋值运算符要求左边的操作数 必须为一个”可写的地址“(左值)
例子:
5 = 5; //ERROR
2 + 3 =5;//ERROR
i++ = 6;//ERROR
赋值表达式:由赋值运算符连接起来的式子。
赋值表达式的值:
就是最后赋值给左边变量的那个值
a = b =6;
==>先计算(b = 6)表达式的值,将其表达式的值赋值给a
复合赋值运算符
赋值运算符和算术运算符,位运算符组成的复合的赋值运算符
如:
+= -= %= *= /=
<<= >>= |= &= ^=
例子:
a += 5
=> a = a+5
a += 5 +6
=> a = a+(5+6)
a >>= n
=> a =a>>n
(6)条件运算符
? : 三目运算符
表达式1 ? 表达式2 :表达式3
执行:
如果表达式1的值为真,则整个表达式的值为表达式2的值
如果表达式1的值为假,则整个表达式的值为表达式3的值
例子:
int a,b,c,d,m,n;
a =1;
b =2;
c =3;
d = 4;
m =0;
n= 0;
a>b?(m=a+b):(n=c+d);
printf("%d\n",m);//0
printf("%d\n",n);//7
(7)逗号运算符
双目运算符,优先级是最低,结合性从左到右
表示式1 ,表达式2
执行:
先求表达式1的值,然后再求表达式2的值
整个逗号表达式的值 就是 表达式2的值
例子:
int a=5,b=6;
a = (a = 6,a+b);
a => 12
(8)指针运算符
& ->取地址符
* ->指向运算符
&对象名:
表示的含义是 取某某对象的地址
例子:
int a;
scanf("%d",&a);
(9)sizeof求字节运算符
单目运算符,求一个对象或类型的所占空间的字节数
(10)分量运算符
求结构体中的成员变量(分量)
->
.
(11)下标运算符
[]
数组名 [下标]:表示下标对应的哪一个数组元素
(12)强制类型转换运算符
(类型)
小练习:
1.取整型变量x中的第p位开始的n个bit位
x:
xxxxXXXXxxxx
x >> p :
xxxxxxxxXXXX
000000001111 < = (1<<n)-1
& ------------
00000000XXXX
x=(x>>p)&((1<<n)-1)
2.将x中第p位开始的n个bit全部取反,其余各个位保持不变
x:
xxxxXXXXxxxx
000011110000 <= ((1<<n)-1) << p
^------------
xxxx~(XXXX)xxxx
x = x^((1<<n)-1) << p
3.将x中第p位开始的n个bit位设置为y中的最右边的n位的值,
x其余各个位保持不变
x:
xxxxXXXXxxxx
111100001111 <= ~(((1<<n)-1) << p)
&------------
xxxxooooxxxx
y:
yyyyyyyyYYYY
000000001111 <=(1<<n)-1
&------------
00000000YYYY << p
xxxxooooxxxx
|------------
xxxxYYYYxxxx
(x&~(((1<<n)-1) << p)) | ((y&(1<<n)-1) <<p)
4.下列表达式中,正确的C赋值表达式是?(C)
A,a=7+b+c=a+7 B,a=7+b++=a+7
C,a=(7+b,b++,a+7) D,a=7+b,c=a+7
5,以下程序语句运行结果为?(D)
int a;
printf("a=%d\n",a);
A,编译出错 B,1024 C,NULL D,不确定值
6,int b=0,x=1;执行语句if(x++)b=x+1;后,x,b的值依次为?(2,3)
7,sizeof(double)的结果是?(8)
8,设f是实型变量,下列表达式中不是逗号表达式的是?(D)
A, f=3.2,1.0 B, f>0,f<10 C, f=2.0,f>0 D, f=(3.2,1.0)
9,PC机中,'\n'在内存占用的字节数是?(1)
10,设c='w',a=1,b=2,d=-5,则表达式'x'+1>c,'y'!=c+2,-a-5*b<d+1,b==a=2的值分别为?
(1,0,1,编译错误)
11,判断变量a,b的值均不为0的逻辑表达式为?
(a!=0&&b!=0)
12,数学式a/(b*c)的c语言表达式是?
( double a/(b*c) )
13,以下程序运行后的输出结果是?(3)
#include
int main()
{
int a;
a=(int)((double)(3/2)+0.5+(int)1.99*2);
printf("%d\n",a);
}
14,在c语言中,如下程序输出的结果为?
char c=250;
unsigned char d;
char f;
d=c+249;
f=c+249;
printf("d=%d\n",d); //243
printf("d=%u\n",d); //243
printf("f=%d\n",f); //-13
printf("f=%u\n",f); //2的32次方-13
( if短的是无符号的数,高位就直接补0 if短的是有符号的数,高位补符号位)
相关文章:
嵌入式0基础开始学习 ⅠC语言(2)运算符与表达式
1.运算符 什么是运算符? 用来进来某种运算的符号 如: - * / (取余,取模) a,几目运算符 根据其操作数的不同 单目运算符 该运算符…...
汇编语言(一)
寄存器:cpu中可以储存数据的器件(AX,BX) 汇编语言的组成:1.汇编指令 2.伪指令 3.其他符号 存储器:cpu,传入指令和数据,加以运算。(内存) 指令和数据&#…...
2010-2022年各省新质生产力数据(含原始数据+测算代码+计算结果)
2010-2022年各省新质生产力数据(含原始数据测算代码计算结果) 1、时间:2010-2022年 2、范围:31省 3、指标:gdp(亿元)、在岗职工工资:元、第三产业就业比重、人均受教育平均年限、…...
需求分析部分图形工具
描述复杂的事物时,图形远比文字叙述优越得多,它形象直观容易理解。前面已经介绍了用于建立功能模型的数据流图、用于建立数据模型的实体-联系图和用于建立行为模型的状态图,本节再简要地介绍在需求分析阶段可能用到的另外3种图形工具。 1 层次方框图 层次方框图用树形结…...
ML307R OpenCPU GPIO使用
一、GPIO使用流程图 二、函数介绍 三、GPIO 点亮LED 四、代码下载地址 一、GPIO使用流程图 这个图是官网找到的,ML307R GPIO引脚电平默认为1.8V,需注意和外部电路的电平匹配,具体可参考《ML307R_硬件设计手册_OpenCPU版本适用.pdf》中的描…...
python基于深度学习的聊天机器人设计
python基于深度学习的聊天机器人设计 开发语言:Python 数据库:MySQL所用到的知识:Django框架工具:pycharm、Navicat、Maven 系统功能实现 登录注册功能 用户在没有登录自己的用户名之前只能浏览本网站的首页,想要使用其他功能都…...
Golang设计模式(四):观察者模式
观察者模式 什么是观察者 观察者模式(Observer Pattern):定义对象之间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式的别名包括发布-订阅(Publish/Subscribe…...
huggingface 笔记:查看GPU占用情况
0 准备部分 0.1 创建虚拟数据 import numpy as npfrom datasets import Datasetseq_len, dataset_size 512, 512 dummy_data {"input_ids": np.random.randint(100, 30000, (dataset_size, seq_len)),"labels": np.random.randint(0, 1, (dataset_size…...
JavaSE 学习记录
1. Java 内存 2. this VS super this和super是两个关键字,用于引用当前对象和其父类对象 this 关键字: this 关键字用于引用当前对象,即调用该关键字的方法所属的对象。 主要用途包括: 在类的实例方法中,通过 this …...
HTML与CSS的学习
什么是HTML,CSS? HTML(HyperText Markup Language):超文本标记语言。 超文本:超越了文本的限制,比普通文本更强大。除了文字信息,还可以定义图片、音频、视频等 标记语言:由标签构成的语言 >HTML标签都是预定义好的。例如:使用<a>…...
【单片机】STM32F070F6P6 开发指南(一)STM32建立HAL工程
文章目录 一、基础入门二、工程初步建立三、HSE 和 LSE 时钟源设置四、时钟系统(时钟树)配置五、GPIO 功能引脚配置六、配置 Debug 选项七、生成工程源码八、生成工程源码九、用户程序下载 一、基础入门 f0 pack下载: https://www.keil.arm…...
源码编译安装Rsync数据同步
源码编译安装 RPM软件包:rpm -ivh 或者 yum -y install 需要开发编译工具gcc、gcc-c、make等... 源码包----开发工具gcc与make----》可以执行的程序-----》运行安装 •主要优点 –获得软件的最新版,及时修复bug –软件功能可按需选择/定制ÿ…...
SQL Server2019安装步骤教程(图文)_最新教程
一、下载SQL Server2019 1.到微软官网下载SQL Server Developer版本,官网当前的2019版本下载需要注册账号。 不想注册的朋友,可以选择从网盘下载:点击此处直接下载 2.下载之后先解压,解压后执行exe安装程序。打开之后的界面如下…...
【SpringBoot】SpringBoot中防止接口重复提交(单机环境和分布式环境)
📝个人主页:哈__ 期待您的关注 目录 🌼前言 🔒单机环境下防止接口重复提交 📕导入依赖 📂项目结构 🚀创建自定义注解 ✈创建AOP切面 🚗创建Conotroller 💻分布…...
零基础学Java(全170集)
课程概述 本课程旨在全面深化对 Java 语言的核心技术理解,并提升编程实践能力。课程内容涵盖以下关键领域: 掌握Java核心语法,为后续学习打下扎实的基础。熟练运用Java常用的类库与开发工具,提高开发效率与质量。解决面向对象编…...
摄像头应用测试
作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生在读,研究方向无线联邦学习 擅长领域:驱动开发,嵌入式软件开发,BSP开发 作者主页:一个平凡而乐于分享的小比特的个人主页…...
Golang框架HTTP客户端框架zdpgo_resty发送表单请求
核心代码 这里通过字典传递了一个简单的表单数据。 发送的是POST请求。 resp, err : client.R().SetFormData(map[string]string{"username": "jeeva","password": "mypass",}).Post("http://127.0.0.1:3333/login")fmt.P…...
【机器学习300问】99、多通道卷积神经网络在卷积操作时有哪些注意事项?
一、多通道卷积神经网络示例 还是以图像处理为例,如果你的目标不仅是分析灰度图像特性,还打算捕捉RGB彩色图像的特征。如下图,当面对一张66像素的彩色图像时,提及的“3”实际上是指红、绿、蓝三种颜色通道,形象地说&am…...
Rust之函数、单元测试
1、函数 类似于C函数。 1.1、普通函数 在Rust中,函数的定义使用fn关键字,后跟函数名、参数列表、返回类型和函数体。函数体由一系列语句组成,用于执行特定的操作和计算。 函数定义: 使用fn关键字定义函数,函数由函数…...
Linux环境下TensorFlow安装教程
TensorFlow是学习深度学习时常用的Python神经网络框 下面以Mask R-CNN 的环境配置为例: 首先进入官网:www.tensorflow.org TensorFlow安装的总界面: 新建anaconda虚拟环境: conda create -n envtf2 python3.8 (Pyth…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...
宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...
