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

C++新经典 | C语言

目录

一、基础之查漏补缺

1.float精度问题

2.字符型数据

3.变量初值问题

4.赋值&初始化

5.头文件之<> VS " "

6.逻辑运算

7.数组

7.1 二维数组初始化

7.2 字符数组

8.字符串处理函数

8.1 strcat

8.2 strcpy

8.3 strcmp

8.4 strlen

9.函数

9.1 形参

9.2 全局变量

9.3 变量存储方式

(1)存储空间

(2)动态存储区中存储哪些数据呢?

(3)静态存储区中存储哪些数据呢?

9.4 static关键字用法

10. 编译预处理

10.1 编译

10.2 预处理

10.3 宏 VS 函数

11.结构体&共用体

11.1 结构体

11.2 共用体

12.位运算

12.1 位运算的应用

13.文件

13.1 文件分类

13.2 文本文件的几个特点

13.3 文本文件缺点

13.4 fopen函数

13.4 fputc & fgetc函数

13.5 feof函数

13.6 \r\n

二、调试技巧

 1.内存查看


一、基础之查漏补缺

1.float精度问题

         当把一个十进制数值赋给一个实型变量时,计算机会把该十进制数转换成二进制数保存,当程序执行流程停在断点上,用鼠标查看该变量值时,计算机实际上是把它保存的二进制数再转换成十进制数显示出来,这个步骤——“十进制→二进制,二进制→十进制”中,存在着一些除法运算,这些除法运算因无法整除的原因,会导致从二进制转换回十进制数时丢失精度。

2.字符型数据

        将一个字符常量放到一个字符变量中,实际上并不是把字符本身放到字符变量所属的内存中,而是把字符对应的ASCII码(一个数字)存放到内存中。

        什么是ASCII码?通俗地说,就是范围处于0~127之间的一个整数(数字)。例如,字符a对应的数字是97,b对应的数字是98。

        既然在内存中,字符数据是以ASCII码存储,说明字符型数据的存储形式和整数的存储形式类似。所以,在C语言中,字符型数据和整型数据之间可以互通使用,一个字符数据既可以以字符形式输出,又可以以整数形式输出,以字符形式输出时,计算机会先将内存中的ASCII码转换成相应的字符,然后输出。

        字符'a'在内存中占1字节,而"a"在内存中占2字节。"a"的最后一个字符为'\0',这是一个转义字符,也就是说,"a"其实是由两个字符构成,但是'\0'如果出现在printf中进行输出,却并不会输出出来,而是作为字符串结束标记来标记这个字符串内容结束。

        在写一个字符串常量时,不要手工去增加'\0',这是画蛇添足,'\0'是系统增加的。

3.变量初值问题

        C语言中,定义变量时,不赋初值的变量中所保存的值是不确定的,所以,不赋初值的变量,不应该拿来参与运算。

        对比C#,规则就不一样了。在C#中,变量的默认值是由其类型决定的。对于整型变量(如int),如果只是声明了它而没有给它赋值,那么它的默认值会自动设为0。

4.赋值&初始化

       下面这行代码不是赋值语句,称为定义时初始化(定义时给初值)语句更为合适,因为这行代码最前面有一个类型标识符char(赋值语句是不可以以类型名作为语句开头的):

int a = 10;

5.头文件之<> VS " "

        用尖括号<>括起来的头文件被#include时,表示让Visual Studio去系统目录中寻找.h文件,所以一些系统提供的标准头文件如stdio.h、stdlib.h等在#include时都应该使用尖括号<>括起来。

        而用双引号" "包含起来的头文件被#include时,Visual Studio会优先在当前源代码文件所在的目录下寻找,如果找不到,再到系统目录中寻找,所以,通常开发者自己写的一些头文件,在被#include包含进来时,往往使用双引号""包含起来。

6.逻辑运算

        很多逻辑表达式只需要计算其中的一部分内容,就可以得到整个逻辑表达式的值,这种逻辑表达式的求值特性,也称为逻辑表达式的“短路求值”特性(只要最终的结果已经可以确定是真或假,求值过程便宣告终止)。

7.数组

7.1 二维数组初始化

        C语言二维数组定义得一般格式:类型说明 数组名[常量表达式][常量表达式],eg:

int a[3][4];  //不能把两个中括号写成一个,a[3,4]是错误的写法

C#中二维数组的声明和初始化:
int[,] array = new int[3, 4] {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9,10,11,12}
};

7.2 字符数组

        字符数组中不但能保存字符,还能保存字符串。只要用字符串来初始化字符数组(推荐),系统就会自动在字符串末尾加一个'\0'。

char str[6] = "Hello"

        所以如果要使用给字符数组中每个元素分别赋值的方式(不过这种写法很罕见,不推荐每个元素分别赋值的方式)对字符数组进行初始化,建议和字符串保持一致,也就是人为地增加一个'\0',这样做主要是为了确定字符串的实际长度(因为字符串实际长度是靠找到末尾的'\0'来确定的)。

8.字符串处理函数

8.1 strcat

        strcat(字符数组1,字符数组2);

        连接两个字符数组中的字符串,把字符数组2的内容连接到字符数组1后边,结果存放在字符数组1中。

  • 字符数组1必须足够大,能够容纳连接后的新字符串。
  • 连接之前两个字符串后面都有一个\'0',连接时将字符串1末尾的\'0'删除并开始连接字符串2的内容,连接后只在新字符串的末尾保留一个'\0'。
  • 连接后str2内容不发生任何变化,换句话说,strcat对str2没有任何影响。

