当前位置: 首页 > news >正文

C语言 ——— 认识C语言

认识 main 函数

main 函数是程序的入口,程序执行时会从 main 函数的第一行开始执行,且一个工程中 main 函数有且只有一个

标准的 main 函数格式:

int main()
{return 0;
}

int 是类型,这里指的是 main 函数的返回类型

return 是返回的意思,通常 main 函数返回 0,表示正常结束程序

古老的 main 函数格式:

void main()
{}

这是比较古老的 main 函数格式,void 表示没有返回值,不用 return 返回

如果书籍或者教材中有这种 main 函数的写法,大概率可以不用看了

不接受参数的 main 函数格式:

int main(void)
{return 0;
}

main 函数括号中的 void 表示这个 main 函数不接受任何参数


sizeof 操作符

sizeof 操作符的作用是计算 类型/变量 所占内存空间的大小,单位是字节(byte)

sizeof 计算内置类型所占空间的大小:

int main()
{printf("%d\n", sizeof(char));printf("%d\n", sizeof(short));printf("%d\n", sizeof(int));printf("%d\n", sizeof(long));printf("%d\n", sizeof(long long));printf("%d\n", sizeof(float));printf("%d\n", sizeof(double));return 0;
}

%d 的意思是以 10 进制的形式打印一个整数,因为 sizeof 关键字的返回类型是整形,所以使用 %d 的形式打印

运行代码:

可以看到 char 类型所占内存空间大小为 1 字节、short 类型所占空间大小为 2 字节...

因为 C语言 规定,只要 sizeof(long) >= sizeof(int) 即可,所以 sizeof(long) 的大小是 4 字节,在有些平台下 sizeof(long) 的大小是 8 字节


全局变量和局部变量

代码演示:

int b = 100;int main()
{int a = 10;return 0;
}

定义在 main 函数内部的变量 a 就是局部变量

定义在 main 函数外部的变量 b 就是全局变量

生命周期:

变量 a 的生命周期是在 main 函数内部,当 mian 函数执行完了 return 后,变量 a 的生命周期就结束了

变量 b 的生命周期是整个工程结束时,变量 b 的生命周期才结束

当全局变量的变量名和局部变量的变量名冲突时:

int a = 100;int main()
{int a = 10;return 0;
}

通过 printf 函数测试代码是否能正常执行,并且测试出有限执行的哪个变量

测试代码:

可以看到,优先执行了局部的变量 a

小结:

首先原则上变量名尽量不要冲突,但是当全局变量和局部变量的名字冲突的情况下,局部变量优先


extern 关键字

extern 关键字的作用是声明外部符号

例如:

有两个 .c 文件,分别为 add.c 文件和 test.c 文件

add.c 文件的代码:

int a = 2025;

那么想要在 test.c 文件中使用 add.c 文件中的变量 a,就需要使用 extern 关键字

test.c 文件使用变量 a:

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

要想使用 add.c 文件中的变量 a,要先在 test.c 文件中对变量 a 进行声明,才能正常使用

运行 test.c 文件:


常量

字面常量

字面常量顾名思义就是字面意义的常量,不能改变的量就叫常量

比如:圆周率、由 0-9 组成的数字、字符、字符串... 

const 修饰的常变量

代码演示:

const int a = 10;

定义了一个 int 类型的变量 a,并且这个变量 a 被 const 修饰了,此时 a 就具有了常属性

也就表示 a 的值不能被改变了,只能在初始化的时候赋值

且 a 本质还是一个变量,因为不能给数组定义长度,只是 a 这个变量不能被修改,所以称 a 为常变量

#define 定义的标识符常量

代码演示:

#define SIZE 10

这个代码可以理解为给 10 这个常量取了一个名字叫 SIZE,此时的 SIZE 就是标识符常量

那么 SIZE 就能给其他同类型的变量赋值,且可以给数组定义长度

在执行代码时,程序会把有 SIZE 的地方全部替换为常量 10

枚举常量

枚举常量顾名思义是能被一一列举的常量,比如:性别、三原色、血型等

代码演示:

enum COLOR
{Red,Green,Blue
};

enum 是定义枚举常量的关键字,COLOR 是枚举常量的结构体名称

其中 Red、Green、Blue 是枚举出的三原色,他们都有各自的默认值,Red 是 0,后面的依次递增

代码测试:

可以在初始化的时候重新给他们赋值,并且还是遵循依次递增的规定


'\0' 是字符串结束标志

'\0' 是表示字符串结束的标志,不论是用 %s 打印字符串,还是用 strlen 函数求字符串长度,都是遇到 '\0' 才结束,否则就会一直执行,知道遇到 '\0' 才停止

