C 语言学习笔记(函数)
内容提要
- 函数
- 函数的概述
- 函数的分类
- 函数的定义
- 形参和实参
- 函数的返回值
函数
函数的概述
-
**函数:**实现一定功能的,独立的代码模块,对于函数的使用,一定是先定义,后使用。
-
使用函数的优势:
①我们可以通过函数提供功能给别人使用。当然我们也可以是使用别人提供的函数,减少代码量。
②借助函数可以减少重复性代码。
③实现结构化(模块化:C语言中的模块其实就是多文件+函数)程序设计思想。
关于结构化设计思想将大型的任务功能划分为相互独立的小型的任务模块来设计(多文件+函数)
-
函数是C语言程序的基本组成单元:
C语言程序必须包含一个main函数,可以包含零个或多个其他函数。
函数的分类
-
按来源分:
- **库函数:**C语言标准实现的并提供使用的函数,如:scanf()、printf()、fgets()、fputs()、strlen()…
- **自定义函数:**需要程序员自行实现,开发中大部分函数都是自定义函数。
-
按参数分:
- **无参函数:**函数调用时,无需传递参数,可有可无返回值,如:show_all();
- **有参函数:**函数调用时,需要参数传递数据,经常需要配套返回值来使用,如:printf(“%d\n”,12);
-
按返回值分:
- **有返回值函数:**函数执行后返回一个值,如:if(scanf(“%d”, &num) != 1)
- **无返回值函数(void):**函数字仅执行操作,不返回值
-
从函数调用的角度:
-
**主调函数:**主动去调用其他函数。(main函数只能作为主调函数)
-
**被调函数:**被其他函数调用的函数。
-
举例:
//主调函数 int main() {//被调函数printf("hello world!\n"); }
很多时候,尤其是对于自定义函数,一个函数可能既是主调函数,又是被调函数。
int fun_b() {printf("函数B\n"); } // 主调函数 int fun_a() {printf("函数A\n");// 被调函数fun_b(); }int main() {//被调函数fun_a(); }
以上案例中,fun_a()对于fun_b()来说是主调函数,同时对于main()函数来说,它又是被调函数。
-
函数的定义
定义
语法:
[返回类型] 函数名([形参列表]) --函数头 | 函数首部
{函数体语句; --函数题: 整个{}包裹的内容都属于函数体,{}不能省略
}
函数头:
- **返回类型:**函数返回值的类型
- **函数名:**函数的名称,遵循标识符命名(不能以数字开头,只能包含字母、数字、下划线。建议:小写+下划线,举例:
show_al1()
,或者小驼峰命名法,第一个单词首字母小写,其他单词首字母大写,举例:showAll()
) - **形参列表:**用于接收主调函数传递的数据,如果有多个参数,使用
","
分隔,且每个形参都需要指明类型。
小贴士:
①形参列表(被调函数):主调函数给被调函数传递数据:主调函数→被调函数
②返回类型(被调函数):被调函数给主调函数返回数据:被调函数→主调函数
通过生活中的案例理解函数调用:
假设:饮料店的工作人员通过榨汁机榨取新鲜果汁
理解:
工作人员:主调函数
榨汁机:被调函数
水果:传递的参数
果汁:函数的返回值
工作人员向榨汁机放入一个水果:主调函数调用被调函数,并传递数据
工作人员用杯子接收榨汁机榨出的果汁:主调函数接受被调函数返回的数据
说明:
-
函数的返回类型:就是返回值的类型,两个类型可以不同,但是必须能够进行转换,举例:
double fun_a() //函数的返回类型是 double {return 12; //函数的返回值是12,其对应的类型是int(return后面跟的是返回值) }
以上代码可以理解为:将int类型的12赋值给一个double类型的匿名变量(int→double)此时属于隐式转换 正确
int fun_a() //函数的返回类型是int {return 12.5; //函数的返回值是int }
以上代码可以理解为:将double类型的12.5赋值给一个int类型的匿名变量(double→int)舍弃小数点后的数据。
案例:
#include <stdio.h>double fun_a() {return 12;// 就是将int类型的12赋值给double类型的匿名变量 int --> double } int fun_b() {return 12.5;// 就是将double类型的12.5赋值给int类型的匿名变量 double --> int 此时会舍弃掉小数部分 } double fun_c() {return 12.5; // 就是将double类型的12.5赋值给double类型的匿名变量 double --> double } int main(int argc,char *argv[]) {// 接收函数返回值,函数返回什么类型,就用什么类型接double result1 = fun_a();// 主调函数使用double来接收被调函数返回的double,double --> doubleprintf("%lf\n",result1);int result2 = fun_b(); // 主调函数使用int来接收被调函数返回的int,int --> intprintf("%d\n",result2);int result3 = (int)fun_c(); // 主调函数使用int来接收被调函数返回的double,int --> (int)doubleprintf("%d\n",result3)return 0; }
-
在C语言中无返回值时应明确使用void类型,举例:
void test() //此时这个函数,没有返回值,也就是它的返回只是retun; {ptintf("hello\n"); }//下面写法等价于上面写法 void test() {return; //一般,这个return是省略不写的 }
-
在C语言中,C89标准允许函数的返回类型标识符可以省略,如果省略,默认返回int。C99/C11标准要求必须明确指定返回类型,不再支持默认int类型,举例:
//写法1:main返回类型是int类型,默认的返回值是0,等价于写法2 main() {.... }//写法2:main的返回类型是int类型,返回值是0 推荐写法 int main() {return 0; }
-
函数中返回语句的形式为
return(表达式)
或者return 表达式
//写法1 int main() {return (0); }//写法2 推荐 int main() {return 0; }
-
如果
参数列表
中有多个形式参数,则它们之间要用,
分隔;即使它们的类型相同,在形式参数中只能逐个将进行说明,举例:// 正确示例 int avg(int x, int y, int z) {... }// 错误示例 int avg(int x, y, z) //不能省略每一个形参的类型 {... }
-
如果
形参列表
中没有参数,我们可以不写,也可以用void标识,举例:// 写法1 推荐 int main() {... }// 写法2 int main(void) {... }
案例
案例1
-
需求:计算1~n之间自然数的阶乘值
-
代码:
#include <stido.h>/** *求1~n的阶乘值 *建议:设计的函数,尽量让被调函数改动角小区,能够重复用,有主调函数去影响 */ size_t fun_1(int n) {int i; //循环变量int s = 1; //阶乘值,初始值是1for(i = 1; i <= n; i++) s*=i;return s; // 返回结果给主调函数 }int main() {printf("1~12的阶乘结果是%d\n",fun_1(12));printf("1~20的阶乘结果是%d\n",fun_1(20));printf("1~30的阶乘结果是%d\n",fun_1(30));printf("1~40的阶乘结果是%d\n",fun_1(40)); return 0; }
运行结果:
注意:这里计算结果为0,是因为数据太大,超过int存储范围,高位数据丢失,低位数据转出来为0,建议使用
unsigned long
类型。
案例2
-
需求:计算一个圆台两个面的面积之和
-
代码:
//定义PI #define PI 3.141599266 /** * 定义一个函数,根据半径计算圆面积 * @param r:半径 * @return 面积 */ double cicle_area(double r) {// return PI * r * r;return PI * pow(r,2.0); //pow(底数,指数):求r的2次方,我们有些库函数不是c标准函数,需要我们做特殊处理,比如pow需要在编译时加 -lm }int main() {//定义两个半径,两个面积double r1,r2,area1,area2;printf("请输入两个圆的半径:\n");scanf("%lf,%lf",&r1,&r2);//调用函数计算圆的面积area1 = cicle_area(r1);area2 = cicle_area(r2);printf("一个圆台两个面面积之和是%.2lf\n",area1 + area2);return 0; }
-
编译命令:
gcc demo03.c -lm //pow() 不是C语言标准函数,无法自动链接,血药手动链接 -lm linked math 链接数学库
形参和实参
形参(形式参数)
定义
函数定义时指定的参数,形参是用来接收数据的,函数定义时,系统不会为形参申请内存,只有当函数调用时,系统才会为形参申请内存。主要用于存储实际参数,并且当函数返回时(执行return),系统会自动回收为形参申请的内存资源。
- C语言中所有参数传递都是值传递
- 若要修改实参,需传递指针
案例
-
需求:判断一个数是偶数还是奇数
-
代码:
/** * 方式1 */ void fun0(int n) // 这里的n就是形式参数 {if(n %2 == 0)printf("%d是偶数!\n",n);else printf("%d是奇数!n",n); }/** * 方式2 */ void fun1(int n) // 这里的n就是形式参数 {if(n %2 == 0){ printf("%d是偶数!\n",n);return; //提前结束函数,return后的代码不再执行}printf("%d是奇数!n",n); }/** * 方式3 */ void fun2(int n) // 这里的n就是形式参数 {if(n %2 == 0){ printf("%d是偶数!\n",n);return -1; }printf("%d是奇数!n",n);return 0; }int main() {fune(5);fun1(5);fun2(5);return 0; }
实参(实际参数)
定义
实参是函数调用时由主调函数传递给被调函数的具体的数据。实参可以是常量、变量或者表达式
关键特性
1.类型多样性:
-
实参可以是常量、变量或者表达式。
-
例如:
fun(12); //常量作为实参 fun(a); //变量作为实参 fun(a + 12); //表达式作为实参
2.类型转换
-
当实参和形参类型不同时,会按照赋值规则进行隐式类型转换
-
类型转换可能导致精度损失。
-
例如:
/** * 求一个数的最大值 */ double fabs(double a) {return a < 0 ? -a : a; }int main() {int x = 12, y = -12;//函数调用时,自动将int类型隐式转换为double类型;//函数转换时,需要将duble类型转为int类型,此时需要显示转换int x1 = (int)fabs(x); int y1 = (int)fabs(y); //同上 }
注意:函数调用的时候,通过实参给形参赋值。
3.单向值传递
-
C语言采用单向值传递机制(赋值的方向:实参→形参)
-
实参仅将其值赋给形参,不传递参本身
-
形参值的改变不会影响实参。
-
案例:
int modify(int n)//n的变量地址:0x11 {n=20; // 修改形参n = 20 }int main() {int n = 10;//实参变量 n=10 n的变量地址:0x22modify(n);printf("%d\n",n); // 10 }
4.内存独立性
-
实参和形参在内存中占据不同的空间
-
形参拥有独立的内存地址
-
演示:
#include <stdio.h> int fun(int n) // n 是形参 {printf("形参n的值: %d\n", n);n += 5; // 修改形参return n; }int main() {int a = 10;printf("调用前实参a的值: %d\n", a);// 变量作为实参int result = fun(a); // a 是实参printf("调用后实参a的值: %d\n", a); // a保持不变printf("函数返回值: %d\n", result);// 常量作为实参fun(12); // 字面量12是实参// 表达式作为实参fun(a + 12); // 表达式a+12是实参return 0; }
上述示例程序输出:
案例
-
需求:输入4个整数,要求一个函数求出最大数
-
分析:
- 设计一个函数,这个函数只是西安2个数求最大值
- 多次复用这个函数实现最终求值
-
代码:
/** * 定义一个函数,求两个数中的最大值 *@param x,y *@return 最大值 */ int max(int x, int y) {return x > y ? x : y; }int main() {//定义4个变量,用来接收控制台输入int a, b, c, d, m;printf("请输入四个整数:\n");scanf("%d%d%d%d",&a,&b,&c,&d);// 求a,b中的最大值m = max(a,b);// 求a,b,c中的最大值m = max(m,c);// 求a,b,c,d中的最大值m = max(m,d);printf("%d,%d,%d,%d中的最大数是%d", a, b, c, d, m);return 0: }
-
运行结果:
函数的返回值
定义
-
若不需要返回值,函数可以没有return语句。
//如果返回类型是void,return 关键字可以省略 void fun1() {... } // 这种写法,return关键字也可以省略,但是此时默认返回是 return 0 int fun2() {}// 这种写法,return关键字也可以省略,但是此时默认返回是 return 0 fun3() // 如果不写返回类型,默认返回int {}
-
一个函数中可以有多个return语句,但是任一时刻只有一个return语句被执行。
int eq(int num) {if(num % 2 ==0){printf("%d是偶数!\n", num);return 0;}printf("%d是奇数!\n", num);return 0; }
-
返回值类型一般情况下要和函数中return语句的数据类型一致,如果不一致,以函数定义指定的返回值类型为标准。
案例
-
需求:输入两个整数,要求用一个函数求出最大数
-
案例1:不涉及类型转换
#include <stdio.h> /** * 定义一个函数,求两个数中的最大数 * @param x,y 外部传入的整数 * @return 最大数 */ int get_max(int x, int y) {if (x > y) return x;return y; } int main(int argc,char *argv[]) {// 定义三个变量,用来存储控制台输入的两个整数以及最大值int a,b,max;// 通过控制台录入数据printf("请输入两个整数:\n");scanf("%d%d",&a,&b);// 调用函数进行比较max = get_max(a,b);printf("%d,%d中的最大值是%d\n",a,b,max);return 0; }
-
案例2:设计类型转换
#include <stdio.h> /** * 定义一个函数,求两个数中的最大数 * @param x,y 外部传入的整数 * @return 最大数 */ double get_max(int x, int y) {if (x > y) return x;return y; } int main(int argc,char *argv[]) {// 定义三个变量,用来存储控制台输入的两个整数以及最大值int a,b,max;// 通过控制台录入数据printf("请输入两个整数:\n");scanf("%d%d",&a,&b);// 调用函数进行比较max = (int)get_max(a,b); // double → int 需要显示转换printf("%d,%d中的最大值是%d\n",a,b,max);return 0; }
-
案例3:涉及类型转换-显示转换
#include <stdio.h> /** * 定义一个函数,求两个数中的最大数 * @param x,y 外部传入的整数 * @return 最大数 */ int get_max(int x, int y) {double z;z = x > y ? x : y;return (int)z; // double → int } int main(int argc,char *argv[]) {// 定义三个变量,用来存储控制台输入的两个整数以及最大值int a,b,max;// 通过控制台录入数据printf("请输入两个整数:\n");scanf("%d%d",&a,&b);// 调用函数进行比较max = get_max(a,b);printf("%d,%d中的最大值是%d\n",a,b,max);return 0; }
相关文章:
C 语言学习笔记(函数)
内容提要 函数 函数的概述函数的分类函数的定义形参和实参函数的返回值 函数 函数的概述 **函数:**实现一定功能的,独立的代码模块,对于函数的使用,一定是先定义,后使用。 使用函数的优势: ①我们可以…...
数据结构 -- 树形查找(二)平衡二叉树
平衡二叉树 定义 平衡二叉树(AVL树) – 树上的任意一点的左子树和右子树的高度之差不超过1 节点的平衡因子 左子树高-右子树高 平衡二叉树的结点的平衡因子的值只可能是-1、0、1 //平衡二叉树结点 typedef struct AVLNode{int key; //数据域int bal…...
day 29
类装饰器 类有修饰器,他的逻辑:接收一个类,返回一个修改后的类。例如 1. 添加新的方法或属性(如示例中的 log 方法)。 2. 修改原有方法(如替换 __init__ 方法,添加日志)。 3. 甚…...
Java 并发编程
黑马程序员深入学习Java并发编程 进程与线程 预备知识 java8,pom.xml <dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.10</version></depe…...
windows笔记本连接RKNN3588网络配置解析
这几天拿到了一块RKNN3588的板子,准备做视觉和Ros开发用,但是拿到后就蒙蔽了,不知道怎么ssh连到板子上去,更甚者不知道怎么配置网络让RKNN能够联网更新环境,这里记录一下整个过程。主要包括以下两个内容: 1.adb连接RKNN3588开发 2. 网口连接RKNN更新板子环境开发 adb连…...
C++ asio网络编程(8)处理粘包问题
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 粘包问题一、粘包原因总结: 二、如何处理粘包处理方法 三、完善消息节点MsgNode代码部分细节详解memcpy(_data, &max_len, HEAD_LENGTH);_data…...
【架构美学】Java 访问者模式:解构数据与操作的双重分发哲学
一、模式定义与核心思想 访问者模式(Visitor Pattern)是一种行为型设计模式,其核心目标是将数据操作与数据结构分离。通过定义一个独立的访问者类,使得新增对数据结构中元素的操作时,无需修改元素本身的类结构&#x…...
UE5无法编译问题解决
1. vs编译 2. 删除三个文件夹 参考...
Java可变参数与Collections工具类详解
Java可变参数与Collections工具类详解 一、可变参数(Variable Arguments) 1.1 基本概念 可变参数是Java 5引入的特性,允许在方法中定义数量可变的形参。其核心特点是:形参个数可以动态变化(0个、1个、多个ÿ…...
Git版本管理命令reset
目录 命令 git reset 场景一只回退 工作区代码 场景二回退暂存库与工作区 场景三回退暂存库,工作区,版本库内容 命令 git reset git reset --[soft/mixed(默认)/hard] [文件] soft:只回退版本库中内容 mixed:回退暂存区&…...
改进模糊C均值时序聚类+编码器状态识别!IPOA-FCM-Transformer组合模型
改进模糊C均值时序聚类编码器状态识别!IPOA-FCM-Transformer组合模型 目录 改进模糊C均值时序聚类编码器状态识别!IPOA-FCM-Transformer组合模型效果分析基本描述程序设计参考资料 效果分析 基本描述 1.创新未发表!研究亮点!时序…...
Zookeeper入门(三)
Zookeeper Java 客户端 项目构建 ookeeper 官方的客户端没有和服务端代码分离,他们为同一个jar 文件,所以我们直接引入 zookeeper的maven即可, 这里版本请保持与服务端版本一致,不然会有很多兼容性的问题 1 <dependency>…...
使用Redission来实现布隆过滤器
简述布隆过滤器 布隆过滤器是一种概率型数据结构,它可以用来判断一个元素是否在一个集合中。我们当时使用的是Redisson实现的布隆过滤器。它的底层原理是,先初始化一个比较大的数组,里面存放的是二进制0或1。一开始都是0,当一个k…...
Seata源码—6.Seata AT模式的数据源代理一
大纲 1.Seata的Resource资源接口源码 2.Seata数据源连接池代理的实现源码 3.Client向Server发起注册RM的源码 4.Client向Server注册RM时的交互源码 5.数据源连接代理与SQL句柄代理的初始化源码 6.Seata基于SQL句柄代理执行SQL的源码 7.执行SQL语句前取消自动提交事务的源…...
Spring-Beans的生命周期的介绍
目录 1、Spring核心组件 2、Bean组件 2.1、Bean的定义 2.2、Bean的生命周期 1、实例化 2、属性填充 3、初始化 4、销毁 2.3、Bean的执行时间 2.4、Bean的作用域 3、常见问题解决方案 4、与Java对象区别 前言 关于bean的生命周期,如下所示: …...
目标检测新突破:用MSBlock打造更强YOLOv8
文章目录 YOLOv8的现状与挑战YOLO-MS的MSBlock简介MSBlock的工作原理MSBlock的优势 利用MSBlock改进YOLOv8替换YOLOv8主干网络中的部分模块代码实现:替换CSP模块为MSBlock 在YOLOv8的颈部(Neck)中插入MSBlock代码实现:在颈部区域插…...
[SpringBoot]Spring MVC(4.0)
获取Header 传统获取 header 从 HttpServletRequest 中获取 RequestMapping("/r8")public String r8(HttpServletRequest request) {String userAgent request.getHeader("User-Agent");return "userAgent: "userAgent;}使用浏览器访问后&…...
Linux概述:从内核到开源生态
Linux概述:从内核到开源生态 Linux 是当今计算机领域最核心的开源操作系统内核,其影响力已渗透到服务器、嵌入式设备、云计算甚至超级计算机等各个领域。本章将深入解析Linux的本质、核心架构及其背后的开源哲学。 1. Linux的本质:不只是“操…...
【ubuntu24.04】pycharm 死机结束进程
windows 远程pycharm到ubuntu执行程序 pycharm 在调试过程中,内存耗尽,然后死机了 pycharm 进程 (base) rootk8s-master-pfsrv:/home/zhangbin/下载# ps -ef | grep pycharm root 121245 3230568 0 5月14 pts/8 00:00:00 /bin/bash --rcfile …...
【PRB】深度解析GaN中最浅的受主缺陷
2025 年 1 月 16 日,Virginia Commonwealth University 的 M. A. Reshchikov 和 SUNY–Albany 的 B. McEwen 等人在《Physical Review B》期刊发表了题为《Identity of the shallowest acceptor in GaN》的文章,基于对 50 多个 Be 掺杂 GaN 样品的光致发光实验以及 Heyd-Scus…...
Flink CEP是什么?
Apache Flink 的 CEP(Complex Event Processing,复杂事件处理) 是 Flink 提供的一个库,用于在无界数据流中检测符合特定模式的事件组合。 🎯 一、什么是 CEP? ✅ 定义: CEP 是一种从连续的数据…...
基于STM32的多传感器融合的设施农业小型搬运机器人避障控制系统设计
一、系统总体设计目标 针对设施农业场景中狭窄通道、障碍物多样(如农机具、作物植株、水管)的特点,设计一款基于 STM32 的小型搬运机器人避障控制系统。系统通过多传感器融合实现 360 环境感知,采用模糊 PID 控制算法实现平滑避障,满足温室、大棚等场景的搬运需求。 二、…...
从零开始实现大语言模型(十六):加载开源大语言模型参数
1. 前言 预训练大语言模型的难点不在于算法,而在于数据和算力,绝大多数企业和机构都没有预训练大语言模型的算力资源。在工业界的大语言模型应用实践中,通常会使用领域数据微调开源大语言模型参数,以构建领域大语言模型。 本文介…...
Spark,数据提取和保存
以下是使用 Spark 进行数据提取(读取)和保存(写入)的常见场景及代码示例(基于 Scala/Java/Python,不含图片操作): 一、数据提取(读取) 1. 读取文件数据&a…...
java19
1.集合体系结构 注意: 2.collection遍历之迭代器遍历 一次循环只能一次next方法的原因: 原因:集合长度是单数就报错 3.collection遍历之增强for遍历 如何代码简写呢:集合名.for回车 4.collection遍历之Lambda表达式遍历 5.使用多态…...
从0到1吃透卷积神经网络(CNN):原理与实战全解析
一、开篇:CNN 在 AI 领域的地位 在当今人工智能(AI)飞速发展的时代,卷积神经网络(Convolutional Neural Network,简称 CNN)无疑是深度学习领域中最为耀眼的明星之一 。它就像是 AI 世界里的超级…...
建一个结合双向长短期记忆网络(BiLSTM)和条件随机场(CRF)的模型
构建一个结合双向长短期记忆网络(BiLSTM)和条件随机场(CRF)的模型,通常用于序列标注任务,如命名实体识别(NER)、词性标注(POS Tagging)等。下面我将通过口述的…...
mvc-ioc实现
IOC 1)耦合/依赖 依赖,是谁离不开谁 就比如上诉的Controller层必须依赖于Service层,Service层依赖于Dao 在软件系统中,层与层之间存在依赖。我们称之为耦合 我们系统架构或者设计的一个原则是ÿ…...
符合Python风格的对象(再谈向量类)
再谈向量类 为了说明用于生成对象表示形式的众多方法,我们将使用一个 Vector2d 类,它与第 1 章中的类似。这一节和接下来的几节会不断实 现这个类。我们期望 Vector2d 实例具有的基本行为如示例 9-1 所示。 示例 9-1 Vector2d 实例有多种表示形式 &g…...
4.1.8文件共享
知识总览 基于索引节点的共享方式(硬链接): 让不同用户的文件目录项指向同一个文件的索引节点 用户1创建文件1,并让文件目录项aaa指向了文件1,这个文件对应了一个索引节点,这个索引节点 包含了文件的物理地址和文件的其他属性信…...
[LevelDB]LevelDB版本管理的黑魔法-为什么能在不锁表的情况下管理数据?
文章摘要 LevelDB的日志管理系统是怎么通过双链表来进行数据管理为什么LevelDB能够在不锁表的情况下进行日志新增 适用人群: 对版本管理机制有开发诉求,并且希望参考LevelDB的版本开发机制。数据库相关从业者的专业人士。计算机狂热爱好者,对计算机的…...
普通用户的服务器连接与模型部署相关记录
普通用户的服务器连接与模型部署相关记录 一、从登录到使用自己的conda 1.账号登陆: ssh xxx172.31.226.236 2.下载与安装conda: 下载conda: wget -c https://repo.anaconda.com/archive/Anaconda3-2023.03-1-Linux-x86_64.sh 安装con…...
WebSocket解决方案的一些细节阐述
今天我们来看看WebSocket解决方案的一些细节问题: 实际上,集成WebSocket的方法都有相关的工程挑战,这可能会影响项目成本和交付期限。在最简单的层面上,构建 WebSocket 解决方案似乎是添加接收实时更新功能的前进方向。但是&…...
架构思维:构建高并发扣减服务_分布式无主架构
文章目录 Pre无主架构的任务简单实现分布式无主架构 设计和实现扣减中的返还什么是扣减的返还返还实现原则原则一:扣减完成才能返还原则二:一次扣减可以多次返还原则三:返还的总数量要小于等于原始扣减的数量原则四:返还要保证幂等…...
C++函数基础:定义与调用函数,参数传递(值传递、引用传递)详解
1. 引言 函数是C编程中的核心概念之一,它允许我们将代码模块化,提高代码的可读性、复用性和可维护性。本文将深入探讨: 函数的定义与调用参数传递方式(值传递 vs 引用传递)应用场景与最佳实践 2. 函数的定义与调用 …...
深入解析Python中的Vector2d类:从基础实现到特殊方法的应用
引言 在Python面向对象编程中,特殊方法(或称魔术方法)是实现对象丰富行为的关键。本文将以Vector2d类为例,详细讲解如何通过特殊方法为自定义类添加多种表示形式和操作能力。 Vector2d类的基本行为 Vector2d类是一个二维向量类…...
【25软考网工】第六章(7)网络安全防护系统
博客主页:christine-rr-CSDN博客 专栏主页:软考中级网络工程师笔记 大家好,我是christine-rr !目前《软考中级网络工程师》专栏已经更新三十多篇文章了,每篇笔记都包含详细的知识点,希望能帮助到你&#x…...
Mac下载bilibili视频
安装 安装 yt-dlp brew install yt-dlp安装FFmpeg 用于合并音视频流、转码等操作 brew install ffmpeg使用 下载单个视频 查看可用格式 yt-dlp -F --cookies-from-browser chrome "https://www.bilibili.com/video/BV15B4y1G7F3?spm_id_from333.788.recommend_more_vid…...
6个月Python学习计划:从入门到AI实战(前端开发者进阶指南)
作者:一名前端开发者的进阶日志 计划时长:6个月 每日学习时间:2小时 覆盖方向:Python基础、爬虫开发、数据分析、后端开发、人工智能、深度学习 📌 目录 学习目标总览每日时间分配建议第1月:Python基础与编…...
批量处理 Office 文档 高画质提取图片、视频、音频素材助手
各位办公小能手们!你们有没有遇到过想从 Office 文档里提取图片、音频和视频,却又搞得焦头烂额的情况?今天就给大家介绍一款超厉害的工具——OfficeImagesExtractor! 这货的核心功能那可真是杠杠的!首先是高画质提取&a…...
【甲方安全建设】Python 项目静态扫描工具 Bandit 安装使用详细教程
文章目录 一、工具简介二、工具特点1.聚焦安全漏洞检测2.灵活的扫描配置3.多场景适配4.轻量且社区活跃三、安装步骤四、使用方法场景1:扫描单个Python文件场景2:递归扫描整个项目目录五、结果解读六、总结一、工具简介 Bandit 是由Python官方推荐的静态代码分析工具(SAST)…...
【推荐】新准则下对照会计报表172个会计科目解释
序号 科目名称 对应的会计报表项目 序号 科目名称 对应的会计报表项目 一、资产类 二、负债类 1 1001 库存现金 货币资金 103 2001 短期借款 短期借款 2 1002 银行存款 货币资金 104 2101 交易性金融负债 易性金融负债 3 1012 其他货币资…...
IntelliJ IDEA设置编码集
在IntelliJ IDEA中设置Properties文件的编码格式,主要涉及以下步骤和注意事项: 1. 全局和项目编码设置 打开设置界面:File -> Settings -> Editor -> File Encodings。在Global Encoding和Project Encoding下拉菜单中均选择UT…...
类魔方 :多变组合,灵活复用
文章目录 一、类的基础1. 类的基本结构与语法1. 类的定义与实例化2. 成员变量(属性)3. 构造函数(Constructor)4. 成员方法 2. 访问修饰符1. 基本访问规则2. 子类对父类方法的重写3. 构造函数的访问修饰符4. 参数属性与继承总结 3.…...
支持多方式拼接图片的软件
软件介绍 本文介绍一款名为 PicMerger 的图片拼接软件。 拼接亮点 PicMerger 这款软件最大的亮点在于,它能够将不同分辨率的图片完美地拼接在一起。拼接时会自动以分辨率最小的图片为标准,操作十分方便。 拼接方式与设置 该软件支持横向和纵向的拼接…...
Qt音视频开发过程中一个疑难杂症的解决方法/ffmpeg中采集本地音频设备无法触发超时回调
一、前言 最近在做实时音视频通话的项目中,遇到一个神奇的问题,那就是用ffmpeg采集本地音频设备,当音频设备拔掉后,采集过程会卡死在av_read_frame函数中,尽管设置了超时时间,也设置了超时回调interrupt_c…...
Android studio Could not move temporary workspace
Android studio Could not move temporary workspace 在Window上运行AS出现Could not move temporary workspace报错方法一(有效)方法二方法三方法四总结 在Window上运行AS出现Could not move temporary workspace报错 Could not move temporary workspa…...
深度估计中为什么需要已知相机基线(known camera baseline)?
在计算机视觉和立体视觉的上下文中,“已知相机基线”(known camera baseline)的解释 1. 相机基线的定义 相机基线是指两个相机中心之间的距离。在立体视觉系统中,通常有两个相机(或一个相机在不同位置拍摄两张图像&a…...
Spring Cloud 技术实战
Spring Cloud 简介 Spring Cloud 是基于 Spring Boot 构建的微服务框架,提供了一套完整的微服务解决方案。它利用 Spring Boot 的开发便利性,并通过各种组件简化分布式系统的开发。 核心组件 Spring Cloud Netflix Eureka: 服务注册与发现Spring Clou…...
《云端共生体:Flutter与AR Cloud如何改写社交交互规则》
当Flutter遇上AR Cloud,一场关于社交应用跨设备增强现实内容共享与协作的变革正在悄然发生。 Flutter是谷歌推出的一款开源UI软件开发工具包,其最大的优势在于能够实现一套代码,多平台部署,涵盖iOS、Android、Web、Windows、macO…...