8.2 strcpy

        strcpy(字符数组1,字符串2);

        将字符串2复制到字符数组1中。字符数组1中的内容将被覆盖。

  • 字符数组1必须足够大,以便能容纳下被复制的字符串,也就是说,字符数组1的容量不能小于字符串2的长度(不要忘记字符串2末尾还有个'\0'也要占一个位置)。
  • 字符数组1必须是一个数组名,而字符串2可以是一个数组名,也可以是一个字符串常量。
  • 复制的时候连同字符串末尾的'\0'也一起复制到字符数组中。
  • 不能用赋值语句将一个字符串常量或者字符数组名直接赋给一个字符数组(字符数组名),必须得用strcpy函数。赋值语句只能将一个字符赋给一个字符型变量或数组元素
  • 复制后str2内容不发生任何变化,str1中虽然有两个\'0',但是当输出该字符串内容时,只输出到第一个'\0'之前。

8.3 strcmp

        strcmp(字符串1,字符串2);

        比较字符串1和字符串2中的内容,这也是一个比较常用的函数:

  • 如果字符串1=字符串2,则函数返回0。
  • 如果字符串1>字符串2,则函数返回一个正整数。
  • 如果字符串1<字符串2,则函数返回一个负整数。

        比较规则:对两个字符串自左至右逐个字符比较(按ASCII码值大小比较),一直到出现不同的字符或者遇到'\0'为止,若全部字符相同,认为相等,若出现不相同的字符,则以第一个不相同的字符比较结果为准。

        一般来说,strcmp常用于比较两个字符串是否相等,而比较大小则用的比较少,因为比较大小一般来说意思不大。

8.4 strlen

        strlen(字符数组);

        得到字符串长度,本函数执行的结果值为字符串的实际长度,但不包括字符串结束标记'\0'。

9.函数

        系统会给函数调用分配一些内存来保存一些信息(局部变量、函数参数、函数调用关系等)

9.1 形参

(1)调用函数时,会为函数的形参分配内存,函数调用结束后,形参的内存会被释放,所以形参只能在函数内部使用。

(2)形参数组大小可以不指定,即便指定了也可以与实参数组大小不一致,因为C编译器对形参数组大小不做检查,只是将实参数组的首地址传递给形参数组,甚至可以定义形参数组大小比实参数组大,但超过实参数组大小的部分内存不要去引用,否则会导致程序立即或者不定时崩溃。

(3)可以用多维数组名作为形参和实参。形参数组在定义时,可以指定每一维的大小,也可以省略第一维的大小,但不能省略第二维的大小。请记住一点:实参是多少行多少列,形参就尽量跟实参一样(也是这些行这些列),这样实参能引用的下标形参一样能引用,就会保证写的代码不出错误。

(4) 形参是局部变量。

9.2 全局变量

        从变量的作用域角度来划分,可分为局部变量和全局变量。

(1)全局变量的优缺点:

*优点:

        增加了函数与函数之间数据联系的渠道。如果一个函数中改变了全局变量的值,就能影响到其他使用到该全局变量的函数,相当于在各个函数之间有了直接的传递数据的通道,不需要再通过实参、形参来传递数据了。因为C语言中函数只能返回一个值(无法一次返回多个值),所以如果使用了全局变量,也就相当于能够从函数中返回多个值了。

*缺点:

  • 只在必要的时候才使用全局变量(谨慎使用),因为全局变量在程序整个执行期间一直占用着内存,而不像函数内的局部变量,当函数执行完毕后,这些局部变量所占的内存会被系统释放(回收)。
  • 降低了函数通用性,因为函数执行时可能要依赖这些全局变量,如果将函数迁移到另一个源程序文件中时,与该函数相关的全局变量也需要考虑迁移问题,并且如果迁移到的目标源程序文件中也有同名的全局变量,就比较麻烦。
  • 到处是全局变量,降低了程序的清晰性和可读性。读程序的人难以清楚地判断每个瞬间每个全局变量的值(因为很多函数都能改变该全局变量的值)。

(2)如果某个函数想引用在它后面定义的全局变量,可以使用关键字extern做一个“外部变量说明”,表示该变量在函数的外部定义,这样在函数内就能使用,否则编译就会出错,但有一点要注意,全局变量在定义的时候是可以给初值的,但是在做外部变量说明时,是不可以给变量初值的。

int main()
{extern int value;std::cout << "value:" << value << std::endl;
}int value = 20;

(3)在同一个源文件中,如果全局变量和局部变量同名,则在局部变量作用范围(作用域)内,全局变量不起作用,如果给局部变量赋值,当然也不会影响全局变量的值。

(4) 如果在一个源程序文件中定义的全局变量想在该项目的其他源程序文件中使用,则只需要在其他的源程序文件中使用上面介绍的extern关键字做外部变量说明,就可以在其他源程序文件中使用该全局变量了。

        一般来说,一个全局变量的作用域是从它定义的点到整个源程序文件结束,但是,通过使用extern,将它的作用域扩大到了有extern说明的其他源程序文件。如果再有更多的源程序文件中要引用这个全局变量,也要在这些源程序文件的开头用extern来说明这个全局变量为外部全局变量。

        希望某些全局变量,只能在本源程序文件中被使用,不想被其他源程序文件进行跨文件引用,那也很简单,在定义这个全局变量时在最前面加上static关键字。