%s 打印字符串

%s 表示的是打印一串字符,一般和 printf 函数配合使用

代码演示:

char arr1[] = { 'a','b','c','d' };
char arr2[] = "abcd";

在数组 arr1 中存储了 4 个字符,但在数组 arr2 中不只是存储了 "abcd" 字符串,在 "abcd" 字符串末尾还存放了一个 '\0'

可以通过监视验证:

那么以 %s 分别打印两个数组时,arr1 数组就会除了打印字符还会打印其他未定义字符,直到遇到 '\0' 才会停止

代码验证:

strlen 函数

strlen 函数的作用是求字符串长度,所需要的头文件为 #include<string.h>

且 strlen 函数同样是求到 '\0' 之前的长度,当没有 '\0' 的话就会一直求长度,直到遇到 '\0' 为止

代码验证:

因为不知道数组 arr1 何时遇到 '\0' ,所以是随机值

解决办法:

可以在 arr1 数组中手动加上 '\0'

代码演示:

char arr1[] = { 'a','b','c','d','\0' };

 这样不论是 %s 打印还是 strlen 求长度,都能正常输出结果


转移字符 \ddd 和 \xdd

转移字符 \ddd

其中 ddd 表示 1~3 个八进制的数字

代码演示:

printf("%d\n", '\130');

%d 是以十进制的方式打印,那么 130 这个八进制数字转换为十进制为 88 

因为 130 各自的权重相乘在相加为 0*8^0 + 3*8^1 + 1*8^2 = 88

代码验证:

那么以 %c 字符形式打印,那么结果就会变成大写的 X,因为 88 所对应的 ASCII 码值就是 X

代码验证:

转移字符 \xdd

x 表示是十六进制的数字,其中 dd 表示 2 个十六进制的数字

代码演示:

printf("%d\n", '\x61');

十六进制的 61 转换为 十进制为:1*16^0 + 6*16^1 = 97

代码验证:

那么同样的道理,以 %c 的形式打印的话也就是打印 97 所对应的 ASCII 码值

代码验证:

测试题 

代码演示:

printf("%d\n", strlen("C:\test\127\x56\test.c"));

问:strlen 求出的长度是多少

易错点:其中 '\t'  '\127'  '\x56' 是转移字符,本质只占用1个字节

所以统计后的结果应该是 14 字节

代码验证:


选择语句

单分支选择语句

代码演示:

int a = 0;if (a == 0)
{printf("a == 0\n");
}
else
{printf("a != 0\n");
}

当满足 if 语句中的条件判断时,就不会执行 else 语句,否则就相反

所以代码中只会执行 if 语句内的代码 

多分支选择语句

代码演示:

int a = 0;if (a > 0)
{printf("a > 0\n");
}
else if (a < 0)
{printf("a < 0\n");
}
else
{printf("a == 0\n");
}

既不满足 if 语句的条件,也不满足 else if 语句的条件,所以最后会打印 else 语句中的代码 


循环语句

循环语句顾名思义就是循环执行循环内部的代码,直到满足特定的条件才会跳出循环 

while 循环语句

代码演示:

int a = 0;while (a < 5)
{printf("a = %d\n", a);a++;
}

满足条件,进入 while 循环,进入 while 循环时,先打印,变量 a 再自增 1 ,最后直到 a 不小于 5 时就循环结束

代码验证:

for 循环语句

代码演示:

for (int a = 0;a < 5;a++)
{printf("a = %d\n", a);
}

for(表达式1; 表达式2; 表达式3) 执行逻辑是:

先执行 表达式1,再判断 表达式2 是否满足条件,满足条件时进入 for 循环内部,执行完内部的代码后再回到 表达式3并且执行,执行完 表达式3 后再判断是否满足 表达式2 ,满足就再次进入循环(循环往复),不满足就跳出循环

代码验证:

do while 循环语句

代码演示:

int a = 0;do
{printf("a = %d\n", a);a++;} while (a < 5);

do while 循环语句的特点是:不论是否满足进入循环的条件,都会先进入循环内部执行一次代码,执行完之后再判断是否满足条件,满足就继续执行,不满足就跳出循环

代码验证:

break 关键字和 continue 关键字

break 关键字

break 关键字的作用是结束并且跳出当前循环

代码演示:

for (int a = 0;a < 5;a++)
{printf("a = %d\n", a);if (a == 3){break;}
}

当 a 等于 3 时就会执行 break,跳出循环

代码验证:

需要注意的是 break 只能跳出当前循环,如果是双重循环或者多重循环时,只能跳出 break 所在的那层循环

代码演示:

for (int i = 0;i < 1;i++)
{for (int a = 0;a < 5;a++){printf("a = %d\n", a);if (a == 3){break;}}printf("i = %d\n", i);
}

当内部循环走到 break 跳出时,外部的循环依然要执行

代码验证:

continue 关键字

continue 关键字的作用是跳过循环内部 continue 下面的代码,从头执行循环(当然要判断是否满足循环条件,满足再继续执行,否则就结束循环)

代码演示:

for (int a = 0; a < 5; a++)
{if (a == 3)continue;printf("a = %d\n", a);
}

当变量 a 等于 3 时就执行 continue,跳过后面的 printf 函数,重新执行循环

代码验证:

小结

break 和 continue 关键字只能在循环内部使用,否则就会报错 


scanf 函数的返回值

scanf 函数的功能可以从键盘上读取数据,并且存储到对应的变量中

而 scanf 函数的返回值是读取数据的个数

代码演示:

int a = 0;
int b = 0;int ret1 = scanf("%d", &a);
printf("ret1 = %d\n", ret1);int ret2 = scanf("%d %d", &a, &b);
printf("ret2 = %d\n", ret2);

第一个 scanf 函数只从键盘接收一个数据,并且用 ret1 接收 scanf 函数的返回值

第二个 scanf 函数从键盘接收了两个数据,分别打印 两个 scanf 函数的返回值,看是否分别是 1 和 2

代码验证:

注意:

当 scanf 函数没有正常接收数据时,会返回 EOF(文件结束标志),可以通过让 scanf 函数接收 Ctrl+Z 键,就能返回 EOF  


牛刀小试

oj题 - 判断一个整数是否能被5整除 

题目描述:

输入一个正整数,判断这个数是否能被 5 整除,要求能多次输入输出

代码实现:

int input = 0;while (scanf("%d", &input))
{if (input % 5 == 0){printf("%d能被5整除\n", input);}else{printf("%d不能被5整除\n", input);}
}

代码解析:

直接利用 scanf 函数的返回值作为 while 循环的判断语句,只要正常接收了数据,就会进入循环

并且用 % 取模操作符进行判断,当 input%5 的余数为 0 时,就是能被 5 整除,否则就不能

代码验证:

oj题 - 计算 y 的值

题目描述:

已知一个函数 y=f(x),当 x>0 时, y=1,当 x=0 时,y=0,当 x<0 时,y=-1

要求输入 x,求出对应的 y

代码演示:

int x = 0;
int y = 0;
scanf("%d", &x);if (x > 0)y = 1;
else if (x < 0)y = -1;
elsey = 0;printf("y = %d", y);

oj题 - 时间转换

题目描述:

给定秒数 seconds,把秒转换为小时、分钟、秒,并且分别输出

代码演示:

int seconds = 0;
scanf("%d", &seconds);int h = seconds / 3600;
int m = (seconds % 3600) / 60;
int s = seconds % 60;printf("%d秒 = %d小时%d分钟%d秒", seconds, h, m, s);

代码解析:

1 小时为 3600 秒,所以 seconds 除以 3600 秒就能计算出有多少个小时

seconds 取模上 3600 秒就能计算出不足一小时的有多少秒,再除以 60 秒,就能计算出还有多少分钟

seconds 直接取模上 60 秒,就能计算出不足以 60 秒的有多少秒

代码验证:

oj题 - 三角形判断

题目描述:

输入三角形的 3 条边 a、b、c,判断是否能构成三角形,如果不能构成三角形直接输出"Not a triangle!",如果能构成三角形则判断这个是什么三角形,如果是等边三角形则输出"Equilateral triangle!",如果是等腰三角形则输出"Isosceles triangle!",如果是普通三角形则输出"Ordinary triangle!",并且要求能多组输入输出

代码演示:

int main()
{int a = 0;int b = 0;int c = 0;while(scanf("%d %d %d", &a, &b, &c) == 3){if (a + b > c && a + c > b && b + c > a) //先判断是否能构成三角形:任意两边之和不能大于第三边{if (a == b && b == c) //等边三角形三条边都相等{printf("Equilateral triangle!\n");}else if ((a == b && a != c) || (a == c && a != b) || (b == c && b != a)) //等腰三角形任意两边相等{printf("Isosceles triangle!\n");}else //普通三角形{printf("Ordinary triangle!\n");}}else{printf("Not a triangle!\n");}}return 0;
}

代码验证:


static 关键字

static 修饰局部变量

被 static 修饰的局部变量称之为静态局部变量

代码演示:

void test()
{static int a = 5;a++;printf("%d ", a);
}int main()
{for (int i = 0; i < 10; i++){test();}printf("\n");return 0;
}

对 test 函数内部定义的局部变量 a 进行了 static 修饰,此时的 a 就是静态局部变量

如果忽略 static 修饰的话,那么程序运行的结果就是 10 个 5,但是加上了 static 修饰,结果就会不同

代码验证:

可以看到,并没有每次进入 test 函数时都重新给变量 a 初始化,而是延续了上次递增的值

原因是因为变量 a 所存储的区域被 static 改变了,从栈区转换到了静态区

在 C语言 学习的时候,可以把内存大概划分为栈区、堆区、静态区

示意图:

所以 static 修饰局部变量改变了变量的存储位置,使得这个静态变量的生命周期延长了,直到程序结束时这个变量的生命周期才结束

static 修饰全局变量

被 static 修饰的全局变量称之为静全局部变量

add.c 文件代码演示:

static int val = 2025;

test.c 文件代码演示: 

extern int val;int main()
{printf("%d", val);return 0;
}

在 add.c 文件中定义了一个全局变量,并且在 test.c 文件中用 extern 关键字声明了 val 变量

如果忽略 static 关键字的话,在 test.c 中能够正常运行代码,因为任何一个全局变量都具有外部链接属性

但是全局变量 val 被 static 修饰后,val 变量就没有了外部链接属性,static 把 val 变量的外部链接属性转换为了内部链接属性,所以 val 变量只能在它所处的 add.c 文件内部使用 

static 修饰函数

被 static 修饰的函数称之为静态函数,被修饰后的作用和 static 修饰全局变量后的作用相似

add.c 代码演示:

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

test.c 代码演示:

extern int Add(int x, int y);int main()
{printf("%d\n", Add(5, 3));return 0;
}

Add 函数被 static 修饰后,同样把 Add 函数的外部链接属性转换为了内部链接属性

并且 Add 函数只能在 add.c 文件内部使用,其他任何 .c 文件都不能使用了


认识指针

指针是来管理内存的,通常使用指针来存放变量的地址

理解指针

代码演示:

int a = 10;int* pa = &a;

& 操作符的作用于取地址,&a 就是取出变量 a 的地址

pa 的类型是 int* ,* 的意思是表明 pa 是指针变量,用来存放指针的,int 的意思是表明所要存放地址的数据类型

当变量 a 的地址存放到了 pa 中后,就可以利用 * 解引用来操作变量 a

代码演示:

*pa = 100;

*pa 可以理解为通过 pa 所存放的地址找到变量 a,再对 a 重新赋值

代码验证:

实际例子

写一个函数,交换两个整数的值

代码演示:

void swap(int* x, int* y)
{int tmp = *x;*x = *y;*y = tmp;
}
int main()
{int a = 3;int b = 5;swap(&a, &b);printf("a = %d, b = %d\n", a, b);return 0;
}

因为形参和实参是各自独立的空间,所以只有把 a 和 b 的地址传递给 swap 函数,才能改变 a 和 b 的值

代码验证:

指针变量的大小

因为指针是用来存放地址的,所以不论是什么类型的指针,在不同的平台下都是固定的

在 32 位平台下:

在 64 位平台下:

相关文章:

C语言 ——— 认识C语言

认识 main 函数 main 函数是程序的入口&#xff0c;程序执行时会从 main 函数的第一行开始执行&#xff0c;且一个工程中 main 函数有且只有一个 标准的 main 函数格式&#xff1a; int main() {return 0; } int 是类型&#xff0c;这里指的是 main 函数的返回类型 return…...

44、Spring Boot 详细讲义(一)

Spring Boot 详细讲义 目录 Spring Boot 简介Spring Boot 快速入门Spring Boot 核心功能Spring Boot 技术栈与集成Spring Boot 高级主题Spring Boot 项目实战Spring Boot 最佳实践总结 一、Spring Boot 简介 1. Spring Boot 概念和核心特点 1.1、什么是 Spring Boot&#…...

STM32硬件IIC+DMA驱动OLED显示——释放CPU资源,提升实时性

目录 前言 一、软件IIC与硬件IIC 1、软件IIC 2、硬件IIC 二、STM32CubeMX配置KEIL配置 三、OLED驱动示例 1、0.96寸OLED 2、OLED驱动程序 3、运用示例 4、效果展示 总结 前言 0.96寸OLED屏是一个很常见的显示模块&#xff0c;其驱动方式在用采IIC通讯时&#xff0c;常用软件IIC…...

Android 中绕过hwbinder 实现跨模块对audio 的HAL调用

需求 Audio 模块中专门为 TV 产品添加了一些代码&#xff0c;需要在 hdmi 的 HAL 代码中进行调用以完成某些功能。 解决方法 首先将 hdmi HAL 要调用的 audio 接口函数所在的 .so 链接到最基本的 lib.primay.amlogic.so 中&#xff08;其它平台上这个 .so 文件的名字也可能是…...

基于单片机技术的手持式酒精检测电路设计

基于STC89C52单片机的酒精检测仪设计 目录 基于STC89C52单片机的酒精检测仪设计一、简介二、酒精测试仪总体方案设计2.1 酒精检测仪设计要求分析2.2 设计框图 三、硬件设计3.1 酒精检测电路3.2 模数转换电路3.3 STC89c52单片机电路3.4 LED显示电路3.5 声光报警电路3.6 按键和复…...

【车道线检测(0)】卷首语

车道线检测领域&#xff0c;早期的LaneNet、CondLaneNet等模型。现在在精度、实时性、复杂场景适应性等方面有了更多进展。 ​Head&#xff08;输出头&#xff09;的设计角度分类 在车道线检测任务中&#xff0c;Head&#xff08;输出头&#xff09;的设计角度直接影响模型的…...

记一次某网络安全比赛三阶段webserver应急响应解题过程

0X01 任务说明 0X02 靶机介绍 Webserver&#xff08;Web服务器&#xff09;是一种软件或硬件设备&#xff0c;用于接收、处理并响应来自客户端&#xff08;如浏览器&#xff09;的HTTP请求&#xff0c;提供网页、图片、视频等静态或动态内容&#xff0c;是互联网基础设施的核心…...

AI 越狱技术剖析:原理、影响与防范

一、AI 越狱技术概述 AI 越狱是指通过特定技术手段&#xff0c;绕过人工智能模型&#xff08;尤其是大型语言模型&#xff09;的安全防护机制&#xff0c;使其生成通常被禁止的内容。这种行为类似于传统计算机系统中的“越狱”&#xff0c;旨在突破模型的限制&#xff0c;以实…...

项目进度延误的十大原因及应对方案

项目进度延误主要源于以下十大原因&#xff1a;目标不明确、需求频繁变更、资源配置不足或不合理、沟通不畅、风险管理不足、缺乏有效的项目监控、技术难题未及时解决、团队协作效率低下、决策链过长、外部因素影响。其中&#xff0c;需求频繁变更是导致延误的关键因素之一&…...

瑞友客户端登录GS_ERP时,报错: 由于安全许可证服务器不能提供许可证,连接被中断的解决方法

瑞友客户端登录GS_ERP时&#xff0c;报错&#xff1a;由于安全许可证服务器不能提供许可证&#xff0c;连接被中断的解决方法 瑞友客户端登录GS_ERP时&#xff0c; 报错&#xff1a;由于安全许可证服务器不能提供许可证&#xff0c;连接被中断的解决方法是由于远程桌面连接协议…...

android wifi通过命令行打开2.4G热点

android系统支持2G和5G&#xff0c;但车机系统应用只支持5G&#xff0c;但是需要测试2.4G的射频 方法如下&#xff1a; 1、adb shell 进去&#xff0c;su 指定root权限&#xff0c;确保热点处于关闭状态 2、开启热点为www99999, 密码为12345678&#xff0c; wpa2的加密协议 cm…...

truncate,drop,delete分析

truncate,drop,delete对比分析 特性 TRUNCATE DROP DELETE **操作对象** 表中的所有数据 整个表及其所有数据 表中的特定数据 **是否保留表结构** 是 否 是 **是否可恢复** 不可恢复 不可恢复 可恢复 **性能** 高 高 低&#xff08;逐行删除&#xff09; …...

vue+flask图书知识图谱推荐系统

文章结尾部分有CSDN官方提供的学长 联系方式名片 文章结尾部分有CSDN官方提供的学长 联系方式名片 关注B站&#xff0c;有好处&#xff01; 编号: F025 架构: vueflaskneo4jmysql 亮点&#xff1a;协同过滤推荐算法知识图谱可视化 支持爬取图书数据&#xff0c;数据超过万条&am…...

什么是微前端?有什么好处?有哪一些方案?

微前端&#xff08;Micro Frontends&#xff09; 微前端是一种架构理念&#xff0c;借鉴了微服务的思想&#xff0c;将一个大型的前端应用拆分为多个独立、自治的子应用&#xff0c;每个子应用可以由不同团队、使用不同技术栈独立开发和部署&#xff0c;最终聚合为一个整体产品…...

prompts提示词经典模板

prompts.py 中的提示词模板详解 文件中定义了两个核心提示词模板&#xff1a;REASON_PROMPT 和 RELEVANT_EXTRACTION_PROMPT。这两个模板在 DeepResearcher 的推理过程中扮演着关键角色。下面我将详细解析这两个模板的结构和功能。 REASON_PROMPT 详解 REASON_PROMPT 是用于指…...

pytorch软件封装

封装代码&#xff0c;通过传入文件名&#xff0c;即可输出类别信息 上一章节&#xff0c;我们做了关于动物图像的分类&#xff0c;接下来我们把程序封装&#xff0c;然后进行预测。 单张图片的predict文件 predict.py 按着路径&#xff0c;导入单张图片做预测from torchvis…...

DAY02:【pytorch】计算图与动态图机制

一、引言 在深度学习框架中&#xff0c;计算图是理解自动求导和模型优化的核心概念。无论是PyTorch的动态图机制&#xff0c;还是TensorFlow早期的静态图模式&#xff0c;计算图都扮演着关键角色。本文将深入解析计算图的基本原理&#xff0c;并结合PyTorch代码演示动态图的运…...

基于元学习(Meta-Learning)的恶意流量检测

元学习(Meta-Learning),即“学会学习”(Learning to Learn),通过让模型从多个相关任务中提取通用知识,实现对新任务的快速适应。在恶意流量检测领域,元学习的核心价值在于从少量攻击样本中泛化出检测规则,尤其适用于新型攻击、定向APT攻击等数据稀缺场景。 一、元学习…...

JavaScript:游戏开发的利器

在近年来的科技迅速发展中&#xff0c;JavaScript 已逐渐成为游戏开发领域中最受欢迎的编程语言之一。它的跨平台特性、广泛的社区支持、丰富的库和框架使得开发者能够快速、有效地创建各种类型的游戏。本文将深入探讨 JavaScript 在游戏开发中的优势。 一、跨平台支持 JavaSc…...

玩转Docker | 使用Docker搭建pinry图片展示系统

玩转Docker | 使用Docker搭建pinry图片展示系统 前言一、Pinry介绍Pinry 简介Pinry 特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署pinry服务下载镜像创建容器检查容器状态检查服务端口安全设置四、访问pinry应用五、pinry基本使用5.1 注册pinry账号…...

DAPP实战篇:使用web3.js实现前端输入钱包地址查询该地址的USDT余额——前端篇

专栏:区块链入门到放弃查看目录-CSDN博客文章浏览阅读385次。为了方便查看将本专栏的所有内容列出目录,按照顺序查看即可。后续也会在此规划一下后续内容,因此如果遇到不能点击的,代表还没有更新。声明:文中所出观点大多数源于笔者多年开发经验所总结,如果你想要知道区块…...

企业信息化-系统架构师(九十八)

1在对一个软件系统进行设计与确认后&#xff0c;需要进行架构复审&#xff0c;架构复审目的标识潜在风险&#xff0c;及早发现架构的缺陷和漏洞&#xff0c;在架构复审过程中&#xff0c;主要由&#xff08;&#xff09;决定架构满足需求&#xff0c;质量需求是否在设计中体现。…...

【C++算法】54.链表_合并 K 个升序链表

文章目录 题目链接&#xff1a;题目描述&#xff1a;解法C 算法代码&#xff1a; 题目链接&#xff1a; 23. 合并 K 个升序链表 题目描述&#xff1a; 解法 解法一&#xff1a;暴力解法 每个链表的平均长度为n&#xff0c;有k个链表&#xff0c;时间复杂度O(nk^2) 合并两个有序…...

阿里云CDN应对DDoS攻击策略

阿里云CDN遭遇DDoS攻击时&#xff0c;可通过以下综合措施进行应对&#xff0c;保障服务的稳定性和可用性&#xff1a; 1. 启用阿里云DDoS防护服务 阿里云提供专业的DDoS防护服务&#xff0c;通过流量清洗中心过滤恶意流量&#xff0c;确保合法请求正常传输。该服务支持按需选…...

MySQL8的索引跳跃扫描原理

#MySQL 8 的索引跳跃扫描&#xff08;Index Skip Scan&#xff09;原理 1. 什么是索引跳跃扫描&#xff1f;索引跳跃扫描&#xff08;Index Skip Scan&#xff09;是 MySQL 8.0.13 引入的一种优化技术&#xff0c;允许在某些情况下跳过联合索引的最左前缀字段&#xff0c;仍然…...

centos 启动nginx 服务器

✅ 如果你是通过 yum 安装的 Nginx&#xff08;推荐方式&#xff09;&#xff1a; &#x1f539; 启动 Nginx&#xff1a; sudo systemctl start nginx &#x1f539; 设置开机自启&#xff08;建议开启&#xff09;&#xff1a; sudo systemctl enable nginx &#x1f53…...

格式化输出

% 符号相关 数据类型代码 %s&#xff1a;字符串 示例&#xff1a;print("名字是 %s" % "Tom") → 名字是 Tom%c&#xff1a;字符/ASCII码 示例&#xff1a;print("%c" % 65) → A%d/%i&#xff1a;有符号整数 示例&#xff1a;print("年龄…...

[leetcode]动态规划:斐波那契数列

一.线性dp 1.0什么是线性dp 线性DP就是指状态的转移具有线性递推关系&#xff0c;每个状态只依赖之前的状态&#xff0c;按照线性顺序一步步递推下去。 1.1斐波那契数列问题 #include <iostream> #include <vector> using namespace std; int main() { in…...

HackMyVM - todd记录

HackMyVM - toddhttps://mp.weixin.qq.com/s/E_-hepdfY-0veilL1fl2QA...

【spark认任务提交】配置优先级顺序

配置优先级顺序 Spark-submit 命令行参数 (最高优先级)代码中通过 SparkConf 设置的参数 (在应用程序中直接设置)spark-defaults.conf 文件中的配置 实际应用中的建议 固定配置&#xff1a;将集群级别的默认配置放在 spark-defaults.conf 中应用特定配置&#xff1a;将应用特…...

如何建立高效的会议机制

建立高效的会议机制需做到&#xff1a;明确会议目标、制定并提前分发议程、控制会议时长、确保有效沟通与反馈、及时跟进执行情况。其中&#xff0c;明确会议目标是核心关键&#xff0c;它直接决定了会议的方向与效率。只有明确目标&#xff0c;会议才不会偏离初衷&#xff0c;…...

spark Core-RDD转换算子

1. map算子&#xff1a;对RDD中的数据逐条进行映射转换&#xff0c;可实现类型或值的转换。函数签名为 def map[U: ClassTag](f: T > U): RDD[U] 。 2. mapPartitions算子&#xff1a;以分区为单位处理数据&#xff0c;可进行任意处理。与 map 相比&#xff0c; map 是分区内…...

【图像处理】C++实现通用Raw图转Unpack14的高效方法

一、需求背景 在图像处理领域&#xff0c;我们经常需要处理各种位深的原始数据&#xff08;如Raw8、Unpack10等&#xff09;。某些高端相机或传感器会输出14位精度的图像数据&#xff0c;但受传输限制&#xff0c;实际存储时可能采用低位深打包。本文将实现一个通用转换函数&a…...

Vue3的Composition API与React Hooks有什么异同?

Vue3的一个重大更新点就是支持Composition API&#xff0c;而且也被业界称为hooks&#xff0c;那么Vue3的“Hooks”与React的Hooks有这么区别呢&#xff1f; 一、核心相似点 1. 逻辑复用与代码组织 都解决了传统类组件或选项式 API 中逻辑分散的问题&#xff0c;允许将相关逻…...

Gerrit的安装与使用说明(Ubuntu)

#本页面按192.168.60.148服务器举例进行安装配置 1.权限配置 ## 使用root或者有sudo权限用户执行 # 创建gerrit用户 sudo useradd gerrit # 设置gerrit用户的密码 sudo passwd gerrit # 增加sudo权限 sudo visudo 在root ALL(ALL:ALL) ALL行下添加如下内容 gerrit ALL(ALL:…...

如何在Git历史中抹掉中文信息并翻译成英文

如何在Git历史中抹掉中文信息并翻译成英文 在软件开发和版本控制领域&#xff0c;维护一个清晰、一致的代码历史记录是至关重要的。然而&#xff0c;有时我们可能会遇到需要修改历史提交的情况&#xff0c;比如删除敏感信息或修正错误。本文将详细探讨如何在Git历史中抹掉中文…...

Ubuntu利用docker将ONNX模型转换为RK3588模型

1.安装docker 下载教程 1.拉取镜像 方法一&#xff1a;通过命令拉取 # 下载官方Docker镜像sudo docker pull registry.cn-hangzhou.aliyuncs.com/rockchip/rknn-toolkit2:v2.3.0 方法二&#xff1a;通过rknn-toolkit2自带的直接安装 2.开始工作 创建工作目录并复制ONNX模型…...

Go:入门

文章目录 Hello, World命令行参数找出重复行GIF动画获取一个URL并发获取多个URL一个 Web 服务器其他 Hello, World Hello world package main import "fmt" func main() {fmt.Println("Hello, 世界") }package main表明这是一个可独立执行的程序包&#…...

深入理解 ResponseBodyAdvice 及其应用

ResponseBodyAdvice 是 Spring MVC 提供的一个强大接口&#xff0c;允许你在响应体被写入 HTTP 响应之前对其进行全局处理。 下面我将全面介绍它的工作原理、使用场景和最佳实践。 基本概念 接口定义 public interface ResponseBodyAdvice<T> {boolean supports(Metho…...

SpringBoot对接火山引擎大模型api实现图片识别与分析

文章目录 一、前言二、创建应用三、后端1.SDK集成2.调用Rest API 四、前端 一、前言 Spring AI实战初体验——实现可切换模型AI聊天助手-CSDN博客 如上&#xff0c;在上一篇博客&#xff0c;我们已经实现了spring ai对接本地大模型实现了聊天机器人&#xff0c;但是目前有个新…...

Java ---成员,局部变量与就近原则

成员变量 声明在类内部&#xff0c;但在方法、构造器或代码块之外的变量。 属于类的实例&#xff08;对象&#xff09;或类本身&#xff08;静态变量&#xff09;。 实例变量&#xff08;非静态成员变量&#xff09;&#xff1a; public class Person {private String name…...

基于libevent写一个服务器(附带源码)

使用libevent搭建服务器 服务器源码二级目录 使用开源框架&#xff0c;目的是减少程序员对一些精细的操作的误操作&#xff0c;也是为了让程序员能更好的对接业务而不是底层api的使用。 为何使用libevent&#xff0c;因为libevent开源已经有十几年了&#xff0c;能很好的承受数…...

2.2.3 Spark Standalone集群

搭建Spark Standalone集群需要完成多个步骤。首先&#xff0c;配置主机名、IP地址映射、关闭防火墙和SeLinux&#xff0c;并设置免密登录。接着&#xff0c;配置JDK和Hadoop环境&#xff0c;并在所有节点上分发配置。然后&#xff0c;下载并安装Spark&#xff0c;配置环境变量和…...

每天记录一道Java面试题---day38

说说类加载器双亲委派模型 回答重点 AppClassLoader的父加载器是ExtClassLoader&#xff0c;ExtClassLoader的父加载器是BootStrapClassLoader。JVM在加载一个类时&#xff0c;会调用AppClassLoader的laodClass方法来加载这个类&#xff0c;不过在这个方法中&#xff0c;会先…...

[ctfshow web入门] web33

信息收集 相较于上一题&#xff0c;这题多了双引号的过滤。我猜测这一题的主要目的可能是为了不让使用$_GET[a]之类的语句&#xff0c;但是$_GET[a]也是一样的 没有括号可以使用include&#xff0c;没有引号可以使用$_GET 可以参考[ctfshow web入门] web32&#xff0c;其中的所…...

【时时三省】(C语言基础)用switch语句实现多分支选择结构

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 if语句只有两个分支可供选择&#xff0c;而实际问题中常常需要用到多分支的选择。例如&#xff0c;学生成绩分类(85分以上为A等&#xff0c;70 ~ 84分为B等&#xff0c;60 ~ 69分为C等)&…...

为您的 Web 应用选择最佳文档阅读器

为显示选择合适的文档查看器是开发 Web 应用过程中至关重要的一步。文档查看器应能在提供功能性的同时&#xff0c;确保用户体验的流畅性。 开发人员必须评估多种因素&#xff0c;以确保效率、性能和兼容性。本文将帮助您了解影响用户文档浏览体验成功与否的关键指标。 渲染质…...

js逆向入门图灵爬虫练习平台第六题

地址&#xff1a;aHR0cHM6Ly9zdHUudHVsaW5ncHl0b24uY24vcHJvYmxlbS1kZXRhaWwvNi8 观察可以发现请求头有有字段加密和响应结果加密 查看启动器 开始断点调试 直接复制里面的js内容&#xff0c;测试函数...

招商蛇口 | 回归生活本身,革新CID的143㎡改善标准

时光流转&#xff0c;城市向前。在西安这片千年文脉的沃土之上&#xff0c;招商蛇口已深耕11载&#xff0c;用21座标杆作品&#xff0c;为17000余户家庭筑就理想栖居。从曲江到高新&#xff0c;从城市更新到人居焕新&#xff0c;每一座作品都是对“美好生活承载者”使命的践行。…...

第6课:分布式多智能体系统架构

分布式多智能体系统架构&#xff1a;从算力协同到微服务部署的工程化实践 一、引言&#xff1a;当智能体规模突破百级&#xff1a;分布式架构为何成为必选项&#xff1f; 在多智能体系统&#xff08;MAS&#xff09;从“实验室Demo”走向“工业级应用”的过程中&#xff0c;传…...