C现代方法(第1、2章)笔记
文章目录
- C现代方法笔记(chapter1&2)
- 序言
- 0.1 C标准
- 0.2 现代方法
- 第1章 C语言概述
- 1.1 C语言的历史
- 1.1.1 起源
- 1.1.2 标准化
- 1.1.3 基于C的语言
- 1.2 C语言的优缺点
- 1.2.1 C语言的优点
- 1.2.2 C语言的缺点
- 1.2.3 高效地使用C语言
- 第2章 C语言基本概念
- 2.1 编写一个简单的C程序
- 2.1.1 编译和链接
- 2.1.2 集成开发环境(IDE)
- 2.2 简单程序的一般形式
- 2.2.1 指令
- 2.2.2 函数
- 2.2.3 语句
- 2.2.4 显示字符串
- 2.3 注释
- 2.4 变量和赋值
- 2.4.1 类型
- 2.4.2 声明
- 2.4.3 赋值
- 2.4.4 显示变量的值
- 2.4.5 初始化
- 2.4.6 显示表达式的值
- 2.5 读入输入
- 2.6 定义常量的名字
- 2.7 标识符
- 2.8 C程序的书写规范
- 问与答
- 总结
C现代方法笔记(chapter1&2)
序言
0.1 C标准
- C标准早期有C89,C99(普及),逐渐演化至C11,C18(最新)。
- 冷知识,C89标准中,标识符只有前6个字符保证有效,而且不一定区分大小写!
- C99要求每个函数都有一个显式的返回类型。
0.2 现代方法
- 正确看待C语言
- 强调C语言的标准版本
- 揭穿神话
- 强调软件工程
- 推迟介绍C语言的底层特性
- 不再强调“手工优化”
第1章 C语言概述
1.1 C语言的历史
1.1.1 起源
- C语言是贝尔实验室开发的,是比汇编语言更加高级的一种语言,是B语言升级版的升级版。
- C语言替代汇编语言重写UNIX系统,改用C语言后程序具有良好的可移植性,只要为贝尔实验室的其它计算机编写C编译器,这些团队就能让UNIX系统也运行在那些机器上。
1.1.2 标准化
- 1983年,美国国家标准协会(ANSI)开始推动C语言标准制定。1990年,ISO通过ANSI的C标准,将其作为国际标准,也就是C89或者C90。1999通过了C99标准。
- C语言最近的两次改变分别发生在2011和2018年,这两年分别通过了C11和C18。
- 从C99到C11再到C18的变化,没有从C89到C99那么显著。尤其是从C11到C18的变化,仅限于技术修饰和澄清,总体上没有显著的改变,也没有引入新的语言特性。
1.1.3 基于C的语言
C语言对现代编程语言有着巨大的影响,许多现代编程语言都借鉴了大量C语言的特性。以下几种非常具有代表性:
- C++,包括了所有C特性,但增加了类和其他特性以支持面向对象编程。
- Java,基于C++,因此也继承了C的许多特性。
- C#,由C++和JAVA发展起来的一种较新的语言。
- Perl,最初是一种非常简单的脚本语言,在发展过程中采用了C的许多特性。
1.2 C语言的优缺点
- C是一种底层语言,C提供了对机器级概念,使得程序可以快速执行。
- C是一种小型语言,C很大程度上依赖一个标准函数的“库”。
- C是一种包容性语言,有着更高的自由度。
1.2.1 C语言的优点
- 高效。
- 可移植性。
- 功能强大。
- 灵活。
- 标准库,C标准库包含了数百个可以用于输入/输出、字符串处理、存储分配以及其他实用操作的函数。
- 与UNIX系统的集成。
1.2.2 C语言的缺点
- C程序更容易隐藏错误。
- C程序可能会难以理解。
- C程序可能会难以修改。
1.2.3 高效地使用C语言
- 学习如何规避C语言的缺陷。现代编译器可以检查到常见的缺陷并且发出警告,但是没有一个编译器可以发现全部缺陷。
- 使用软件工具使程序更加可靠。比如静态编译工具。
- 利用现有的代码库。
- 采用一套切合实际的编码规范。
- 避免“投机取巧”和极度复杂的代码。要遵守简洁但仍然易于理解的编码风格。
- 紧贴标准。为了程序的可移植性,最好避免使用标准中没有的特性和库函数。
第2章 C语言基本概念
本章介绍了C语言的一些基本概念,包括预处理指令,函数,变量和语句。
2.1 编写一个简单的C程序
/*
显示双关语“To C, or not to C: that is the question.”
*/
//pun.c
#include <stdio.h>int main(void){printf("To C, or not to C: that is the question.\n");return 0;
}
接下来对这段代码做简要介绍:
第一行#include <stdio.h>
是必不可少的,它包含了C语言标准输入/输出库的相关信息,程序的可执行代码都在main
函数中,这个函数代表“主”程序。main
函数中的第一行代码是用来显示期望信息的。printf
函数来自标准输入/输出库,可以产生完美的格式化输出。代码\n
告诉printf
函数执行完消息显示后要进行换行操作。第二行代码return 0;
表明程序终止时会向操作系统返回值0
。
2.1.1 编译和链接
为了把程序转换为机器可以执行的形式,通常包括下面3个步骤:
- 预处理。首先程序会被交给
预处理器(preprocessor)
。预处理器执行以#
开头的命令(指令)。 - 编译。修改后的程序现在可以进入
编译器(compiler)
了。编译器会把程序翻译成机器指令(目标代码),此时的程序还是不可以运行的。 - 链接。
链接器(linker)
把由编译器产生的目标代码和所需的其他附加代码整合在一起,生成完全可执行的程序。这些附加代码包括程序中用到的库函数(如printf
函数)。
- 以上过程往往是自动实现的,因此人们会发现这项工作不是太艰巨,通常预处理器和编译器集成在一起,所以人们甚至可能不会注意它在工作。
GCC,作为最流行的C编译器之一,它随Linux发行,但也有面向其他很多平台的版本。这种编译器的使用与传统的UNIX cc编译器类似。编译程序pun.c可以使用以下命令:
gcc -o pun pun.c
2.1.2 集成开发环境(IDE)
集成开发环境是一个软件包,我们可以在其中编辑、编译、链接、执行甚至调试程序。
2.2 简单程序的一般形式
简单C程序一般具有如下形式:
指令int main(void){语句
}
即使是最简单的C程序也依赖3个关键的语言特性:指令(在编译前修改程序的编辑命令)、函数(被命名的可执行代码块,如main
函数)和语句(程序运行时执行的命令)。
2.2.1 指令
- 比如
#include <stdio.h>
这条指令说明,在编译前把<stdio.h>
中的信息“包含”到程序中。C语言拥有大量类似于<stdio.h>
的头(header),每个头都包含一些标准库的内容。C语言不同于其他的编程语言,它没有内置的“读”和“写”命令。输入/输出功能由标准库中的函数实现。 - 所有指令都是以字符
#
开始的。这个字符可以把C程序中的指令和其他代码区分开来。指令默认只占一行,每条指令的结尾没有分号或其他特殊标记。
2.2.2 函数
事实上,C程序就是函数的集合,函数分为两大类,一类是程序员编写的函数,另一类则是作为C语言实现的一部分提供的函数。后者称为库函数,因为他们属于一个由编译器提供的函数“库”。
- 在C语言中,函数仅仅是一系列组合在一起并且被赋予了名字的语句。某些函数计算数值并返回,某些函数则不是这样。函数用
return
语句来指定所“返回”的值。 - 一个C程序可以包含多个函数,但只有
main
函数必须有的。 return 0;
有两个作用,一是使main
函数终止,二是指出main
函数的返回值是0
,表示程序正常终止。
2.2.3 语句
语句是程序运行时执行的命令。
pun.c
就用了返回语句和函数调用语句。- C语言规定每条语句都要以分号结尾。指令不需要分号结尾。
2.2.4 显示字符串
- 字面串(string literal)————用一对双引号包围的一系列字符。当用
printf
函数显示字面串时,最外层的双引号不会出现。 \n
表示换行。
2.3 注释
每一个程序都应该包含识别信息,即程序名、编写日期、作者、程序的用途以及其他相关信息。
- 符号
/*
标记注释的开始,*/
标记注释的结束。 - 简短的注释可以和程序中的其他代码放在同一行(翼型注释)。
- C99标准提供了另一种类型的注释,以
//
开始。 - 作为一种新的注释风格,
//
有两个主要优点:首先,因为注释会在行末自动终止,所以不会出现未终止的注释意外吞噬部分程序的情况;其次,因为每行注释前面都必须有//
,所以多行注释看上去更加醒目。
2.4 变量和赋值
大多数程序在产生输出之前往往需要执行一系列的计算,因此需要在程序执行过程中有一种临时存储数据的方法,C语言中的这类存储单元被称为变量。
2.4.1 类型
- 每个变量都必须有一个类型。
- 类型会影响变量的存储方式以及允许对变量进行的操作。
- 数值型变量的类型决定了变量所能存储的最大值和最小值,同时也决定了是否允许在小数点后出现数字。
- 进行运算时,
float
型变量通常比int
型变量慢。 float
型变量所存储的数值往往只是实际数值的一个近似值。比如在一个float
型变量中存储0.1
,以后可能会发现变量的值为0.099 999 999 999 999 87
,这是舍入造成的误差。
2.4.2 声明
在使用变量之前必须对其进行声明(为编译器所做的描述)。为了声明变量,首先要指定变量的类型,然后说明变量的名字。
- 比如,
int height;
说明height
是一个int
型变量,这意味着变量height
可以存储一个整数值。 - 如果几个变量具有相同的的类型,就可以把它们的声明合并,例如
float profit,loss;
,注意每一条完整的声明都要以分号结尾。 - 当
main
函数包含声明时,必须把声明放置在语句之前。
int main(void){声明语句
}
- 就书写格式而言,建议在声明和语句之间留出一个空行。
- 在
C99
标准中,声明可以不在语句之前。例如,main
函数中可以先有一个声明,后面跟一条语句,然后再跟一个声明。
2.4.3 赋值
变量通过赋值(assignment)的方式获得值。
height = 8;
length = 12;
width = 10;
- 把数值
8
、12
和10
分别赋值给变量height
、length
和width
,其中8、12和10称为常量(constant)
。 - 变量在赋值或以其它方式使用之前必须先声明。
- 当我们把一个包含小数点的常量赋值给
float
型变量时,最好在该常量后面加一个字母f
(代表float)。比如profit = 21.34f
,不加f
可能触发编译器的警告。 - 一般情况下,赋值运算的右侧可以是一个含有常量、变量和运算符的公式。(C语言的术语中称为表达式)
2.4.4 显示变量的值
-
printf("height: %d\n", height);
- 占位符
%d
用来指明在显示过程中变量height
的值的显示位置。 %d
仅用于int
型变量。%f
则显示float
型变量。
- 占位符
-
默认情况下,
%f
会显示出小数点后6位数字。如果要强制%f
显示小数点后p位数字,可以把p放置在%
和f
之间。比如printf("Profit: $%.2f\n", profit)
。 -
C语言没有限制调用一次
printf
可以显示的变量数量。
2.4.5 初始化
当程序开始执行时,某些变量会被自动设置为
0(static类型)
,而大多数变量则不会(auto类型)
。没有默认值并且尚未在程序中被赋值的变量是未初始化的。
- 在声明变量的同时给变量赋值。
- 在
int height, length, width = 10
这个例子中,只有变量width
拥有初始化器10
,而前面两个变量没有(两个变量没有初始化)。
2.4.6 显示表达式的值
- 比如,
printf("%d\n", height * length * width);
printf
显示表达式的值的能力说明了C语言的一个通用原则:在任何需要数值的地方,都可以使用具有相同类型的表达式。
2.5 读入输入
scanf
和printf
中的字母f
都表示“格式化”的意思。两个函数都需要使用格式串(format string)来指定输入数据或输出数据的形式。
scanf
函数需要知道将获得的输入数据的格式,而printf
函数需要知道输出数据的显示格式。
- 为了读入一个
int
型值,可以使用下面的scanf
函数调用:
scanf("%d", &i);
/*
字符串“%d”说明scanf读入的是一个整数,而i是一个int型变量,用来存储scanf读入的输入。读入一个float型值时,需要一个形式略有不同的scanf调用。
*/
scanf("%f", &x);
- 提示用户输入的消息(提示符)通常不应该以换行结束,因为我们希望用户在同一行输入。这样,当用户敲回车键时,光标会自动移动到下一行。因此就不需要程序通过显示换行符来终止当前行了。
2.6 定义常量的名字
- 当程序含有常量时,建议给这些常量命名。
- 可以采用宏定义的特性给常量命名:
#define INCHES_PER_POUND 166
,这里的#define
预处理指令,此行的结尾也没有分号。 - 编译时,预处理器会把每一个宏替换为其表示的值。
- 此外,可以使用宏来定义表达式:
define RECIPROCAL_OF_PI (1.0f / 3.14159f)
,当宏包括运算符时,建议使用括号把表达式括起来。
注意,宏的名字只用了大写字母。这是大多数C程序员遵循的规范,并不是C语言本身的要求。
2.7 标识符
在编写程序时,需要对变量、函数、宏和其他实体进行命名。这些名字称为标识符。
- 在C语言中,标识符可以含有字母、数字和下划线,但是必须以字母或者下划线开头。比如,
times10 get_next_char _done
这三个是合法的,而10times get-next-char
这两个是不合法的。 - C语言是区分大小写的,所以许多程序员会遵循在标识符中只使用小写字母的规范(宏命名除外)。为了使名字清晰,必要是还会插入下划线。而另外一些程序员则避免使用下划线,他们的方法是把标识符中的每个单词用大写字母开头:
symbolTable currentPage nameAndAddress
。 - C对标识符的最大长度没有限制,因此不要担心使用较长的描述性名字。
关键字,对C编译器而言都有着特殊的意义,因此关键字不能作为标识符来使用。
2.8 C程序的书写规范
- 语句可以分开放在任意多行内。
- 记号间的空格使我们更容易区分记号。基于这个原因,我们通常会在每个运算符的前后都放上一个空格:
volume = height * length * width;
。 - 此外,还会在每个逗号后边放一个空格。某些程序员甚至在圆括号和其他标点符号的两边都加上空格。
- 缩进有助于轻松识别程序嵌套。例如,为了清晰的表示出声明和语句都嵌套在
main
函数中,应该对他们进行缩进。 - 空行可以把程序划分成逻辑单元,从而使读者更容易辨别程序的结构。没有空行的程序很难阅读,就像不分章节的书一样。
- 把字符串从一行延续到下一行需要一种特殊的方法才可以实现,后面的章节将会讲到。
问与答
问1:GCC是什么的简称?
答:GCC
最初是GNU C Compiler
的简称,现在指GNU Compiler Collection
,这是因为最新版本的GCC
能够编译用Ada、C、C++、Fortran、Java 和Objective-C等多种语言编写的程序。
问2:明白了,但GNU又是什么意思呢?
答:GNU
指的是“GNU’s Not UNIX!”(发音为guh-NEW),它是自由软件基金会(Free Software Foundation)的一个项目。自由软件基金会是由Richard M. Stallman发起的一个组织,旨在抗议对UNIX 软件授权的各种限制。从它的网站可以看出,自由软件基金会认为用户应该可以自由地“运行、复制、发布、研究、改变和改进”软件。GNU 项目从头开始重写了许多传统的UNIX 软件,并使公众能够免费地获得。
GCC 和其他GNU软件对于Linux操作系统来说是至关重要的。Linux本身只是操作系统的“内核”
(处理程序调度和基本输入/输出服务的部分),为了获得具备完整功能的操作系统,GNU 软件是必要的。
问3:GCC发现程序中错误的能力如何?
答:GCC
有多个命令行选项来控制程序检查的彻底程度。使用这些选项可以帮助我们有效地找出程序中潜在的故障区域。下面是一些比较常用的选项。
-
–Wall
:使编译器在检测到可能的错误时生成警告消息。(–W
后面可以加上具体的警告代码,-Wall
表示“所有的–W
选项”。)为了获得最好的效果,该选项应与–O
选项结合使用。 -
–W
:除了–Wall
生成的警告消息外,还需要针对具体情况的额外警告消息。 -
–pedantic
:根据C标准的要求生成警告消息。这样可以避免在程序中使用非标准特性。 -
–ansi
:禁用GCC的非标准C特性,并启用一些不太常用的标准特性。 -
–std=c89
或–std=c99
指明使用哪个版本的C编译器来检查程序。这些选项常常可以结合使用:% gcc –O –Wall –W –pedantic –std=c99 –o pun pun.c
问4:为什么C语言如此简明扼要?如果在C语言中用
begin
和end
代替{
和}
,用integer
代替int
,等等,程序似乎更加易读。
答:据说,C程序的简洁性是由开发该语言时贝尔实验室的环境造成的。第一个C语言编译器是运行在DEC PDP-11计算机(一种早期的小型计算机)上的,而程序员用电传打字机(实际上是一种与计算机相连的打字机)输入程序和打印列表。因为电传打字机的速度非常慢(每秒钟只能打出10 个字符),所以在程序中尽量减少字符数量显然是十分有利的。
问5:在某些C语言书中,
main
函数的结尾使用的是exit(0)
而不是return 0
,二者是否一样呢?
答:当出现在main函数中时,这两种语句是完全等价的:二者都终止程序执行,并且向操作系统返回0值。使用哪种语句完全依据个人喜好而定。
问6:如果
main
函数末尾没有return
语句会产生什么后果?
答:return语句不是必需的;如果没有return语句,程序一样会终止。在C89中,返回给操作系统的值是未定义的。在C99中,如果main函数声明中的返回类型是int(如我们的例子所示),程序会向操作系统返回0;否则程序会返回一个不确定的值。
问7:编译器是完全移除注释还是用空格替换注释呢?
答:一些早期的编译器会删除每条注释中的所有字符,使得语句
a/**/b = 0;
可能被编译器理解成
ab = 0;
然而,依据C标准,编译器必须用一个空格字符替换每条注释语句,因此上面提到的技巧并不可行。我们实际上会得到下面的语句:
a b = 0;
问8:如何发现程序中未终止的注释?
答:如果运气好的话,程序将无法通过编译,因为这样的注释会导致程序非法。如果程序可以通过编译,也有几种方法可以用。通过用调试器逐行地执行程序,就会发现是否有些行被跳过了。某些集成开发环境会使用特别的颜色把注释和其他代码区分开来。如果你使用的是这样的开发环境,就很容易发现未终止的注释,因为误把程序文本包含到注释中会导致颜色不同。此外,诸如lint( 1.2 节)之类的程序也可以提供帮助。
问9:在一个注释中嵌套另一个注释是否合法?
答:传统风格的注释(/*…*/)不允许嵌套。例如,下面的代码就是不合法的:
/* /*** WRONG ***/
*/
-
第2行的符号
*/
会和第1行的/*
相匹配,所以编译器会把第3行的*/
标记为一个错误。 -
C语言禁止注释嵌套有些时候也是个问题。假设我们编写了一个很长的程序,其中包含了许多短小的注释。为了临时屏蔽程序的某些部分(比如在测试过程中),我们首先会想到用
/*
和*/
“注释掉”相应的程序行。但是,如果这些代码行中包含有传统风格的注释,这种方法就行不通了。不过,C99注释(以//
开始的注释)可以嵌套在传统风格的注释中,这是这类注释的另一个优势。后面我们将看到,可以用一种更好的方法来屏蔽部分程序( 14.4 节)。
问10:float 类型的名字由何而来?
答:float
是floating-point
的缩写形式,它是一种存储数的方法,而这些数中的小数点是“浮动的”。float
类型的值通常分成两部分存储:小数部分(或者称为尾数部分)和指数部分。例如,12.0
这个数可以以1.5×2^3
的形式存储,其中1.5
是小数部分,而3
是指数部分。有些编程语言把这种类型称为real
类型而不是float
类型。
问11:为什么浮点常量需要以字母f结尾?
答:完整的解释见第7章。这里只简单回答一下:包含小数点但不以f
结尾的常量是double
(double precision
的缩写)型的。double
型的值比float
型的值存储得更精确,并且可以比float
型的值大,因此在给float
型变量赋值时需要加上字母f
。如果不加f
,编译器可能会生成一条警告消息,告诉你存储到float
型变量中的数可能超出了该变量的取值范围。
问12:对标识符的长度真的没有限制吗?
答:是,又不是。C89标准声称标识符可以是任意长,但只要求编译器记住前31个字符( C99中是63个字符)。因此,如果两个名字的前31个字符都相同,编译器可能会无法区分它们。
更复杂的情况是,C标准对于具有外部链接(18.2节)的标识符有特殊的规定,而大多数函数名属于这类标识符。因为链接器必须能识别这些名字,而一些早期的链接器又只能处理短名字,所以在C89中标识符只有前6个字符才是有效的。此外,C89还不区分字母的大小写。因此ABCDEFG
和abcdefg
可能会被作为相同的名字处理。(C99中,前31个字符有效,且字母区分大小写。)
大多数编译器和链接器比标准所要求的更宽松,因此实际使用中这些规则都不是问题。不要担心标识符太长,还是注意不要把它们定义得太短吧。
问13:缩进时应该使用多少空格?
答:这是个难以回答的问题。如果预留的空间过少,会不易察觉到缩进;如果预留的空间太多,则可能会导致行宽超出屏幕(或页面)的宽度。许多C程序员采用8个空格(即一个制表键)来缩进嵌套语句,这可能太多了。研究表明,缩进3个空格是最合适的,但许多程序员不太习惯于非2的幂次。我习惯于缩进3或4个空格,但是考虑到页面的需要,本书采用了2 个空格的缩进方式。
总结
本文章为之前两次笔记的补充,欢迎各位大佬阅读学习,有不对的地方还请指正,不胜感激。后续章节笔记会持续更新,敬请期待!(书名:《C语言程序设计:现代方法(第2版·修订版)》)
相关文章:
C现代方法(第1、2章)笔记
文章目录 C现代方法笔记(chapter1&2)序言0.1 C标准0.2 现代方法 第1章 C语言概述1.1 C语言的历史1.1.1 起源1.1.2 标准化1.1.3 基于C的语言 1.2 C语言的优缺点1.2.1 C语言的优点1.2.2 C语言的缺点1.2.3 高效地使用C语言 第2章 C语言基本概念2.1 编写…...

