【c语言初阶】操作符全面知识总结

news2024/11/18 3:24:15

操作符详解

  • 操作符种类
    • 算术操作符
    • 移位操作符
    • 位操作符
    • 编程题:两数交换多种解法
    • 编程题:求一个数在内存中二进制数1的个数
    • 赋值操作符
    • 单目操作符
    • 关系操作符
    • 编程题:谁是凶手
    • 逻辑操作符
    • 一道笔试题
    • 条件操作符
    • 逗号表达式
    • 下标引用、函数调用和结构体成员访问操作符
  • 操作符的属性
    • 操作符优先级、结合顺序、是否控制求值顺序
  • 表达式求值
    • 隐式类型转换(整形提升)
    • 算术转换

铁汁们,今天给大家分享一篇操作符全面知识总结,来吧,开造⛳️

操作符种类

算术操作符

+(加)、-(减)、*(乘)、/(除)、%(求余)

注意点
1.%操作符中的操作数必须都为整数,返回的是除法中余数的部分。

2./:分为整数除法和小数除法
整数除法:操作数都为整数,返回的是除法中的部分,结果值为整数
小数除法:操作数至少有一个为浮点数,返回的是除法运算的具体值,结果值为小数

3.其他操作符的两个操作数既可以是整数,也可以是小数。

4.%几范围:0~几-1
在这里插入图片描述

实际应用%与 / 相互搭配可以得到一个数的每一位(一个几进制数%几就可得到该数的最低位)。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int n = 1234;
	while (n)
	{
		printf("%d ", n % 10);
		n /= 10;
	}
	return 0;
}

在这里插入图片描述

移位操作符

<<(左移操作符)、>>(右移操作符)

1.左移操作符<<:
移位规则:左边丢弃,右边补0。

2.右移操作符>>:移位规则:
逻辑右移,左边用0补充,右边直接丢弃;
算术右移:左边用该值的原符号位填充,右边直接丢弃。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int i = -2;
	printf("%d\n", i >>2 );
	printf("%d\n", i);
	return 0;
}

在这里插入图片描述
C语言没有明确规定到底是算术右移还是逻辑右移,一般编译器下采用的是算术右移。(此处博主是使用VS2019编译器,右移时为算术右移)

注意点

1.操作数只能是整数

2.移动的是二进制数(移动的是补码)。

3.不会改变操作数的值,改变的是含操作符的表达式值,eg:见上图。

4.一般来说,左移相当于乘2的实际效果,右移相当于除2的实际效果。

5.对移位运算符,不能移动负数位,这个是标准未定义的(语言标准支持,取决于编译器)。

实际应用让二进制中的某一位来到自己所想到达的那一位上,在一定的范围内。最多只能移动31位移位操作符只可以操作数值位,不能操作符号位,若移动32位,则数值位全部被清空了,只剩下符号位了,则运算无意义)。

位操作符

&(按位与)、|(按位或)、^(按位异或)

&:两操作数同为1才为1,有一个0则为0,全0则为0。

|:两操作数有一个1则为1,全1则为1,全0才为0

^:两操作数对应位数字相同则为0,相异则为1

注意点

1.操作数必须为整数

2.操作的对象为二进制数(操作的是补码)。

按位异或的两个重要结论:
a.按位异或符合交换律
b.一个数与它本身按位异或结果为0,一个数与0按位异或结果为它本身;

在这里插入图片描述

编程题:两数交换多种解法

方法一:创建临时变量(效率高)

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	printf("交换前a=%d ,b=%d\n", a, b);
	int tmp = a;
	a = b;
	b = tmp;
	printf("交换后a=%d ,b=%d\n", a, b);
	return 0;
}

方法二:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	printf("交换前a=%d ,b=%d\n", a, b);
	a = a + b;
	b = a - b;
	a = a - b;
	printf("交换后a=%d ,b=%d\n", a, b);
	return 0;
}

