于灵动的变量变幻间:函数与计算逻辑的浪漫交织(上)

在这里插入图片描述

大家好啊,我是小象٩(๑òωó๑)۶
我的博客:Xiao Xiangζั͡ޓއއ

很高兴见到大家,希望能够和大家一起交流学习,共同进步
在这里插入图片描述
这一节我们主要来学习函数的概念,了解库函数中的标准库、头文件,了解自定义函数的语法形式,了解形参和实参的区别,学习return语句,数组做函数参数,学习嵌套调用和链式访问…

文章目录

  • 一、函数的概念
    • 1.1 函数的概念
  • 二、库函数
    • 2.1 标准库和头文件
    • 2.2 库函数的使用方法
    • sqrt函数(举例)
      • 功能
      • 包含的头文件
      • 实践
      • 2.2.4 库函数文档的一般格式
  • 三、自定义函数
    • 3.1 自定义函数的语法形式
    • 3.2 函数的举例
  • 四、形参和实参
    • 4.1 实参
    • 4.1 形参
    • 4.3 实参和行参的联系
  • 五、return语句
  • 六、数组做函数参数
  • 七、嵌套调用和链式访问
    • 7.1 嵌套调用
    • 7.2 链式访问
    • 有趣的代码
  • 八、结尾

一、函数的概念

1.1 函数的概念

C语言中的函数和数学中的函数有一些区别,但本质上是差不多的,比如一次函数:y=kx+b,k和b都是常数,给一个任意的x,就能得到一个y值。
C语言中**函数(function)**的概念,有些翻译为:子程序,子程序这种翻译更加准确一些,C语言中的函数就是一个完成某项特定的任务的一段小代码。这段代码是有特殊的写法和调用方法的。

C语言的程序其实是由无数个小的函数组合而成的

也就是说:

一个大的计算任务可以分解为若干个较小的函数(对应较小的任务)完成。同时一个函数如果能够完成某项特定的任务的话,这个函数也可以是复用的。提高了开发软件的效率。

在C语言中我们一般会见到两种函数:

库函数 自定义函数

二、库函数

2.1 标准库和头文件

首先,我们要知道C语言本身并不提供库函数。
那库函数怎么来的呢?
C语言的国际标准 ANSIC 规定了一些常用的函数的标准,被称为标准库C标准库(C Standard Library) 是一组标准的函数,这些函数提供了基本的输入/输出、字符串处理、数学计算、内存管理等功能。标准库通常包含在编译器的库中,并自动链接到程序中。
所以,不同的编译器厂商可以根据ANSI提供的C语言标准自己开发了一系列函数来进行实现。这些函数就被称为库函数
我们前面内容中学到的 printf 、 scanf 都是库函数,库函数也是函数,唯一区别是这些函数已经是现成的,我们只要学会就能直接使用了。
有了库函数,一些常见的功能就不需要程序员自己实现了,一定程度提升了效率;同时库函数的质量和执行效率上都更有保证

各种编译器的标准库中提供了一系列的库函数,这些库函数根据功能的划分,都在不同的头文件中进行了声明。
库函数相关头文件:https://zh.cppreference.com/w/c/header

库函数的学习不用一次性全部学会,只需要逐步学习下去就可以了。

2.2 库函数的使用方法

库函数的学习和查看工具很多,比如:

C/C++官方的链接:https://zh.cppreference.com/w/c/header
cplusplus.com:https://legacy.cplusplus.com/reference/clibrary/

我们来举个例子:

sqrt函数(举例)

double sqrt (double x);
//sqrt 是函数名
//x 是函数的参数,表⽰调⽤sqrt函数需要传递⼀个double类型的值
//double 是返回值类型 - 表⽰函数计算的结果是double类型的值

功能

Compute square root 计算平方根
Returns the square root of x.(返回平方根)

包含的头文件

库函数是在标准库中对应的头文件中声明的,所以库函数的使用,务必包含对应的头文件,不包含是可能会出现⼀些问题的。
这里需要的头文件是 #include<math.h>

实践

#include<stdio.h>
#include<math.h>
int main()
{
	double d = 16.0;
	double r = sqrt(d);
	printf("%lf\n", r);
	return 0;
}