练[CISCN2019 华东南赛区]Double Secret
[CISCN2019 华东南赛区]Double Secret 文章目录 [CISCN2019 华东南赛区]Double Secret掌握知识解题思路关键paylaod 掌握知识 flask框架报错源码泄露,使用脚本进行RC4加解,ssti使用内置函数进行模板注入 解题思路 打开网站链接,页面就一…...

『Linux - gcc / g++』c程序翻译过程
文章目录 前言预处理 -E编译 -S汇编 -c链接动静态链接 前言 在计算机中的每一个程序是由代码变化而来的,但是事实上来说,用 c/C 写出的代码是不能被计算机识别的,其中必须经过一系列的过程才能使这个代码能成功的被计算机识别; …...

苹果遭遇安全危机,应用商店曝出不良APP,或影响iPhone的销售
据澎湃新闻报道指苹果的App Store被曝出不良APP位居下载榜前列,这对于向来强调APP严格审核的苹果来说是巨大的打击,更影响向来被认为信息安全遥遥领先的名声,对当下正热销的iPhone15或造成打击。 据了解被曝的软件以“学习XX字母”为命名&…...

docker 基本操作
一、docker 概述 Docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源。 Docker是在Linux容器里运行应用的开源工具,是一种轻量级的“虚拟机”。 Docker 的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自…...