缺点:此处会造成数据溢出现象,当a和b的值均很大但都未超过整形最大范围数,a+b的值可能超过32位,数据溢出,发生截断现象,使得结果错误。

截断:在C语言中,截断是从高位开始截断,当将一个整型数截断为较小的整型数时,将从高位开始截取,即只保留低位部分,高位部分会被丢弃。例如,将一个32位整型数截断为16位整型数,只会保留低16位,并丢弃高16位。

方法三:利用按位异或的两个重要结论

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	printf("交换前a=%d ,b=%d\n", a, b);
	a = a ^ b;  
	b = a ^ b;  //等价于a^b^b=a
	a = a ^ b;  //等价于a^b^a=b
	printf("交换后a=%d ,b=%d\n", a, b);
	return 0;
}

在这里插入图片描述

编程题:求一个数在内存中二进制数1的个数

方法一:根据%10、/10相互搭配使用,可以得到十进制数的每一位,从而%2、/2相互搭配使用就可以得到二进制的每一位

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int a = 0;
	int count = 0;
	scanf("%d", &a);
	while (a)
	{
		if (a % 2 == 1)
		{
			count++;
		}
		a /= 2;
	}
	printf("count=%d", count);
	return 0;
}

在这里插入图片描述
在这里插入图片描述
缺点:仅适用于求正数中二进制数1的个数,不适用于负数。

方法二:一个整数&1可以获得该整数的二进制序列最低位
思路:先获得二进制序列的每一位、在判断该位是否为1、为1计数器加1

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int a = 0;
	int count = 0;
	scanf("%d", &a);
	int i = 0;
	for (i = 0; i < 32; i++)
	{
		if ((a >> i) & 1== 1)  //获取二进制数序列的每一位
		{
			count++;
		}
	}
	printf("count=%d", count);
	return 0;
}

在这里插入图片描述
不足:此处需要循环32次,效率低

方法3:最优解a&(a-1)

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int a = 0;
	int count = 0;
	scanf("%d", &a);
	while (a)
	{
		a = a & (a - 1);   //每进行一次此操作,二进制数序列最右边的1会丢掉,变为0
		count++;
	}
	printf("count=%d", count);
	return 0;
}

在这里插入图片描述

赋值操作符

赋值操作符: =

意义:可以让你改掉之前不满意的初值,重新给其赋值。、

一般赋值操作符可以连续使用,但在变量初始化时,不可以连续使用。
在这里插入图片描述
错误结果:
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int a = 10;
	int b = 20;
	int c = 30;
	a = b = c = 10;
	printf("a=%d b=%d c=%d", a, b, c);
	return 0;
}

在这里插入图片描述

复合赋值符:+=、-=、*=、/=、%=、<<=、>>=、&=、|=、^=

意义:可以达到复合的效果。eg:a+=b; 等价于a=a+b。

单目操作符

在这里插入图片描述
注意:sizeof 与strlen的区别:

1.sizeof是操作符、strlen是库函数。

2.sizeof计算的是类型或者变量所占内存空间的大小,单位是字节,适用于任何类型,不关注具体存放在内存中的数据内容。

3.strlen是求字符串长度,只能针对于字符串,计算是 在 '\0’之前字符的个数,关注具体存放在内存中的数据内容。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void test1(int arr[])  //首元素的地址
{
	printf("%d\n", sizeof(arr));     //(4) 此处arr为首元素的地址
}
void test2(char ch[])  //首元素的地址
{
	printf("%d\n", sizeof(ch));    //(5) 此处ch为首元素的地址
}
int main()
{
	int arr[10] = { 0 };
	char ch[10] = { 0 };
	printf("%d\n", sizeof(arr));         //(1) 此处arr为整个数组
	printf("%d\n", sizeof(ch));         //(2) 此处ch为整个数组
	printf("%d\n", sizeof(int [10]));  //(3) 此处int [10]为数组的类型
	test1(arr); 
	test2(ch);
	return 0;
}