9.3 变量存储方式

        如果从变量存在的时间(生存期)角度来划分,变量可以划分为“静态存储变量”和“动态存储变量”,从而就引出了“静态存储方式”和“动态存储方式”。

  • 静态存储方式:在程序运行期间分配固定的存储空间的方式。
  • 动态存储方式:在程序运行期间根据需要进行动态的分配存储空间的方式。

(1)存储空间

        存储空间分成三个主要部分:程序代码区、静态存储区和动态存储区。程序执行所需的数据就放在静态存储区和动态存储区中,存储区就理解成内存。

(2)动态存储区中存储哪些数据呢?

  • 函数形参,前面说过,函数形参被看作局部变量。
  • 局部变量,如函数内定义的一些变量。
  • 函数调用时调用现场的一些数据和返回地址等。

        一般来说,这些数据在函数调用开始时分配存储空间,函数调用完毕后这些空间就被释放掉了(也称为回收)。这种分配和释放就认为是动态的,如果两次调用同一个函数,分配给此函数的局部变量的存储空间地址可能是不同的。

(3)静态存储区中存储哪些数据呢?

        全局变量(包括全局静态变量,在函数的外部定义的)放在静态存储区中,程序开始执行时给全局变量分配存储区,程序执行完毕后释放这些存储区。在程序执行过程中它们占据固定的存储单元,而不是动态地分配和释放。

        有时希望函数中局部变量的值在函数调用结束后不消失(不被系统自动释放)而保留原值,也就是说,它占用的存储单元不释放,在下一次调用该函数时,该变量中保存的值就是上一次该函数调用结束时的值,这是可以做到的,只需指定该局部变量为“局部静态变量”,用static关键字加以说明即可。局部静态变量:

  •  在静态存储区中分配存储单元,程序整个运行期间都不释放。·
  • 局部静态变量是在编译时赋初值的,只赋初值一次,在程序运行的时候它已经有了初值,以后每次调用函数时不再重新赋初值,只是保留上次函数调用结束时的值,而普通变量的定义和赋值是在函数调用时才进行的。
  • 定义局部静态变量时如果不赋初值,则编译时自动给其赋初值0,而常规变量,如果不赋初值,则它是一个不确定的值。
  • 虽然局部静态变量在函数调用结束后仍然存在,但在其他函数中是不能引用的。
  • 局部静态变量长期占用内存,降低了程序可读性(当多次调用该函数时往往弄不清当前该静态变量的值是多少)。

        所以得到一个结论:如非必要,不要过多使用局部静态变量。

9.4 static关键字用法

(1)函数内部在定义一个局部变量时,在前面使用static关键字,则该变量会保存在静态存储区,在编译的时候被初始化,如果不给初始值,它的值会被初始化为0,并且,下次调用该函数时该变量保持上次离开该函数时的值。

(2)在定义全局变量时前面使用static关键字,那么该全局变量只能在本文件中使用,无法在其他文件中被引用(使用)。

(3)在函数定义之前增加static,那么该函数只能在本源程序文件中调用,无法在其他源程序文件中调用。

10. 编译预处理

        一个项目,由一个或者多个源程序文件组成,可以通过编译、链接(Visual Studio负责做这件事)最终生成一个可执行文件。

10.1 编译

        编译,是以一个一个的源程序文件(.cpp文件)为单位进行的,每个源程序文件都会编译成一个目标文件(目标文件扩展名可能是.o也可能是.obj等,这与操作系统类型有关),如果源程序文件有多个,则会编译生成多个目标文件,然后将这些目标文件进行链接,最终生成一个可执行文件。

        一般来说,编译阶段会做如下几件事:

  • 预处理。
  • 编译。包括词法分析、语法分析、目标代码生成、优化等。
  • 汇编。产生.o(.obj)目标文件。

10.2 预处理

        C语言一般提供三种预处理功能:宏定义、文件包含、条件编译。这三种预处理功能也是通过在源程序文件写入代码来实现的,只不过这些代码比较特殊,都是以“#”开头。

        宏定义其实并不是C语言语句(虽然有时候会称其为语句),不必在行末加分号,如果加分号则连分号一起被替换了。

10.3 宏 VS 函数

  • 用宏的次数如果增多,源程序代码就会增多,但函数调用不会使源程序代码增多
  • 宏展开只占用编译时间,不占用运行时间,而函数调用占用运行时间(分配内存、传递参数、执行函数体、返回值等)

11.结构体&共用体

11.1 结构体

        在 C 语言中,声明结构体变量时必须包含"struct"关键字(除非用typedef创建了新类型),而在 C++ 中则不必。

struct Person {char name[50];int age;
};struct Person person;
strcpy(person.name, "Alice");
person.age = 20;

11.2 共用体

        结构体占用的内存大小是各个成员占的内存大小之和,每个成员分别占用一段不同的内存。共用体因为成员占用同一段内存,所以占用的内存大小等于占用内存最大的成员所占的内存大小,而不是每个成员所占内存大小之和。

        共用体变量地址和其成员的地址都相同。共用体变量名也代表共用体变量的首地址,这一点与数组名代表数组首地址的说法类似。

        共用体变量不能在定义的时候给所有成员都进行初始化,但是在定义的时候初始化第一个成员是允许的。