ARM:使用汇编完成三个灯流水亮灭
1.汇编源代码 .text .global _start _start: 设置GPIOF寄存器的时钟使能LDR R0,0X50000A28LDR R1,[R0]ORR R1,R1,#(0x1<<5)STR R1,[R0]设置GPIOE寄存器的时钟使能LDR R0,0X50000A28LDR R1,[R0] 从r0为起始地址的4字节数据取出放在R1ORR R1,R1,#(0x1<<4) 第4位设…...

嵌入式养成计划-33--数据库-sqlite3
七十一、 数据库 71.1 数据库基本概念 数据(Data) 能够输入计算机并能被计算机程序识别和处理的信息集合数据库 (Database)数据库是在数据库管理系统管理和控制之下,存放在存储介质上的数据集合 常用的数据库 大型数…...
什么是大数据运维?大数据运维的职责
大数据运维是指管理、监控和维护大规模数据存储和处理平台的过程。它包含了对数据存储、处理、传输等方面的管理和维护,同时负责确保数据的安全性、可靠性和高效性。 大数据运维的职责包括以下几个方面: 确保大数据平台的高可用性和稳定性,…...

解决方案:AI赋能工业生产3.0,从工业“制造”到“智造”
视频监控技术是一种既成熟又广泛应用于工业制造领域的先进技术。它可以通过安装各种摄像头和传感器来监测整个生产流程,包括原材料的采购、加工、装配和物流等环节,从而实现对生产过程的实时监控和管理,以及对异常事件的及时预警和响应。 在…...
Android KeyStore 秘钥导入
源码参考: https://android.googlesource.com/platform/cts//master/tests/tests/keystore/src/android/keystore/cts/ImportWrappedKeyTest.java 辅助源码参考: https://android.googlesource.com/platform/frameworks/base//master/core/java/android…...