在这里插入图片描述

关系操作符

<、>、==(等于)、<=(小于等于)、>=(大于等于)、!=(不相等)

只能适用于适合的类型,对于字符串、结构体类型比较大小不适用

关系操作符"逻辑"意义,满足比较关系,则值为1,否则值为假,常用if进行搭配使用。

编程题:谁是凶手

在这里插入图片描述
思路:if与关系操作符相互搭配使用,不符合比较关系,值为0,符合关系比较,值为1

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	char killer = 0;
	for (killer = 'A'; killer <= 'D'; killer++)
	{
		if ((killer != 'A ') + (killer == 'C') + (killer == 'D') +( killer != 'D') == 3)
		{
			printf("killer=%c", killer);
			break;
		}
	}
	return 0;
}

逻辑操作符

&&(逻辑与)、||(逻辑或)

两者均为双目操作符,操作数为两个

&& 逻辑与(若两操作数均为真,则结果才为真、若有一个操作数为假,则结果为假);
|| 逻辑或(若两操作数有一个为真,则结果就为真、若两操作数都为假,则结果才为假)。

逻辑操作符均会出现”短路“现象:
对于&&,若左边表达式结果为假,则右边表达值无需计算,直接最终结果为0,否则从左到右依次进行计算,直到遇到表达式为假时才停止。
对于||,若左边表达式为真,则右边表达式无须计算,直接最终结果为1,否则从左到右依次计算,直到遇到表达式为真时才停止。

一道笔试题

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int i = 0, a = 0, b = 2, c = 3, d = 4,j=0,e=0,f=2,g=3,h=4;
	i = a++ && ++b && d++;
	j = e++||++f||h++;
	printf("a = %d  b = %d  c = %d  d = %d\n", a, b, c, d);
	printf("e = %d  f = %d  g = %d  h = %d\n", e, f, g, h);
	return 0;
}

在这里插入图片描述

条件操作符

exp1?exp2:exp3

条件操作符,也称为三目操作符,有三个操作数

执行流程:根据表达示1的真假,来判断执行表达式2还是3:若表达式1结果为真,则只执行表达2,表达式3不执行、若表达式1结果为假,则只执行表达式3,表达示2不执行。

最终结果值的判断:执行表达式几,表达式几的结果就是最终结果的值。

其作用当与if else语句。求最大值

逗号表达式

exp1,exp2,exp3…expn

逗号表达式,中间用多个逗号将多个表达式分割开来
逗号表达式,从左到右依次进行计算,整个表达式的结构为最后一个表达式的结果

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int a = 1, b = 0, c = 0;
	c = (a > b, a = a + b, a++, b = a++);
	printf("c=%d\n", c);
	return 0;
}

在这里插入图片描述

#include<stdio.h>
int main()
{
    a = get_val();
    count_val(a);
    while (a > 0)
   {

     a = get_val();
     count_val(a);
   }
   return 0;
}

改写成逗号表达式,避免了数据冗余

#include<stdio.h>
int main()
{
   while(a = get_val(),count_val(a),a>0)  //逗号表达式,从左到右,依次进行计算
   {
       ;
   }
   return 0;
}

下标引用、函数调用和结构体成员访问操作符

[ ](下标引用操作符)