看看结果:
在这里插入图片描述
因为计算的结果是double类型,所以有小数点后6位

2.2.4 库函数文档的一般格式

  1. 函数原型
  2. 函数功能介绍
  3. 参数和返回类型说明
  4. 代码举例
  5. 代码输出
  6. 相关知识链接

三、自定义函数

了解完库函数,我们再来看自定义函数,自定义函数相对来说会更重要一些
C语言是一种功能强大且灵活的编程语言,允许用户定义自己的函数来封装特定的功能或代码块,从而提高代码的可读性、可维护性和重用性。

3.1 自定义函数的语法形式

其实自定义函数和库函数的形式是一样的:

ret_type fun_name(形式参数)
{
}

• ret_type 是函数返回类型
ret_type 是用来表示 函数计算结果的类型,有时候返回类型可以是 void ,表示什么都不返回
• fun_name 是
函数名

fun_name 是为了方便使用函数,函数名可以自己起,但函数名尽量要根据函数的功能起的有意义。
•括号中放的是形式参数
函数的参数就相当于,工厂中送进去的原材料,函数的参数也可以是 void ,明确表示函数没有参数。如果有参数,要交代清楚参数的类型和名字,以及参数个数。
• { }括起来的是函数体
{ }括起来的部分被称为函数体,函数体就是完成计算的过程,也就是想要进行加工的过程

我们可以通过图示来更好理解函数的意义:
在这里插入图片描述
我们可以把函数想象成一个工厂,我们把原材料输入工厂,然后工厂将原料加工成产品,函数也是一样,我们对函数输入一些数值,然后经过函数内的计算(加工),最终得到计算结果(产品)。

3.2 函数的举例

举个例子:
写一个加法函数,完成2个整型变量的加法操作。

//计算加法
#include<stdio.h>
int Add(int x,int y)//Add,函数Add需要接收2个整型类型的参数,函数计算的结果也是整型。
{
	int z = 0;
	z = x+y;
	return z;
}
int main()
{
	int a = 0;
	int b = 0;//输入
	scanf("%d %d", &a, &b);
	int r = Add(a, b);//调用加法函数,完成a和b的相加,这里add前面不用加类型
                      //求和的结果放在r中
	printf("%d\n", r);
	return 0;
}

当然,Add函数也可以简化为:

int Add(int x, int y)
{
	return x + y;
}

上面只是一个例子,未来我们是根据实际需要来设计函数,函数名、参数、返回类型都是可以灵活变化的。

四、形参和实参

在函数使用的过程中,把函数的参数分为,实参形参
再看看我们前面写的代码:

#include<stdio.h>
int Add(int x,int y)
{
	int z = 0;
	z = x+y;
	return z;
}
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	int r = Add(a, b);
	printf("%d\n", r);
	return 0;
}

4.1 实参

在C语言中,函数调用的过程中涉及两个关键概念:实参(actual parameters)形参(formal parameters,也称为参数变量)实参是在函数调用时传递给函数的具体值或变量,而形参是函数定义中声明的用于接收这些值的变量

在上面的代码中,我们在调用Add函数的时候,传递给函数的参数a和b就是实际参数,简称实参

4.1 形参

在上面代码中,第二行Add后面的x和y就被称作形式参数,简称形参
在C语言中,**函数参数(简称形参)是函数定义中声明的变量,用于接收调用函数时传递的实际参数(简称实参)的值。**形参在函数被调用时创建,并在函数执行结束时销毁。

为什么叫形式参数呢?实际上,如果只是定义了 Add 函数,而不去调用的话, Add 函数的参数 x和 y只是形式上存在的,不会向内存申请空间,不会真实存在的,所以叫形式参数。形式参数只有在函数被调用的过程中为了存放实参传递过来的值,才向内存申请空间,这个过程就是形参的实例化

扩展:

寄存器:CPU上集成的储存空间,比如上面我们举过一个add函数的例子,寄存器的作用就是把x+y的结果放进去,等到结果返回之后再把寄存器里面的结果放回到c里面去

4.3 实参和行参的联系

结论:当函数调用的时候,实参传递给形参的时候,形参将会创建自己的空间来存放实参的值,形参和实参不是同一块空间,对形参的修改,不会影响实参形参是实参的一份临时拷贝