TDengine+OpenVINO+AIxBoard,助力时序数据分类
时间序列数据分析在工业,能源,医疗,交通,金融,零售等多个领域都有广泛应用。其中时间序列数据分类是分析时序数据的常见任务之一。本文将通过一个具体的案例,介绍 Intel 团队如何使用 TDengine 作为基础软件…...
设计模式——16. 迭代器模式
1. 说明 迭代器模式(Iterator Pattern)是一种行为型设计模式,它用于提供一种访问聚合对象(如列表、数组、集合等)元素的统一接口,而不需要了解底层数据结构的具体实现。迭代器模式将遍历聚合对象的操作封装在一个独立的迭代器对象中,这样可以隔离遍历算法和数据结构,使…...
flink redis connector需要防止包冲突
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 <dependency><groupId>org.apache.bahir</groupId><artifactId...

socket can查看详细信息 命令 ip -details -statistics link show can0
ip -details -statistics link show can0 ip -details link show can0 ip -statistics link show can0 也可以像第一行那样结合使用...

打造虚拟企业展厅,开启商务活动新时代
引言: 虚拟企业展厅是一种基于数字技术的全新商务模式,正在改变传统商务活动的方式,它比传统的企业展厅更便利,也更能凸显企业优势,展示企业风貌。 一.虚拟企业展厅的好处 1.打破地域限制 传统的商务活动通常需要参…...