12.位运算

        1字节由8个二进制位组成,最左边的位称为最高位,最右边的位称为最低位,每个二进制位的值是0或者1(二进制数,只有0和1两个数字,不能是其他数字)。

        1字节能表示的数字范围,如果用二进制数来表示,能表示的最大二进制数是11111111(十进制数255),最小二进制数是00000000(就是0)。1字节能表示8个二进制位,4字节呢?显然,能表示32个二进制位。等号左侧是二进制数(32个二进制位),等号右侧是十进制数:

11111111,11111111,11111111,11111111=4294967295

        所以,十进制数的4294967295就是unsignedint类型能够表示的最大数字。

12.1 位运算的应用

        如果某个数字的某些二进制位想翻转(从0变成1,从1变成0),那这个位可以和1做异或运算,如果某些二进制位想保持不变,那这个位可以和0做异或运算。

        左移运算符“<<”将一个数的二进制位左移若干位,右侧补0,每左移一位都相当于把原来的数字乘以2。

        右移运算符“>>”将一个数的二进制位右移若干位,超出最低位的被舍弃,左侧高位补0,每右移一位都相当于除以2。

13.文件

13.1 文件分类

        根据数据组织形式,把文件分为两种:文本文件(ASCII文件)与二进制文件。

  • 文本文件:也称为ASCII文件,文件中的每个字节存放一个ASCII码,代表一个字符,这种文件在打开后能够直接看懂其中的内容。
  • 二进制文件:把内存中的数据按照其在内存中的存储形式原样输出到磁盘上存放。这种文件中一般会有很多不可见字符,打开后看到的可能是一堆乱码。

13.2 文本文件的几个特点

  • 文本文件中,每字节存放一个ASCII码,代表一个字符。
  • 文本文件中的内容人类能够看懂。
  • 一个整数10000,按照文本文件格式保存,通过观察图12.5,是占5字节。

13.3 文本文件缺点

  • 众所周知,10000是一个整型数,在计算机中该数字用short int保存就足矣,short int只占2字节,但是在文本文件中保存却需要5字节,所以这种保存形式占用的存储空间比较大。
  • 当双击一个文本文件时,或者用二进制编辑器打开文本文件时,系统都显示出来了人类能够读懂的文本内容。(前面谈过,文本文件或者二进制文件是对于人类来说的,而对于计算机,并不区分是什么类型的文件,保存的都是二进制数据)所以,当用文本形式打开文件时,系统会多做一个工作,就是把二进制数据转换成人类能看懂的ASCII码数据。

13.4 fopen函数

        文件在进行读或者写之前,必须要先打开,在读或者写结束之后,必须要关闭,否则会造成资源泄漏或读写失败。文件的打开要调用fopen函数。

   FILE* fp = fopen("", "r");

        FILE结构体:每次用fopen函数打开一个文件,系统都会开辟出一块内存,这块内存大小是sizeof(FILE),这块内存用来存放和文件相关的信息,诸如文件名、文件使用方式、当前文件位置等。通过调用fopen函数,可以告诉系统三个信息:(1)需要打开的文件名。(2)文件使用方式,如是读还是写。(3)让哪个指针变量指向被打开的文件。

        每个打开的文件都有一个当前位置指针,其实就是保存在FILE结构里的一个char*型的字符指针(不同版本编译器可能细节不同,但道理都相同)。这个位置指针的用途就是代表当前从文件的哪个位置开始读/写数据,对于读来讲,每读出1字节数据,这个位置指针会自动往后移动1字节,以指向下一字节,这样,下次再读时自然就从下一字节开始。

13.4 fputc & fgetc函数

        fputc函数用于把一个字符写到磁盘文件。fgetc函数用于从指定文件读入一个字符。这两个函数如果执行失败或者整个文件读到末尾,则返回EOF。

        EOF是EndOfFile(文件末尾)的缩写,是系统提供的一个宏定义,代表-1。可用EOF(-1)来判断读入的内容是否到达文件结束。但一旦该文件中真存在一个值为-1的字符(该字符的十六进制是FF,用fgetc读入进来就是-1),那么,用EOF这种判断方式来判断是否读到文件结束,就会出现错误,所以需要换一种范例写法,引入feof函数。

13.5 feof函数

        用来判断文件是否结束(文件当前位置指针是否指向文件末尾)。如果文件结束,则返回1;如果文件没结束,则返回0。

while(!feof(fp))
{//...
}

        不管使用fopen函数时是以什么样的文件使用方式打开文件(例如用r还是用rb都没关系),feof函数都能够正确地判断文件是否结束。

13.6 \r\n

        在Windows环境下,每个文本行的末尾都有两个二进制数——“0D 0A”,通过查询完整的ASCII码表,不难发现,0D代表回车符,0A代表换行符。即:文本文件的每一行通常都以 \r\n 结束。然而,当使用 fgets() 读取文件时,它只会把 \n 作为行结束符,并且也会被存储到缓冲区中。

        在Windows平台,如果打开文件是用于读,则不带"b"标记可能会使读出的字符有所缺失,如可能缺失了'\r'。如果打开文件是用于写,则不带"b"标记可能会将一些额外的字符写入文件(本来只想写入'\n',实际写入的却是'\r'和'\n')。所以,如果希望把看到的内容原封不动地写入文件中,请在fopen函数的文件使用方式参数中增加"b"标记来辅助;如果希望把文件中的内容原封不动地读出来,请在fopen函数的文件使用方式参数中增加"b"标记来辅助。

