常用关键字及运算符操作
【重点】
- 掌握C语言的常用关键字及其应用场景,使用技巧
- 掌握位运算的典型操作
- 掌握常用的逻辑操作
【难点】
- when to do? how to do? why to do?
- 熟悉常用运算符的典型操作,总结什么时候使用什么运算符
学习视频:
【嵌入式C语言】 https://www.bilibili.com/video/BV1RW411G7cr/?p=9&share_source=copy_web&vd_source=8af85e60c2df9af1f0fd23935753a933
关键字
关键字:编译器 预先定义了一定意义的 字符串
int a;
C语言一共有32个关键字
杂项
sizeof
sizeof是关键字(不是函数调用):编译器给我们查看内存空间容量的一个标准
#include <stdio.h>
int main(void)
{
int a;
printf("sizeof(int) = %d\n", sizeof a);
return 0;
}
return
return是返回的概念
数据类型
- C 操作对象 :资源/内存(内存类型的资源,LCD缓存、LED灯)
- C语言如何描述这些资源的属性呢?
- 资源属性【大小】
- 限制内存(土地)的大小,关键字
数据类型大小由编译器决定!
char
-
硬件芯片操作的最小单位:1 bit
1 bit 1/0 -
软件操作的最小单位:8bit = 1Byte
char a; bit a;
比如说网速10M,10Mbit/s / 8 = 1.25MB/s
应用场景:硬件处理的最小单位,单片机处理的最小单位
char buf[x];
int buf[x];
这样定义的两个数组,int类型会多接收,char类型才是接收硬件空间在软件体现的最小单位!
ASCII码表,用8bit来描述,2^8 = 256,能表示256个状态!
char a = 300; 这样就溢出了
int
int
类型的大小在不同系统中可能有所不同,通常占用 4 个字节(32 位系统)或 8 个字节(64 位系统)。在大多数情况下,我们会以 32 位系统为例。
- 32 位系统中,int
类型占用 4 个字节,即 32 个二进制位。
例如,二进制表示中的一个 int
变量可能是:00101011011100100011010101111001
。
- int大小根据编译器来决定!
编译器有最优的处理大小,系统一个周期能接受的最大处理单位,int
32位的单片机 - 32bit - 4B - int
16位的单片机 - 16bit - 2B - int
char
类型占用1个字节,即8个二进制位。char
主要用于存储字符数据,通常使用ASCII编码,所以一个字节足够存储一个字符。
例如,二进制表示中的一个 char
变量可能是:01001001
。
需要注意的是,实际系统中可能有对齐等因素影响,导致实际占用的位数略多于上述的 8 倍或 4 倍。但通常情况下,我们使用的二进制表示方式是以字节为单位的。
进制表示
十进制(D) 八进制(O) 十六进制(H) 二进制(B)
12(十进制)
001 010(二进制)
8(十进制)
int a = 010 //8
int a = 0x10 //16
方法结果
二进制转十进制(按权展开法)
二进制转八进制(421 法)
二进制转十六进制(8421 法)
移位操作,左移几位就是乘以 2 的 n 次方
右移操作就是除以 2 的 n 次方,但是结果有小数时会被舍弃
以上都是有符号移位
long、short
特殊长度限制符
以上 char int long short 都为整形
unsigned,signed
unsigned、signed
无符号:数据
有符号:数字
内存空间的最高字节 是符号位 还是数据
unsigned int a.
char a,
char a = -1: 0xff (如果是有符号的负数,那么最高位一般都是符号位,永远都是 1,右移不会变成 0)
a>>1
unsigend char b= -1(如果是无符号的负数,那么最高位一般是数据,那么它右移就会变成 0,所以一般编程都会用无符号)
b>>1
float、double
数据的存储形式和整形的不相同
大小:
- float 4B
- double 8B
float 与 double 都为浮点型
void
void 一般不能用于计算等,一般用于占位,函数
void a++; 这样是错误的
void是一种语义,最常见的是函数返回值或者函数形参
自定义数据类型
C编译器默认定义的内存分配方式不符合实际资源的形式
自定义 = 基本元素的集合
struct
struct是元素之间的和
struct myabc{
unsigned int a;
unsigned int b;
unsigned int c;
unsigned int d;
};
struct myabc abc;
自定义的数据类型,一块连续的内存,四个四字节的空间
结构体的变量定义的顺序是有要求的
结构体的元素之间是递增的关系,每一个变量的起始地址都是上一个元素的尾地址。
用图来表示,每一个变量就是一个小方块~
union
共用体就是共用起始地址,申请的内存,变量之间是重叠的关系,是技巧型的代码~
union myabc{
unsigned int a;
unsigned int b;
};
union myabc abc;
enum
enum 是被命名整形常数的集合
enum
在什么场景下使用?
enumerate
一一列举
用标签来描述常数,相当于程序里面的标志位
#define MON 1
#define TUE 2
#define WED 3
用enum来写,就相当于打包这些标签
enum week{
Monday=0, Tuesday=1, Wednesday=2,
Thursday,Friday,
Saturday,Sunday
};
编程实例:
#include <stdio.h>
enum week
{
Monday = 1,
Tuesday = 2,
Wednesday = 3,
Thursday,
Friday,
Saturday,
Sunday
} day; // day是变量名称
int main(void)
{
printf("sizeof(enum) is %lu\n", sizeof(day)); // 4
printf("%d\n", Monday); // 1 定义从1开始
day = Wednesday; // 修改day的值
printf("%d\n", day); // 3
for (day = Monday; day <= Sunday; day++)
printf("日期:%d\n", day); // 1 2 3 4 5 6 7
return 0;
}
使用printf打印enum的大小,实际大小是4,4是32位2的,也就表示一位整形变量,按理说应该是7*4=28?
其实不是这样的,枚举变量就是一个整数,取里面定义的一个值而已,所以大小是4,有点像查表
枚举类型教程:https://www.runoob.com/cprogramming/c-enum.html
运用实例如下,enum是程序员与程序员之间沟通的方式,用名称标签代替数值!,不需要管数值是什么意思吗,调用标签即可实现功能~
typedef
typedef是数据类型的别名
定义两个变量
int a = 180; //长度
int b = 3600; //时间
如果改一下,改成如下写法,见名知意,len是长度,time是时间,一般后面加_t
,表示是typedef
#include <stdio.h>
typedef int len_t;
typedef int mytime_t;
len_t a = 180; // 长度
mytime_t b = 3600; // 时间
int main(void)
{
printf("%d\n", a); // 180
printf("%d\n", b); // 3600
return 0;
}
逻辑结构
C语言中的三种基本结构是顺序结构、选择结构和循环结构。
- if else 条件
- swhitch(整型变量) case break;多分支
- for循环(循环多少次),while循环(循环条件),do while循环(先循环一次)
- continue、break、goto
类型修饰符
【嵌入式C语言】 【精准空降到 00:39】 https://www.bilibili.com/video/BV1RW411G7cr/?p=17&share_source=copy_web&vd_source=8af85e60c2df9af1f0fd23935753a933&t=39
标签:char,int,enum,unsigned,嵌入式,运算符,关键字,C语言,day From: https://blog.csdn.net/weixin_63135906/article/details/144102160