五、return语句

在函数的设计中,函数中经常会出现return语句,这里讲⼀下return语句使用的注意事项。

• return后边可以是一个数值也可以是一个表达式,如果是表达式则先执行表达式,再返回表达式的结果

举个例子:

#include<stdio.h>
int add(int x, int y)
{
	int z = x + y;
	return z;
}
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a,&b);
	int c = add(a, b);
	printf("%d", c);
	return 0;
}

这里的如果我们把add函数修改一下:

int add(int x, int y)
{
	return x + y;
}

这样做的话因为return后面为表达式,所以这里会先执行表达式

•return后边也可以什么都没有,直接写 return; 这种写法适合函数返回类型是void的情况。

比如我们创建一个函数的目的是要让它去打印某些东西,那么我们就可以选择void的类型
举个例子:

#include<stdio.h>
void test()
{
	printf("xiaofeixiang");
}

int main()
{
	test();
	return 0;
}

•return返回的值和函数返回类型不一致,系统会自动将返回的值隐式转换为函数的返回类型

我们来看个例子:

//编译器会认为这个函数返回类型是int
#include<stdio.h>
test()
{
	printf("haha\n");
	int a = 0;
	scanf("%d", &a);
	printf("%d\n", a);
	printf("hello world");
	//最终实际返回的值是多少呢?这个不确定
}

int main()
{
	int r = test();
	printf("%d\n", r);
	return 0;
}

如果没有给函数写返回类型,那么返回类型是不确定的,所以编译器会默认返回类型为int,至于最终返回的值为多少是不确定的,比如上面代码运行后打印“hello world"时会在后面出现随机值,这就是返回值不确定的体现。
在这里插入图片描述

•return语句执行后,函数就彻底返回,后边的代码不再执行

//函数的返回类型是void,意思是这个函数不会返回任何值
void test()
{
	printf("hehe\n");
	int a = 0;
	scanf("%d", &a);
	if (a == -1)
		return;//return就是返回的意思
	printf("haha\n");
}

int main()
{
	test();
	return 0;
}

我们看这个例子,如果输入的值为-1的话,就会执行return语句,函数就会彻底返回,后面的代码不再执行,这里的**return发挥的是提前返回的作用**。

•如果函数中存在if等分支的语句,则要保证每种情况下都有return返回,否则会出现编译错误

六、数组做函数参数

使用函数解决问题时,我们总会遇见数组作为参数传给函数的情况,在函数内对数组进行操作。
我们来看个例子:
写一个函数将一个整型数组的内容,全部置为-1,再写一个函数打印数组的内容。
简单思考一下,基本的形式应该是这样的:

#include <stdio.h>
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	set_arr();//设置数组内容为-1
	print_arr();//打印数组内容
	return 0;
}

这里我们要注意,数组名代表整个数组
这里的set_arr函数要能够对数组内容进行设置,就得把数组作为参数传递给函数,同时函数内部在设置数组每个元素的时候,也得遍历数组,需要知道数组的元素个数。所以我们需要给set_arr传递2个参数,一个是数组,另外一个是数组的元素个数。仔细分析print_arr也是一样的,只有拿到了数组和元素个数,才能遍历打印数组的每个元素。

#include <stdio.h>
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	//数组名代表整个数组
	set_arr(arr, sz);//设置数组内容为-1
	print_arr(arr, sz);//打印数组内容
	return 0;
}

数组作为参数传递给了set_arr 和 print_arr 函数了,那这两个函数应该如何设计呢?
这里我们需要知道数组传参的几个重点知识:

• 函数的形式参数要和函数的实参个数匹配
• 函数的实参是数组形参也是可以写成数组形式
• 形参如果是一维数组,数组大小可以省略不写
• 形参如果是二维数组行可以省略,但是列不能省略
• 数组传参,形参是不会创建新的数组
形参操作的数组和实参的数组是同一个数组数组中形参和实参中的地址一样,所以对形参的修改也会对实参进行修改

根据上面的知识,我们可以实现这两个函数:
注意,

一般来说,形参中的数组元素个数可以省略掉(不过还是建议写上去好一些,因为有一些特殊情况不能省略掉,后面我们会学习怎么做一个扫雷程序的时候,会有这种情况出现,到时候再来介绍),也就是可以写成int arr[ ],中间数字可以省略