二、调试技巧

 1.内存查看

        在断点调试时,选择“调试”→“窗口”→“内存”→“内存1”命令,就打开了“内存”查看窗口,只需要在其中输入内存地址,就可以看该地址所对应的内存中内容。

        双击aaa变量名,直接按住鼠标左键往左上角“地址”右侧的编辑框中拖动,此时,变量aaa所代表的内存地址中的内容便显示到“内存”查看窗口中。

         “内存”查看窗口中,左上角的“地址”部分显示的0x0039FA8C是数组aaa所代表的内存地址。往下看,分成三部分:

  • 左侧部分显示的内存地址,是aaa的地址和紧邻的内存地址;
  • 中间部分显示的是内存地址中保存的十六进制数字内容(内存中保存的数据都是二进制数据,但为了方便观察,Visual Studio把这些二进制数据以十六进制形式显示出来,四位二进制数字显示成一位十六进制数字);
  • 右侧部分显示的是内存中的十六进制数字所代表的一些可显示字符,从中可以找到"123456789a"字样,通过逐个字符比较,可以看到,'\0'这个转义字符在内存中显示的十六进制数字是00,其他的字符,'a'字符在内存中显示的十六进制数字是61,十六进制数字61正好对应十进制数字97,而十进制数字97正好就是字符'a'的ASCII码,所以在内存中存放一个字符时,存放的其实就是该字符的ASCII码。

相关文章:

C++新经典 | C语言

目录 一、基础之查漏补缺 1.float精度问题 2.字符型数据 3.变量初值问题 4.赋值&初始化 5.头文件之<> VS " " 6.逻辑运算 7.数组 7.1 二维数组初始化 7.2 字符数组 8.字符串处理函数 8.1 strcat 8.2 strcpy 8.3 strcmp 8.4 strlen 9.函数 …...

物联网智慧种植农业大棚系统

一、项目背景 智慧农业是是将物联网技术和农业生产箱管理的新型农业&#xff0c;依托部署在农业生产现场的各种传感节点&#xff0c;以物联网网关为通道形成数据传输网络&#xff0c;可以实现控制柜、环境监测传感器、气象监测机器等设备的远程监控&#xff0c;达到及时高校的…...

TabBar组件如何跳转页面?