常用于数组和指针中,操作数有两个,一个为数组名、另一个下标值,[ ]通过操作数来访问下标所对应的元素值。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int arr[4][3] = { { 1,2,3 }, { 4, 5, 6 }, { 7, 8, 9 }, { 10,11,12 } };
	int i = 0;
	for (i = 0; i < 4; i++)
	{
		int j = 0;
		for (j = 0; j < 3; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

在这里插入图片描述
注意点
下标值只能从0开始,下标值的范围为0到数组大小-1;
指针变量[整数]==*(指针变量+/-整数)

()(函数调用操作符)

常用于函数调用中,操作数有一个或多个,函数名、函数参数(但有些函数参数为无参void)。

->和 .( 结构体成员变量访问操作符)

结构体指针变量->结构体成员变量名
结构体变量.结构体成员变量名

结构体指针用来存储结构体变量的地址,通过该操作符,对变量中的成员进行访问,可以拿到那个变量中成员变量的值。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
struct Stu
{
	char name[10];
	int age;
	char sex[5];
	double score;
};

void set_age1(struct Stu stu) 
{
	stu.age = 16;
}

void set_age2(struct Stu* pStu)
{
    pStu->age = 18;//结构成员访问
}

int main()
{
	struct Stu stu;
	struct Stu* pStu = &stu;//结构成员访问
    stu.age = 20;//结构成员访问
	set_age1(stu);  //传值调用
	set_age2(pStu);  //传址调用
	printf("%d %d", stu.age, pStu->age);
	return 0;
}

在这里插入图片描述

操作符的属性

操作符优先级、结合顺序、是否控制求值顺序

如下图:
在这里插入图片描述

表达式求值

复杂表达式求顺序有三个影响因素:1.操作符的优先级、2.操作符的结合顺序、3.操作符是否控制求值顺序

两个相邻的操作符执行先后顺序:首先看优先级、如果优先级相同时,其次再看结合性。

一些问题表达式:表达式求值时不能通过操作符的3个属性确定唯一计算路径

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int fun()
{
	static int count = 1;
	return ++count;
}
int main()
{
	int answer;
	answer = fun() - fun() * fun();
	printf("%d\n", answer);
	return 0;
}

此处只能通过操作符优先级确定乘法比减法先计算,但无法确定乘法两边的函数谁先调用,函数调用顺序不同,则计算的结果也不同
在这里插入图片描述

隐式类型转换(整形提升)

整形提升的概念:在c语言中,整形算术运算总是以默认的整形类型的精度进行计算,为了获得这个精度,对于表达式中的字符和短整型操作数在进行整形运算时,就被转化为普通整形int类型。

整形提升的意义:在计算机中,表达式的运算都是在cpu中相关运算器中执行计算,cpu中整形运算器的操作数规定为int字节长度,同时该长度也是cpu通用寄存器的长度,对于两个char或者short类型进行整形相关运算时,都需要先转化为cpu内整形运算器标准长度,才能被送进cpu内被执行运算。

整形提升发生条件:对于字节数小于int类型的char、unsigned char、short、unsigned short适用。

注意一个数发生整形提升时:
a.首先看其自己的类型,若为char、short型,为有符号位,整形提升时看最高位,提升的是符号位.
b.其次看在打印时,看是以什么格式进行打印%d是打印有符号位十进制整数(将该数看成有符号数,补码转化为原码在进行打印),%u是打印无符号十进制整数(将该数看成整数,直接转化为十进制进行打印)。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	char c1 = 5;
	char c2 = 124;
	char c3 = c1 + c2;
	printf("%d\n", c3);
	return 0;
}

解析如下图:
在这里插入图片描述

在这里插入图片描述

算术转换

对于大于等于Int类型数据,若某个操作符的两操作数的类型不一致,除非发生一个类型转化为另一个类型,否则就无法进行该操作。

寻常算术转换图:
在这里插入图片描述
强制类型转换:
对于浮点数转化为整形时,无需四舍五入,直接取整数部分。eg:floae a=3.5,int b=(int)a=3。

铁铁们,操作符全面知识总结就到此结束啦,若博主有不好的地方,请指正,欢迎铁铁们留言,请动动你们的手给作者点个👍鼓励吧,你们的鼓励就是我的动力✨

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

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

相关文章

响应式编程理论篇:源码浅析WebClient

1 缘起 WebFlux系统中&#xff0c;如何请求第三方或其他内部兄弟系统提供的接口&#xff1f; 当然&#xff0c;可以直接使用OKhttp/Apache HttpClient/SpringMVC RestTemplate&#xff0c; 在WebFlux中同样提供了请求接口的工具&#xff1a;WebClient&#xff0c; 本篇文章主要…

03单链表及代码实现

链表介绍&#xff08;Linked List&#xff09; 链表是有序列表&#xff0c;存储方式如下图&#xff08;物理结构图&#xff09; 链表小结 链表是以结点的方式来存储的。链式存储。每个结点包含data域、next域&#xff08;指向下一个结点&#xff09;。要注意的是&#xff0…

阿里云服务器适用于哪些业务场景?有哪些行业的客户在使用?

阿里云服务器适用于哪些业务场景&#xff1f;有哪些行业的客户在使用&#xff1f;    阿里云服务器的主要业务场景   阿里云服务器能够满足各种业务场景的需求&#xff0c;具有高性能、易扩展、安全可靠等特点。下面我们将详细介绍阿里云服务器适用于哪些业务场景。 Web应用…

JUC并发编程初学

什么是JUC进程和线程回顾Lock锁生产者和消费者8锁的线程集合类不安全CallableCountDownLatch、CyclicBarrier、Semaphore读写锁阻塞队列线程池四大函数式接口Stream流式计算分支合并异步回调JMMvolatile深入单例模式深入理解CAS原子引用可重入锁、公平锁非公平锁、自旋锁、死锁…

阿里云服务器的扩展性如何?是否支持弹性扩容和自动负载均衡?

阿里云服务器的扩展性如何&#xff1f;是否支持弹性扩容和自动负载均衡&#xff1f;   阿里云服务器的扩展性特点   阿里云服务器&#xff08;ECS&#xff09;在扩展性方面具有优势&#xff0c;能够满足用户不断变化的业务需求。以下我们将详细介绍阿里云服务器的扩展性特点…

离散数学题目收集整理练习(期末过关进度50%)

✨博主&#xff1a;命运之光 &#x1f984;专栏&#xff1a;离散数学考前复习&#xff08;知识点题&#xff09; &#x1f353;专栏&#xff1a;概率论期末速成&#xff08;一套卷&#xff09; &#x1f433;专栏&#xff1a;数字电路考前复习 ✨博主的其他文章&#xff1a;点击…

Spring Security--连接数据库

书接上一篇&#xff0c;在实际的开发中&#xff0c;我们的账号密码不可能是这样写在配置文件中的&#xff0c;应该是要来自于数据库。 接着上一篇的项目&#xff0c;我们继续&#xff0c;在原有的依赖的基础上新增&#xff0c;mysql驱动依赖和mybatis依赖 <dependencies>…

拼多多和华为5年,分享一下我的划水经验....

先简单交代一下背景吧&#xff0c;某不知名 985 的本硕&#xff0c;17 年毕业加入华为&#xff0c;之后跳槽到了滴滴&#xff0c;一直从事软件测试的工作。之前没有实习经历&#xff0c;算是5年的工作经验吧。 这5年之间完成了一次晋升&#xff0c;换了一家公司&#xff0c;有…

650V IGBT 模块(FAM65V05DF1)NTMFD5C470NLT1G和NTMTS0D7N04CTXG(40V)表面贴装 MOSFET

FAM65V05DF1智能电源模块&#xff08;IPM&#xff09;是高度集成的固态电源开关&#xff0c;在单个模块中集成了基于IGBT或MOSFET的栅极驱动电路。IPM还包括电源系统免受短路、欠压和极端温度等问题的保护。 该IPM具有高集成度、小封装和出色的冷却性能&#xff0c;有助于设计…

基于Java在线云音乐系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

大学英语六级考试2022年9月真题|第一 二 三 套|9:20

【作文1】It is now widely accepted that mutual trust and openness is the key to promoting cooperation. 【作文2】Today more and more people begin to realize the pleasures and joys of real-world social interaction. 【作文3】Nowadays students are becoming …

红外测距传感芯片WH4530A

红外线又称红外光&#xff0c;它具有反射、折射、散射、干涉、吸收等性质。任何物质&#xff0c;只要它本身具有一定的温度&#xff08;高于绝对零度&#xff09;&#xff0c;都能辐射红外线。红外线传感器测量时不与被测物体直接接触&#xff0c;因而不存在摩擦&#xff0c;并…

踏上极速向未来之旅!——2023年量化科技嘉年华·专场回顾

2023年6月2日—3日&#xff0c;“2023量化科技嘉年华”在上海世博中心召开&#xff0c;这场为期两天的量化科技盛会&#xff0c;多方位呈现了量化科技创新成果&#xff0c;吸引了众多关注。 在嘉年华的第二天&#xff0c;多场主题论坛同步进行。 由华锐技术主办的“极速向未来…

编程(42)----------锁策略

简单总结一下自身对于锁策略的理解. 首先锁策略并非只针对某一种编程语言, 不同的编辑语言都可以使用同一套锁策略. 常见的锁策略有: 乐观锁和悲观锁 乐观锁, 即认为锁的竞争并非非常激烈. 悲观锁反之. 换句话说, 假设期末来临. 乐观态度的学生认为复习的很好, 问题不大. 而…

Navicat 连接 MySQL :2002 - Can‘t connect to server on ‘127.0.0.1‘ (36)

问题&#xff1a; 2002 - Can‘t connect to server on ‘127.0.0.1‘ (36) 场景 Navicat 16MySQL 5.7Windows虚拟机Mac主机 导言&#xff1a; Navicat 是一款功能强大的数据库管理工具&#xff0c;但在使用过程中可能会遇到连接 MySQL 数据库时出现 “Can’t connect to se…

微服务开发系列 第十篇:Gateway

总概 A、技术栈 开发语言&#xff1a;Java 1.8数据库&#xff1a;MySQL、Redis、MongoDB、Elasticsearch微服务框架&#xff1a;Spring Cloud Alibaba微服务网关&#xff1a;Spring Cloud Gateway服务注册和配置中心&#xff1a;Nacos分布式事务&#xff1a;Seata链路追踪框架…

2023年餐饮连锁行业研究报告

第一章 行业概况 餐饮连锁行业是全球经济的重要组成部分&#xff0c;它的主要运营模式是通过连锁经营形式提供食品和饮料服务。 连锁经营主要分为三种运营模式&#xff1a;直营连锁、特许经营和自由连锁经营。三种模式通过专业分工、集中管理实现规模效益。 直营连锁&#x…

华为又开始放大招了?CV新架构:VanillaNet: the Power of Minimalism in Deep Learning 论文阅读笔记

华为又开始放大招了&#xff1f;CV新架构&#xff1a;VanillaNet: the Power of Minimalism in Deep Learning 论文阅读笔记 一、Abstract二、引言三、单个 Vanilla 的神经结构四、训练 VanillaNet4.1 深度训练策略4.2 Series Informed Activation Function 五、实验5.1 消融实…

SSD202D-logo显示调试

参考网址:cBOOT LOGO以及显示参数使用参考 - SigmaStarDocsSigmaStar Developer Documentationhttp://wx.comake.online/doc/doc/TAKOYAKI_ZH/customer/development/software/BOOTLOGO.html1.mipii点亮过程中需要加点复位 2.编译生成新屏参 3.修改屏参选择名字 4.

Cortex-M3 的 双堆栈MSP和PSP

什么是栈&#xff1f; 在谈M3堆栈之前我们先回忆一下数据结构中的栈。栈是一种先进后出的数据结构(类似于枪支的弹夹&#xff0c;先放入的子弹最后打出&#xff0c;后放入的子弹先打出)。M3内核的堆栈也不例外&#xff0c;也是先进后出的。栈的作用&#xff1f; …