void set_arr(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		arr[1] = -1;

	}
	printf("\n");
}
//这个函数只需要完成设置就可以,不需要返回

void print_arr(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d",  arr[1]);
	}
	printf("\n");
}

数组传参时,本质上传递的是地址
最终,我们就可以写出这段代码:

//写一个函数将一个整形数组的内容全部置为-1,再写一个函数打印数组内容
#include<stdio.h>
void set_arr(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		arr[1] = -1;

	}
	printf("\n");
}
void print_arr(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d",  arr[1]);
	}
	printf("\n");
}
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	set_arr(arr,sz);
	print_arr(arr,sz);
	return 0;
}

七、嵌套调用和链式访问

7.1 嵌套调用

在C语言中,嵌套调用(Nested Function Call)指一个函数在其执行过程中调用另一个函数,而被调用的函数又可以调用其他函数,从而形成函数调用的嵌套关系。 这种嵌套关系可以是多层的,即一个函数可以调用另一个函数,后者又可以调用第三个函数,依此类推。
简单来说嵌套调用就是函数间的相互配合,就想一辆飞机的部件是由不同的厂家生产出来的,也正是各个部件厂家的相互配合,才能够组成一架飞机。
来看给例子:

假设我们计算某年某月有多少天?如果要函数实现,可以设计2个函数:

• is_leap_year():根据年份确定是否是闰年
• get_days_of_month():调用is_leap_year确定是否是闰年后,再根据月计算这个月的天数