1、先引入 2、假数据 const tabs [{key: home,title: 首页,icon: <AppOutline />,badge: Badge.dot,},{key: todo,title: 待办,icon: <UnorderedListOutline />,badge: 5,},{key: message,title: 消息,icon: (active: boolean) >active ? <MessageFill /&…...

Vue.js中,router和route

<div class"search">{{$route.params.things}}<van-nav-bar fixed title"商品列表" left-arrow click-left"$router.go(-1)" /><van-searchreadonlyshape"round"background"#ffffff"value"手机"sh…...

【微服务】07-缓存

文章目录 为不同的场景设计合适的缓存策略1. 缓存是什么2. 缓存的场景3. 缓存的策略4. 缓存位置5. 缓存实现的要点6. 注意问题7. 使用的组件8. 内存缓存和分布式缓存区别 总结 为不同的场景设计合适的缓存策略 1. 缓存是什么 缓存是计算结果的“临时”存储和重复使用缓存本质…...

权限校验中的“双token”方案

1. 双Token中的两个token分别是什么&#xff1f; 1.1 access_token 1.2 fresh_token 2. 为什么需要双token&#xff1f;一个token不行吗&#xff1f; 答&#xff1a; 两个token的职责不同。其中&#xff0c;access_token是在每次请求的时候携带给后端进行权限校验&#xff…...

TensorFlow的基本概念

TensorFlow 是由 Google 开发的开源机器学习框架&#xff0c;其基本概念如下&#xff1a; 1. 张量&#xff08;Tensor&#xff09;&#xff1a;TensorFlow 中最基本的数据结构&#xff0c;是多维数组&#xff0c;可以理解为向量或矩阵的推广。常见的张量有常量张量、变量张量和…...

【卷积神经网络】MNIST 手写体识别

LeNet-5 是经典卷积神经网络之一&#xff0c;1998 年由 Yann LeCun 等人在论文 《Gradient-Based Learning Applied to Document Recognition》中提出。LeNet-5 网络使用了卷积层、池化层和全连接层&#xff0c;实现可以应用于手写体识别的卷积神经网络。TensorFlow 内置了 MNI…...

Ansible学习笔记2

Ansible是Python开发的自动化运维工具&#xff0c;集合了众多运维工具&#xff08;Puppet、cfengine、chef、func、fabric&#xff09;的优点&#xff0c;实现了批量系统配置&#xff0c;批量程序部署、批量运行命令等功能。 特点&#xff1a; 1&#xff09;部署简单&#xff…...

80. 删除有序数组中的重复项 II

【中等题】 题目&#xff1a; 给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在使用 O(1) 额…...

CVE-2023-36874 Windows错误报告服务本地权限提升漏洞分析

CVE-2023-36874 Windows错误报告服务本地权限提升漏洞分析 漏洞简介 Windows错误报告服务在提交错误报告前会创建wermgr.exe进程&#xff0c;而攻击者使用特殊手法欺骗系统创建伪造的wermgr.exe进程&#xff0c;从而以system权限执行代码。 影响版本 Windows10 1507 * Wind…...

IDEA遇到 git pull 冲突的几种解决方法

1 忽略本地修改&#xff0c;强制拉取远程到本地 主要是项目中的文档目录&#xff0c;看的时候可能多了些标注&#xff0c;现在远程文档更新&#xff0c;本地的版本已无用&#xff0c;可以强拉 git fetch --all git reset --hard origin/dev git pull关于commit和pull的先后顺…...

[Unity]UI和美术出图效果不一致

问题描述&#xff1a;美术使用PS在Gamma空间下设计的UI图&#xff0c;导入到Unity&#xff0c;因为Unity使用的是线性空间&#xff0c;导致半透明的UI效果和美术设计的不一致。 解决方案&#xff1a; &#xff08;一&#xff09;让美术在线性空间下工作 &#xff08;二&…...

SpringBoot整合JPA和Hibernate框架

Springboot整合JPAHibernate框架【待完成】 随着MybatisPlus技术的发展&#xff0c;JPA和Hibernate技术已经逐步淘汰 JPA遵循了Hibernate框架规则&#xff0c;目前使用的不多 1、添加依赖 <!--jpa--> <dependency><groupId>org.springframework.boot</…...

Java中文件的创建(三种方式),文件常用的方法

文件的创建 方式1&#xff1a; new File(String pathName) 根据路径构建一个File对象方式2&#xff1a; new File(File parent,String child) 根据父目录文件子路径构建方式3&#xff1a; new File(String parent,String child) 根据父目录子路径构建 代码&#xff1a; //方…...

Spring boot中调用C/C++(dll)

添加JNA依赖 <dependency><groupId>net.java.dev.jna</groupId><artifactId>jna</artifactId><version>5.5.0</version> </dependency>准备C代码/C代码 如下是C代码&#xff0c;文件名&#xff1a;xizi.c #include <std…...

【Apollo学习笔记】——规划模块TASK之PATH_DECIDER

文章目录 前言PATH_DECIDER功能简介PATH_DECIDER相关配置PATH_DECIDER总体流程路径决策代码流程及框架MakeStaticObstacleDecision PATH_DECIDER相关子函数参考 前言 在Apollo星火计划学习笔记——Apollo路径规划算法原理与实践与【Apollo学习笔记】——Planning模块讲到……S…...

Lua学习(二)

Lua基础学习 7. lua函数8. lua运算符8.1 算数运算符8.2 关系运算符8.3 逻辑运算符8.4 其他运算符 9. lua字符串9.1 字符串格式化9.2 匹配模式 10. lua数组11. lua迭代器11.1 Lua table 12. lua 模块12.1 加载机制12.2 C 包 接着上一篇的内容。Lua学习&#xff08;一&#xff09…...

制作鲜花商城小程序的详细步骤

如果你是一个新手商家&#xff0c;想要进入鲜花团购市场&#xff0c;但是不知道如何制作一个小程序商城&#xff0c;那么这篇文章就是为你准备的。以下是制作鲜花团购小程序商城的详细步骤&#xff1a; 1. 登录乔拓云平台后台&#xff0c;进入商城管理页面 首先&#xff0c;你需…...

Ubuntu20以上高版本如何安装低版本GCC

安装了Ubuntu 20.04之后&#xff0c;通过命令行 sudo apt-get install build-essential安装gcc&#xff0c;再通过命令行 gcc -v可查看gcc版本为gcc13 如果想用低版本的gcc&#xff0c;比如gcc4.8&#xff0c;尝试输入命令 sudo apt-get install gcc-4.8会提示找不到gcc4.8的…...

context.WithCancel()的使用

“ WithCancel可以将一个Context包装为cancelCtx,并提供一个取消函数,调用这个取消函数,可以Cancel对应的Context Go语言context包-cancelCtx[1] 疑问 context.WithCancel()取消机制的理解[2] 父母5s钟后出门&#xff0c;倒计时&#xff0c;父母在时要学习&#xff0c;父母一走…...

vue3中引入百度地图

话不多说直接开干 1.第一种方式 百度地图地址 打开 https://lbsyun.baidu.com/index.php?title%E9%A6%96%E9%A1%B5 然后点进去地图 然后再这个功能里面选择一个地图&#xff0c;然后跳转页面 然后一直下滑 滑到底部 点击这个 跳转到这个页面 然后点击进入demo这个 然后到这个…...

【Linux-Day8- 进程替换和信号】

进程替换和信号 问题引入 我们发现 终端输入的任意命令的父进程都是bash,这是因为Linux系统是用fork()复制出子进程&#xff0c;然后在子进程中调用替换函数进行进程替换&#xff0c;实现相关命令。 &#xff08;1&#xff09; exec 系列替换过程&#xff1a;pcb 使用以前的只…...

日志文件之间关系和介绍及应用

1.常用日志框架代码举例 Log4j: Log4j是Java中广泛使用的日志框架之一。它提供了灵活的配置选项和丰富的功能&#xff0c;支持日志级别、日志输出目标等。Log4j有1.x版本和2.x版本&#xff0c;其中Log4j 2.x是对1.x的升级和扩展。 Logback: Logback是由Log4j创始人设计的Log4…...

mac电脑屏幕录制Berrycast Mac屏幕录制软件

Berrycast是一款为Mac设计的优秀屏幕录制软件&#xff0c;它让屏幕录制变得简单而高效。以下是Berrycast的一些主要特点&#xff1a; 简单的用户界面&#xff1a;Berrycast拥有直观和简洁的用户界面&#xff0c;使得用户可以轻松上手。高质量的视频输出&#xff1a;Berrycast能…...

机器学习笔记之最优化理论与方法(一)最优化问题概述

机器学习笔记之最优化理论与方法——最优化问题概述 引言什么是最优化问题最优化问题的基本形式最优化问题的分类各分类最优化问题的数学表达约束优化VS无约束优化线性规划VS非线性规划连续优化VS离散优化单目标优化VS多目标优化 引言 从本节开始&#xff0c;将对最优化理论与…...

【ES5新特性一】 严格模式语法变化、全局的JSON对象、编码和解码的方法

前言 ECMAScript 和 JavaScript 的关系 一个常见的问题是&#xff0c;ECMAScript 和 JavaScript 到底是什么关系&#xff1f; 要讲清楚这个问题&#xff0c;需要回顾历史。1996 年 11 月&#xff0c;JavaScript 的创造者 Netscape 公司&#xff0c;决定将 JavaScript 提交给标准…...

Java【手撕滑动窗口】LeetCode 3. “无重复字符的最长子串“, 图文详解思路分析 + 代码

文章目录 前言一、长度最小子数组1, 题目2, 思路分析3, 代码 前言 各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你: &#x1f4d5; JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统等 &#x1f4d7; Java数据结构: 顺序表, 链…...

学习哈哈哈哈

# 零、学习计划 * 数据库相关 * 索引 * [我以为我对数据库索引很了解&#xff0c;直到我遇到了阿里面试官 - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/107487215) * [给我一分钟&#xff0c;让你彻底明白MySQL聚簇索引和非聚簇索引 - 知乎 (zhihu.com)](ht…...

05-基础例程5

基础例程5 1、超声波测距 实验介绍 ​ HC-SR04超声波传感器是一款测量距离的传感器。其原理是利用声波在遇到障碍物反射接收结合声波在空气中传播的速度计算的得出。 外观 管脚功能的定义 VCC&#xff1a;供电电源&#xff1b;Trig&#xff1a;触发信号&#xff1b;Echo&a…...

双基证券:预计未来还会有更多政策来吸引增量资金

双基证券表示&#xff0c;8月27日&#xff0c;活泼资本商场五大方针出台&#xff1a;证券交易印花税折半征收&#xff1b;阶段性收紧IPO节奏&#xff1b;上市房企再融资不受破发、破净和亏本限制&#xff1b;标准控股股东与实际操控人减持行为&#xff1b;融资保证金最低份额由…...

前端:html实现页面切换、顶部标签栏,类似于浏览器的顶部标签栏(完整版)

效果 代码 <!DOCTYPE html> <html><head><style>/* 左侧超链接列表 */.link {display: block;padding: 8px;background-color: #f2f2f2;cursor: pointer;}/* 顶部标签栏 */#tabsContainer {width:98%;display: flex;align-items: center;overflow-x: …...

强化自主可控,润开鸿发布基于RISC-V架构的开源鸿蒙终端新品

2023 RISC-V中国峰会于8月23日至25日在北京召开,峰会以“RISC-V生态共建”为主题,结合当下全球新形势,把握全球新时机,呈现RISC-V全球新观点、新趋势。本次大会邀请了RISC-V国际基金会、业界专家、企业代表及社区伙伴等共同探讨RISC-V发展趋势与机遇,吸引超过百余家业界企业、高…...

软件设计师知识点·1

控制器: (1)指令寄存器(IR) : CPU执行一条指令时,从内存储器取到缓冲寄存器中,再送入IR暂存; (2)程序计数器(PC): 将要执行的下一条指令的地址; (3)地址寄存器(IR): 当前CPU所访问的内存单元地址; (4)指令译码器(ID): 对指令中的操作码字段进行分析解释; 多核CPU可以满足用户…...

修改Jupyter Notebook默认打开路径

这里我是重新下载的anaconda&#xff0c;打开Jupyter之后是默认在C盘的一个路径的&#xff0c;现在我们就来修改一下它的一个默认打开路径&#xff0c;这样在我们后续学习过程中&#xff0c;可以将ipynb后缀的文件放在这个目录下就能查看了。 1、先打开Anaconda Prompt&#x…...

经典卷积网络

目录 一、经典神经网络出现的时间线​编辑 二、LeNet 三、AlexNet 四、VGGNet 五、InceptionNet 六、ResNet 总结&#xff1a; 一、经典神经网络出现的时间线 二、LeNet 背景&#xff1a;LeNet由Yann LeCun于1998年提出&#xff0c;卷积网络开篇之作。 解释&#xff1…...

react+koa+vite前后端模拟jwt鉴权过程

路由组件&#xff08;生成token&#xff09; const Router require(koa/router) const jwt require(jsonwebtoken); const router new Router()const mockDbUserInfo [{nickname: xxxliu,username: Tom,password: 123456,icon: url1},{nickname: xxx,username: John,passw…...

VK1616是LED显示控制驱动电路/LED驱动IC、数显驱动芯片、数码管驱动芯片

产品品牌&#xff1a;永嘉微电/VINKA 产品型号&#xff1a;VK1616 封装形式&#xff1a;SOP16 产品年份&#xff1a;新年份 概述&#xff1a;VK1616是一种数码管或点阵LED驱动控制专用芯片&#xff0c;内部集成有3线串行接口、数据锁存器、LED 驱动等电路。SEG脚接LED阳极&a…...

开箱报告,Simulink Toolbox库模块使用指南(五)——S-Fuction模块(C MEX S-Function)

文章目录 前言 C MEX S-Function 算法原理 原始信号创建 编写S函数 仿真验证 Tips 分析和应用 总结 前言 见《开箱报告&#xff0c;Simulink Toolbox库模块使用指南&#xff08;一&#xff09;——powergui模块》 见《开箱报告&#xff0c;Simulink Toolbox库模块使用…...

摄像头的调用和视频识别

CV_tutorial3 摄像头调用实时播放保存视频 运动目标识别帧差法背景减除法 摄像头调用 创建视频捕捉对象&#xff1a;cv2.VideoCapture() 参数为视频设备的索引号&#xff0c;就一个摄像投的话写0默认&#xff1b; 或者是指定要读取视频的路径。 实时播放 import cv2 import …...

多通道分离与合并

目录 1.多通道分离split() 2.多通道合并merge() 3.Android JNI demo 1.多通道分离split() void cv::split ( InputArray m, OutputArrayOfArrays mv &#xff09; m:待分离的多通道图像。 mv:分离后的单通道图像&#xff0c;为向量vector形式。 2.多通道合并merge…...

JOJO的奇妙冒险

JOJO,我不想再做人了。 推荐一部动漫 JOJO的奇妙冒险 荒木飞吕彦创作的漫画 《JOJO的奇妙冒险》是由日本漫画家荒木飞吕彦所著漫画。漫画于1987年至2004年在集英社的少年漫画杂志少年JUMP上连载&#xff08;1987年12号刊-2004年47号刊&#xff09;&#xff0c;2005年后在集英…...

LeetCode56.合并区间

这道题我想了一会儿&#xff0c;实在想不到比较好的算法&#xff0c;只能硬着头皮写了&#xff0c;然后不断的debug&#xff0c;经过我不懈的努力&#xff0c;最后还是AC&#xff0c;不过效率确实低。 我就是按照最直接的方法来&#xff0c;先把intervals数组按照第一个数star…...

【内推码:NTAMW6c】 MAXIEYE智驾科技2024校招启动啦

MAXIEYE智驾科技2024校招启动啦【内推码&#xff1a;NTAMW6c】 【招聘岗位超多&#xff01;&#xff01;公司食堂好吃&#xff01;&#xff01;】 算法类&#xff1a;感知算法工程师、SLAM算法工程师、规划控制算法工程师、目标及控制算法工程师、后处理算法工程师 软件类&a…...

Python框架【模板继承 、继承模板实战、类视图 、类视图的好处 、类视图使用场景、基于调度方法的类视图】(四)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小王&#xff0c;CSDN博客博主,Python小白 &#x1f4d5;系列专栏&#xff1a;python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 &#x1f4e7;如果文章知识点有错误…...

对于前端模块化的理解与总结(很全乎)

目录 模块化的好处 模块化的commonJS导入导出 暴露(导出)模块&#xff1a;module.exports value或exports.xxx value 导入模块——使用 es6模块化 方法一逐个导出 方法二默认导出 方法三 方法四 方法五 export 和import 同时存在 多个文件导出到一个文件后在相关文件…...

NewStarCTF 2022 web方向题解 wp

----------WEEK1---------- BUU NewStarCTF 公开赛赛道 WEEK1 [NotPHP] 先看题目&#xff0c;要传参加绕过。 分析一下代码&#xff1a;首先get一个datadata://test/plain,Wel…。然后key1和2用数组可以绕过。num2077a可以绕过弱类型。eval()中的php语句被#注释了&#xff0c…...

WebGL矩阵变换库

目录 矩阵变换库&#xff1a; Matrix4对象所支持的方法和属性如表所示&#xff1a; 方法属性规范&#xff1a; 虽然平移、旋转、缩放等变换操作都可以用一个44的矩阵表示&#xff0c;但是在写WebGL程序的时候&#xff0c;手动计算每个矩阵很耗费时间。为了简化编程&#xf…...

block层:8. deadline调度器

deadline 源码基于5.10 0. 私有数据 struct deadline_data {/** run time data*//** requests (deadline_rq s) are present on both sort_list and fifo_list*/struct rb_root sort_list[2];struct list_head fifo_list[2];/** next in sort order. read, write or both ar…...

DTO,VO,PO的意义与他们之间的转换

DTO&#xff08;Data Transfer Object&#xff09;&#xff1a;数据传输对象&#xff0c;这个概念来源于J2EE的设计模式&#xff0c;原来的目的是为了EJB的分布式应用提供粗粒度的数据实体&#xff0c;以减少分布式调用的次数&#xff0c;从而提高分布式调用的性能和降低网络负…...