03黑马店评-添加商户缓存和商户类型的缓存到Redis
商户查询缓存 什么是缓存 实际开发过程中数据量可以达到几千万,缓存可以作为避震器防止过高的数据访问猛冲系统,避免系统内的操作线程无法及时处理信息而瘫痪 缓存(Cache)就是数据交换的缓冲区(储存临时数据的地方),我们俗称的"缓存"实际就是缓冲区内的数据(一般从…...

LabVIEW玩转魔方
LabVIEW玩转魔方 使用LabVIEW创建一个3D魔方,并找出解谜题的秘密,给朋友留下深刻深刻的印象。游戏中内置的机制使每张脸都能独立转动,从而混合颜色。要解决难题,每个面必须是相同的纯色 魔方的奥秘在于它的简单性和不可解性。这是…...

大数据学习(1)-Hadoop
&&大数据学习&& 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一下博>主哦&#x…...
常用时序模型
常用时序模型 RNN (Recurrent Neural Network): 基本概念: RNN是一种可以处理序列数据的神经网络。它在每一时间步都接收一个新的输入,并将前一个时间步的隐藏状态作为额外的输入。问题: 它的主要问题是在处理长序列时遇到的梯度消失和梯度爆炸。这使得RNN难以捕获长期依赖关…...
阿里云/腾讯云国际站:私服服务器:什么是游戏虚拟服务器及用途讲解?
游戏虚拟服务器是一种新兴的技术,它可以为玩家提供更好的游戏体验。私服服务器它可以将游戏服务器的负载分散到多台服务器上,从而提高游戏的流畅度和稳定性。此外,游戏虚拟服务器还可以提供更多的游戏功能,比如游戏聊天室、游戏排…...

Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...

Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...