#include<stdio.h>
int is_leap_year(int y)
{
	if ((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0))
		return 1;
	else
		return 0;
}
int get_days_of_month(int y, int m)
{
	int days[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
	int day = days[m];
	if ( is_leap_year(y) && m == 2)//判断闰年和二月
		day += 1;
	return day;
}
int main()
{
	int y = 0;
	int m = 0;
	scanf("%d %d", &y, &m);
	int d = get_days_of_month(y, m);
	printf("%d\n", d);
	return 0;
}

这⼀段代码,完成了一个独立的功能。代码中反应了不少的函数调用:

• main 函数调用 scanf 、 printf 、 get_days_of_month
• get_days_of_month 函数调用 is_leap_year

未来的稍微大一些代码都是函数之间的嵌套调用,但是函数是不能嵌套定义的。

7.2 链式访问

在C语言中,链式访问通常与链表(Linked List)数据结构相关。链表是一种常见的数据结构,它由一系列节点(Node)组成,每个节点包含数据部分和指向下一个节点的指针(Pointer)。链式访问是指通过节点的指针依次访问链表中的各个节点。
所谓链式访问就是
将一个函数的返回值作为另外一个函数的参数
像链条一样将函数串起来就是函数的链式访问
举个例子:

#include <stdio.h>
int main()
{
	int len = strlen("abcdef");//1.strlen求⼀个字符串的长度
	printf("%d\n", len);//2.打印⻓度 
	return 0;
}

前面的代码完成动作写了2条语句,把如果把strlen的返回值直接作为printf函数的参数呢?这样就是一个链式访问的例子了。

//链式访问
#include<stdio.h>
#include<string.h>

int main()
{
	printf("%d\n", strlen("abcdef"));
	return 0;
}

有趣的代码

//printf的返回值
#include<stdio.h>
int main()
{
	printf("%d", printf("%d", printf("%d", 43)));
	return 0;
}

这里因为printf函数包含在另一个printf函数中,属于链式访问,也就是printf会打印它所包含的那个printf函数的返回值
这个代码的关键是明白 printf 函数的返回是啥?

 int printf ( const char * format, ... );

printf函数返回的是打印在屏幕上的字符的个数

上面的例子中,我们就第一个printf打印的是第二个printf的返回值,第二个printf打印的是第三个printf的返回值。
第三个printf打印43,在屏幕上打印2个字符,再返回2
第二个printf打印2,在屏幕上打印1个字符,再放回1
第一个printf打印1
所以屏幕上最终打印:4321

看看结果:
在这里插入图片描述

八、结尾

这一课的内容就到这里了,下节课继续学习函数(下)的一些扩展
如果内容有什么问题的话欢迎指正,有什么问题也可以问我!

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【CSS】---- CSS 实现超过固定高度后出现展开折叠按钮

1. 实现效果 2. 实现方法 使用 JS 获取盒子的高度&#xff0c;来添加对应的按钮和样式&#xff1b;使用 CSS 的浮动效果&#xff0c;参考CSS 实现超过固定高度后出现展开折叠按钮&#xff1b;使用容器查询 – container 语法&#xff1b;使用 clamp 函数进行样式判断。 3. 优…

STM32F407接HX711称重传感器

在许多嵌入式项目中&#xff0c;如智能家居、物流管理等&#xff0c;都需要用到精确的重量测量功能。STM32F407作为一款高性能的微控制器&#xff0c;搭配HX711称重传感器&#xff0c;可以轻松实现这一需求。本文将详细介绍如何将STM32F407与HX711称重传感器进行连接和编程&…

大模型UI:Gradio全解11——Chatbot:融合大模型的聊天机器人(4)

大模型UI&#xff1a;Gradio全解11——Chatbot&#xff1a;融合大模型的聊天机器人&#xff08;4&#xff09; 前言本篇摘要11. Chatbot&#xff1a;融合大模型的多模态聊天机器人11.4 使用Blocks创建自定义聊天机器人11.4.1 简单聊天机器人演示11.4.2 流式传输Chatbot11.4.3 添…

卷积神经网络——食物分类

整体框架&#xff1a; 导入库 导入了各种必需的Python库&#xff0c;用于数据处理、图像读取、模型构建和训练。 设置随机种子 seed_everything: 用于设置所有随机数生成器的种子&#xff0c;确保每次运行时的结果都是相同的。 图像预处理&#xff08;transform&#xff09; 对…

Dify应用-工作流

目录 DIFY 工作流参考 DIFY 工作流 2025-1-15 老规矩感谢参考文章的作者,避免走弯路。 2025-1-15 方便容易上手 在dify的一个桌面上,添加多个节点来完成一个任务。 每个工作流必须有一个开始和结束节点。 节点之间用线连接即可。 每个节点可以有输入和输出 输出类型有,字符串,…

LLM实现视频切片合成 前沿知识调研

1.相关产品 产品链接腾讯智影https://zenvideo.qq.com/可灵https://klingai.kuaishou.com/即梦https://jimeng.jianying.com/ai-tool/home/Runwayhttps://aitools.dedao.cn/ai/runwayml-com/Descripthttps://www.descript.com/?utm_sourceai-bot.cn/Opus Cliphttps://www.opu…

ASP.NET Core - 依赖注入(四)

ASP.NET Core - 依赖注入&#xff08;四&#xff09; 4. ASP.NET Core默认服务5. 依赖注入配置变形 4. ASP.NET Core默认服务 之前讲了中间件&#xff0c;实际上一个中间件要正常进行工作&#xff0c;通常需要许多的服务配合进行&#xff0c;而中间件中的服务自然也是通过 Ioc…

刷刷题刷题刷题

springaop 和 aspect aop的区别 springaop 是动态代理增强 aspect aop 是静态代理&#xff0c;在编译阶段生成aop代理类。这个时候是编译时增强 aop通知执行顺序 AOP 、OOP是啥 aop是面向切面 oop是面向对象 ComponentScan 不设置 basepackage也能进行扫描 没有配置&…

【6】Word:海名公司文秘❗

目录 题目 List.docx Word.docx List.docx和Word.docx 题目 List.docx 选中1/4全角空格复制→选中全部文本→开始→替换&#xff1a;粘贴将1/4全角空格 替换成 空格选中全部文本→插入→表格→将文本转化成表格→勾选和布局→自动调整→勾选 选中第一列&#xff0c;单机右键…

【Linux】gawk编辑器二

一、变量 gawk编程语言支持两种变量&#xff1a;内建变量和自定义变量。 1、内建变量 gawk使用内建变量来引用一些特殊的功能。 字段和记录分隔符变量 数据字段变量 此变量允许使用美元符号&#xff08;$&#xff09;和字段在记录中的位置值来引用对应的字段。要引用记录…

Kafka客户端-“远程主机强迫关闭了一个现有的连接”故障排查及解决

Kafka客户端-“远程主机强迫关闭了一个现有的连接”故障排查及解决 1. 故障现象 Kafka客户端发送数据时&#xff0c;出现“远程主机强迫关闭了一个现有的连接”错误&#xff0c;导致数据发送失败。错误信息如下&#xff1a; 2. 故障排查 【1】. 查看服务网络状态 出现故障…

机器视觉5-全连接神经网络

机器视觉5-全连接神经网络1 图像表示多层感知器全连接神经网络一、两层全连接网络表达式二、三层全连接网络表达式三、关于非线性操作的说明四、全连接神经网络的映射原理 全连接神经网络的权值一、线性分类器二、两层全连接网络三、总结 全连接神经网络线性不可分全连接神经网…

Android BottomNavigationView不加icon使text垂直居中,完美解决。

这个问题网上千篇一律的设置iconsize为0&#xff0c;labale固定什么的&#xff0c;都没有效果。我的这个基本上所有人用都会有效果。 问题解决之前的效果&#xff1a;垂直方向&#xff0c;文本不居中&#xff0c;看着很难受 问题解决之后&#xff1a;舒服多了 其实很简单&…

1️⃣Java中的集合体系学习汇总(List/Map/Set 详解)

目录 01. Java中的集合体系 02. 单列集合体系​ 1. Collection系列集合的遍历方式 &#xff08;1&#xff09;迭代器遍历&#xff08;2&#xff09;增强for遍历​编辑&#xff08;3&#xff09;Lambda表达式遍历 03.List集合详解 04.Set集合详解 05.总结 Collection系列…

聚铭网络6款产品入选CCIA《网络安全专用产品指南》

近日&#xff0c;中国网络安全产业联盟CCIA正式发布《网络安全专用产品指南》&#xff08;第二版&#xff09;&#xff08;以下简称《指南》&#xff09;。聚铭网络凭借突出技术优势、创新能力以及市场积累&#xff0c;旗下安全产品成功入选防火墙、网络安全审计、日志分析、网…

nacos环境搭建以及SpringCloudAlibaba脚手架启动环境映射开发程序

1&#xff1a;下载nacos 地址&#xff1a;https://github.com/alibaba/nacos/tags 2:选择server的zip包下载 3:启动mysql服务&#xff0c;新建数据库&#xff1a;nacos_yh 4&#xff1a;解压下载的nacos_server 进入conf目录 5&#xff1a;mysql运行sql脚本变得到下面的表 6&a…

Mac安装配置使用nginx的一系列问题

brew安装nginx https://juejin.cn/post/6986190222241464350 使用brew安装nginx&#xff0c;如下命令所示&#xff1a; brew install nginx 如下图所示&#xff1a; 2.查看nginx的配置信息&#xff0c;如下命令&#xff1a; brew info nginxFrom:xxx 这样的&#xff0c;是n…

Linux系统离线部署MySQL详细教程(带每步骤图文教程)

1、登录官网下载对应的安装包 MySQL :: Developer Zone 2、将压缩包上传到服务器上&#xff0c;这里直接上传到/usr/local路径上 使用sftp工具上传到/usr/local目录上 3、解压压缩包 tar -xf mysql-8.0.39-linux-glibc2.17-x86_64.tar.xz 4、将mysql-8.0.39-linux-glibc2.17…

鸿蒙开发实战二 TypeScript和JavaScript的区别

简介 基于第一篇文章中提到的&#xff1a;https://mp.csdn.net/mp_blog/creation/editor/143515906 声明式开发范式&#xff1a;采用基于TypeScript声明式UI语法扩展而来的ArkTS语言&#xff0c;从组件、动画和状态管理三个维度提供UI绘制能力。 类Web开发范式&#xff1a;采…

初学stm32 --- CAN

目录 CAN介绍 CAN总线拓扑图 CAN总线特点 CAN应用场景 CAN物理层 CAN收发器芯片介绍 CAN协议层 数据帧介绍 CAN位时序介绍 数据同步过程 硬件同步 再同步 CAN总线仲裁 STM32 CAN控制器介绍 CAN控制器模式 CAN控制器模式 CAN控制器框图 发送处理 接收处理 接收过…