- 博客(151)
- 收藏
- 关注
原创 【深度视觉】第十九章:YOLO预训练模型的使用
save_txt=True时,还可以把检测到的物体的类别编码、bbox都写到一个文件中输出。就相当于帮助我们自动标注了,并且生成了标签文档。conf:默认值是0.25,就是说只要被检测的目标有25%的置信度,就把目标标记出来。2、在anaconda中创建运行yolo的虚拟环境。我们下载的v8是一个预训练模型,就是开箱即用的。stream:就是检测结果是否要打印到终端。1、下载:anaconda+vscode。source: 自然就是你要检测的目标。save:检测结果是否要保存。
2025-04-06 14:33:37
145
原创 【深度视觉】第十八章:YOLO系列原理解读
不胜其烦,下面两个图对这些指标统一描述一下:。一是,重叠的物体检测不到!如果一个网格对应的图像是只狗,是我们要检测的对象,但是这只狗重叠的区域还有一只高度一样的猫,这只猫也是我们要检测的对象,那是不是就无法检测出来了。此外,v8对新手是比较友好的,因为没有太多的源码级别的东西,很多东西直接调用即可:一是你要指定一下配置文件,二是如果你想改动的地方,加到源码文件的683行的位置:。因为我们要检测的目标可能是大的也可能是小的,可能是胖的的也可能是瘦的,v1版本把整个图片平均分词9个区域,岂不是太不合理了。
2025-03-31 22:09:51
777
原创 【GNN】第五章:图神经网络架构中的基础设施——GCN、GAT、GraphSAGE、TopKPooling、GAP、GMP
是它自己理解的方法实现的,是先通过邻接矩阵,把所有有边的节点对儿取出来,然后根据节点对儿,concat两个节点的特征向量,然后在线性变换成一个注意力值,然后再leakyReLU->mask->softmax,我一开始也是照着这个思路coding的,但是死活和pytorch_geometric的结果不一致,就开始怀疑各个环节,甚至怀疑是不是参数没有xavier初始化,又跑去源码找pytorch是怎么初始化的,然后又找不到pytorch的初始化参数,真是搞得晕头转向的。最原始的图卷积层是SUM求和的传递机制;
2025-03-27 21:53:41
999
原创 【GNN】第四章:图卷积层GCN
很多地方讲GCN时一直和图像卷积CNN放一起扯啊扯,我个人认为,二者实在没啥可比性,就好比苹果和橘子,没啥可比的,就各学各的,学GCN就把脑子里面的CNN给清空了,不然越搅越糊。一是,在传统深度学习中,deeper is better, 所以我们一直追求更深更复杂的架构,也就是我们经常说的"在海量的数据上训练巨大的模型",所以现在很多模型动辄就是数亿参数,普通电脑根本没法训练,所以当下就是拼硬件的一个局面。每个节点更新特征的时候,一方面要考虑自身的特征,另一方面要考虑与它相关的点的特征。
2025-03-11 20:24:22
1085
原创 【GNN】第三章:图数据
因为每个点都不是孤立的,它都是和一些别的点有联系的,所以一个点的特征的变化是要受到和它有边相连的点的影响的。比如有的任务是求点的(比如对点进行分类、回归等任务),有的是求边的(比如对边进行分类、回归等任务),有的还是求全局的就是Graph级别的任务(比如设计分子结构等任务)。图是一个全局的概念。vi节点k跳远的邻接节点(neighbors with k-hop),指的是到节点vi走k步的节点(一个节点的2跳远的邻接节点包含了自身)。比如上图的节点A的邻接节点就是E,而节点E的邻接节点是ABCD四个节点。
2025-03-04 11:02:16
694
原创 【GNN】第二章:图论、及其工具NetworkX
因为每个点都不是孤立的,它都是和一些别的点有联系的,所以一个点的特征的变化是要受到和它有边相连的点的影响的。比如有的任务是求点的(比如对点进行分类、回归等任务),有的是求边的(比如对边进行分类、回归等任务),有的还是求全局的就是Graph级别的任务(比如设计分子结构等任务)。图是一个全局的概念。vi节点k跳远的邻接节点(neighbors with k-hop),指的是到节点vi走k步的节点(一个节点的2跳远的邻接节点包含了自身)。比如上图的节点A的邻接节点就是E,而节点E的邻接节点是ABCD四个节点。
2025-03-04 10:56:03
1061
原创 【GNN】第一章:图神经网络入门
的PyTorch的扩展库,几何深度学习指的是应用于图和其他不规则、非结构化数据的深度学习。是非常随意的,它不像MLP、CNN、RNN、Transformer那样,必须要数据规整、要resize、要截断填补等,图神经网络要求的数据只要有点有边就行,至于几个点几条边都随意。然而在真实世界中,并不是所有的事物都可以用结构化数据来表示,比如社交网络、知识图谱、电商购物、复杂的文件系统、蛋白质相互作用关系、分子结构等,这些事情就没法用结构化数据来表示,只能以。的深度学习方法,就是将神经网络模型拓展到图数据计算领域。
2025-03-03 11:46:24
648
原创 【NLP】第十一章:隐马尔可夫——前向算法、后向算法、维特比算法、Baum-Welch算法
就是好比我现在知道了观测序列Observations、掩藏序列States,我试着去学一个最优的(π, A, B),让在这个(π, A, B)下,观测序列Observations、掩藏序列States的概率最大。(2)矩阵B就更好理解了,矩阵B的第一行表示我已经抽取的是盒子1,那我抽取白球的概率就是0.4,抽取黑球的概率就是0.6了,因为第一个盒子只有4白6黑嘛。三是,由于每次抽取的小球的颜色的概率不仅取决于,小球所在的盒子中的黑白球的比例,还取决于你是从哪个盒子中抽的,所以其实观测序列还对应着一个。
2025-02-11 23:50:44
689
原创 【NLP】第十章:Transformer论文解读
因为感受野就像一个滑窗的效果,有的窗口大点,有的窗口小点,但是不管大小,它的本质都是窗口。另外一个理解维度是:卷积网络虽然是独立的小滑窗看序列的,但它是可以有一系列的卷积核组成,就是卷积是多通道看这个序列,那不同通道就会看到不同的数据模式,这是卷积的强大之处。所以多头其实就是为了模拟卷积层的多通道的效果。或者说这个linear层是把embedding后的词向量再映射会到标签编码,所以这个linear层和权重结构和embedding层的权重结构是一样的,而且功能是互逆的,所以,这两个层也是可以共享参数的。
2025-01-23 21:41:40
1193
原创 【NLP】第九章:Transformer原理、计算流程以及代码实现-3
至此我们手动计算的编码器和解码器的计算流程就结束了,和调包pytorch中的Transformer算法的计算结果一样,说明每步我们的原理、计算流程,以及各个细节都理解的没错。一般我们都是将0填充位置的值设置成一个非常小的负数,这样softmax后,这部分的注意力分值就无限趋近0了,也就相当于用0给mask了。所以上图的Linear层就是一个普通的全连接层,这个层的输入就是embedding_dim=6,输出就是tgt_vocab size=12,也所以这个线性层就是一个。
2025-01-15 23:40:18
1110
原创 【NLP】第八章:Transformer原理、计算流程以及代码实现-2
完整的Transformer算法的。因为要确保此后我们手动计算的数据流是正确的,就是至少要和pytorch计算出来的结果一致的,才能证明我们对Transformer的理解是没有偏差的。:这两个类是Transformer编码器的实现和解码器的实现,其中nn.TransformerEncoder包含了多个nn.TransformerEncoderLayer层的堆叠。通常不同的LNP任务上会使用Transformer架构的不同部分,很多更优的模型也是在Transformer的基础上调整改造的。
2024-12-27 14:46:24
1042
原创 【NLP】第七章:Transformer原理、计算流程以及代码实现-1
所以Transformer中的词嵌入是从头开始训练的,所以设置参数的时候,可能不会把单词的语义存储在前几个维度里,这样就避开了位置编码。这也是我的猜想,因为也有人说,即使sinusoidal位置编码本身拥有很好的形式,但位置编码和词嵌入向量相加进入attention模块后,首先进行的是一个线性变换,而这个线性变换就直接导致了。一个有效的、好的位置编码算法是要涉及大量的数学推导的,是要对数学公式有非常敏锐的数感的。一个好的起点意味着一个丝滑的迭代过程,如果你的起点就很糟糕,那你的训练过程势必也会很艰难。
2024-12-20 13:48:38
1298
原创 【NLP】第六章:位置编码Positional Encoding
前面讲RNN时一般都会有一个ht的输出,这个输出就是样本与样本之间的信息,而且RNN是时序循环的,所以RNN本身的结构,在物理上,就自带词的前后顺序信息的。比如词never,不管never本身的词向量是什么,只要你在序列中排第一个位置,你的位置向量就是[0,1,01],你排第三个位置,你的位置向量就是[0.9,-0,4,0.2,1.0]。也所以,你可以理解为:embedding后的词嵌入,PE按照每个样本在sequence中的位置,把embedding后的词嵌入给扭转后,才送入attention的。
2024-12-18 14:32:01
1366
原创 【NLP】第五章:注意力机制Attention
五、注意力机制Attention在讲Transformer之前,我先把注意力机制Attention单独拿出来先讲一下。一是因为attention是Transformer中非常关键的技术,也是transformer之所以区别其他模型的关键之处。但是transformer本身的架构就非常复杂了,到真正开讲transformer时才讲attention,transformer的篇幅就会又臭又长,所以这里我单独把attention先提出来讲。二是因为attention从2016年被transformer
2024-12-12 16:40:42
1680
原创 【NLP】第四章:门控循环单元GRU
哎,笑一会儿,本来记忆和遗忘就是一体两面,非此即彼的。从上图的公式看,其实这两个门,仅仅是两个门而已,它们两个的计算一模一样,输入一模一样,只是使用了两个不同的矩阵线性变换了一下,而且这两个矩阵都是随机生成的,只有在训练过程中,这两个门才会慢慢迭代成其功能的门。有的资料叫节点,有的叫单元,有的叫循环单元,,,等等各种叫法,所以我们也不用纠结。第二个坑就是上图的C处,我一开始先计算的rt*ht-1,然后再进行线性变换,一看结果对不上,查看GRU的说明文档才发现,pytorch人家是先线性变换后再乘rt的。
2024-11-29 01:15:09
1846
原创 【NLP】第三章:长短期记忆网络LSTM
RNN是一个时序意义上的深度网络,虽然从表达式上t时刻的loss与之前所有时刻的隐含态h都有关系,即按照时序展开,会发现已经有类似Residual Connection直接连接每个输入到当前的loss,但是与ResNet的巨大不同在于,这些连接反复使用的都是同一个W。但是对于RNN的输入来说,并不是必须等步长输入的,就是可以变步长输入,就是没有要求你所有的输入都是等步长,你有几步就循环几次好了,不是说我必须要求都要是比如10步,必须要循环10次,不是的,你有几步循环几次即可。,也是承载着记忆信息。
2024-11-25 23:47:11
1331
原创 【NLP】第二章:循环神经网络RNN、DRNN、 BRNN
如果是普通的DNN架构,那DNN是把这个sequence当作6条样本数据,这6条样本数据作为一个输入矩阵,喂入网络,网络的正向传播也是网络每层神经元的参数矩阵和这个6个样本矩阵的转置相乘,然后输出到下一层,下一层的所有神经元参数矩阵再和这个输出相乘,继续输出到它的下一层,直到最后的输出层,输出的数据矩阵再转置一下显示出来。我画的图就形象太多了,你就立马理解了我前面说的是把6个一模一样的架构竖着排,然后第一个样本从垂直方向的第一层进入,第二个样本从垂直方向的第二层进入,,,依次类推,开始正向传播。
2024-11-16 02:11:01
1055
原创 【NLP】第一章:知识体系框架概览
比如你是简单的数据集,你非得用100层以上的网络跑,或者你是复杂的时序数据,你非得用简单的几层DNN去跑,那都是不合适的,就是你不会取得你想要的效果的。另外,如果你已经有了大量的复杂的原始数据,那你拿这些数据去训练模型时,你还得要掌握很多的数据预处理、数据增强、特征工程等系列技术手段和技术trick,你才能训练出好的模型,就是模型有很强的学习能力和泛化能力。NLP技术的应用领域:机器翻译、文本摘要、问答系统、搜索引擎、推荐系统、语音助手、聊天机器人、自动摘要、情感分析、语言大模型的相关软件和APP。
2024-11-15 13:24:25
1438
原创 【C++】移动语义、移动构造函数、std::move、移动赋值操作符、左值右值、左值引用右值引用
如果我们知道传入的是一个临时对象的话,我们就不需要担心它们是否活着、是否完整、是否拷贝,我们可以简单的偷用它的资源,给到特定的对象,或者在其他地方使用它们,因为我们知道它是暂时的,它不会存在很长时间,比如上面的ln+fn,就是暂时的,我们就可以从这个临时值中偷取资源,这对优化有很大帮助。左值是带地址的数据,就是有存储支持的变量。右值是临时值,可以用右值引用&&来检测。左值引用只能引用(接受)左值,除非加const,就也可以引用(接受)右值了。是有地址的值(located value),就是左值是有地址的。
2024-11-06 19:37:58
435
原创 【C++】C++的单例模式、跟踪内存分配的简单方法
这根本不是和某种对象有关的东西,它们只是C风格的函数,没有类,一点关系都没有。C++不像Java和C#那么多规则限制,C++不对静态函数做这些规则限制,所以C++可以不需要写一个类,可以在某个名称空间中写一些函数,甚至在全局名称空间中,它们不属于任何类的类型。特别是java,所有东西都必须是一个类,你不能在类之外有代码,如果你想要静态的功能,你不需要实例化,但你必须在你的类中创建静态成员。三是,C++可以有完全全局的变量,或者可以有一个静态变量,它被绑定到一个特定的翻译单元,或者一个特定的CPP文件。
2024-11-05 18:37:06
992
原创 【C++】如何让C++字符串更快、C++的小字符串优化
std::string_view是C++17中的一个新类,它的本质是指向现有内存的指针,或者说就是一个const char指针,指向别人拥有的字符串,再加上一个大小size。也就是我创建了一个窗口,一个进入现有内存的小视图,而不是分配一个新的字符串。在C++17之前,人们就是这样做的,不是去创建一个自己的字符串,而是观察一个已有的字符串。如果程序中有很多字符串操作,比如格式化文本(日志记录),那是非常糟糕的,因为字符串操作是很慢的。说明:重载new操作符,返回malloc(size),这是基本的内存分配。
2024-11-03 23:48:17
559
原创 【C++】C++17结构化绑定、std::optional、std::variant、std::any
比如我们现在要写一个函数,这个函数的功能是读取一个文件,那这个文件是否存在?数据是否是我们期望的格式?此时这个函数的返回就是一个不确定的数据,可能有返回数据,也可能没有返回数据,也可能需要返回多个数据。所以函数的返回不是很确定的这种场景,就得用std::optional了。std::optional也是C++17标准中新引进的模板类类型,用于处理那些可能存在也可能不存在的数据。当读取不成功时,我们也不知道什么原因,是路径错了还是格式错了,还是路径格式都没错,只是文件里面确实就是没数据,所以啥也没读出来。
2024-10-31 16:46:48
527
原创 【C++】C++预编译头文件、基准测试benchmark
预编译头文件就是让我们提前先整理出一些头文件,比如C++库、标准模板库、windows api类的、这些几乎永远不会改变的、而且几乎都要用到的东西,都放到一个单独的头文件中(通常命名为pch.h或类似名称),然后让编译器提前我这些头文件编译成一个二进制文件(编译器通常默认的是生成.pch或.gch格式的),以二进制格式存储到磁盘。我们现在已经知道,开发一个项目,里面会有多个.cpp文件,编译这个项目时,先是对每个.cpp文件进行预处理,然后再编译,最后是将这多个文件合并成一个.exe文件。
2024-10-29 12:49:25
507
2
原创 【C++】Type punning类型双关、union联合体、C++中的类型转换casting
可见当你通过指针强制转换一个内存块后,再通过解引用指针去拷贝这个内存块到另外一个地方时,你拷贝的就是没有通过类型解析的纯纯的原始二进制字节流,而且拷贝的长度可能都有问题,因为你强制转化了类型了嘛,类型其中一个重要的信息就是这个数据的长度嘛,所以你长度可能都搞错了。上面的例子都是C++的最原始的内存操作,也正是有了这些任性自如的内存操作,使C++成为最为高效的编程语言。的,因为类型系统绝对是有其存在的理由的,你绕开类型系统,对这块内存随性操作,是非常容易引发很多潜在的风险和问题的。
2024-10-25 14:18:49
1085
原创 【C++】C++中的计时、多维数组、排序
在C++11标准之前,C++在语言层面是没有计时的。如果需要计时就得借助操作系统平台提供的API,比如windows的QueryPerformanceCounter。C++11标准出来后,C++11新标准提供了和日期时间相关的库:chrono标准库。这个库可以实现计时功能,而不必再去使用操作系统平台库。chrono标准库提供的是精度最高为纳秒级的计时接口。由于是C++标准库中提供的功能,所以可以很好地跨平台使用。计时的作用:希望某些事在特定时间发生;计时就是计算完成某个操作或执行某个代码所需要的时间。
2024-10-23 16:35:58
287
原创 【C++】函数指针、lambda表达式、名称空间
1、函数指针这里我们讲的是原始风格的函数指针(raw function pointer),也就是来自C语言的函数指针,但是这里将展示用C++的方式来使用函数指针。函数指针在【C++】深度理解C++数据类型:常量、变量、数组、字符串、指针、函数_c++ 字符串常量-优快云博客 中的函数部分是有涉及到的,感兴趣的同学可以找找。函数指针是将一个函数赋值给一个变量的方法。所以函数指针的本质是一个指针,这个指针指向的是一个函数。使用函数指针,我们可以轻松的把函数赋值给变量,也可以把一个函数作为参数传递给其他函
2024-09-27 22:08:22
614
原创 【C++】C++中如何处理多返回值、C++中的模板、宏
上述例子中,两个字符串是程序进入main函数后,先开始运行func函数,而运行func函数就先组织参数,组织参数就是在常量区先写入"lyy""liyuanyuan"这两个字符串,然后才开始执行func,func又是在栈内存创建的,而执行func我们是通过引用传参的,这样就少了一次复制。写过python的同学都知道,当你写一个函数的返回时,那是你想返回谁就能返回谁,想返回几个就可以返回几个,几乎是非常的随心所欲了,因为python背后是做了很多很多事情才让你如此肆意的。func函数执行完毕,就是赋值给e。
2024-09-24 16:10:34
660
原创 【C++】C++库:如何链接外部库、静态链接和动态链接,以及如何自建库并使用
下载完毕后打开(上图5处),5处是C++库的典型组织结构,这里我们先简单介绍一下上图5处的文件:第一个文件夹docs:打开基本都是。
2024-09-20 09:18:23
2132
2
原创 【C++】静态数组array、动态数组vector创建及优化
C++给我们提供一个叫做Vector的类,这个Vector在std命名空间中。Vector不是向量的意思,更为准确的说是ArrayList,因为它的本质是一个动态数组。但与我们之前讲的数组类型不同的是,它可以调整数组的大小。意思就是当你创建一个vector时,它是没有固定大小的(当然你也可以初始化一个特定的大小,但一般我们不这样做),我们也不需要care它的大小,只要把元素放进去就行。每次你放入一个元素,数组的大小就会增长。
2024-09-13 15:18:48
1272
原创 【C++】理解C++中的复制、复制构造函数
也所以当代码执行到B处,先释放对象b时,就已经调用了析构函数删除了堆上的字符串数组了,再释放对象a时,又得调用析构函数,此时a中的p的值指向的堆内存已经被标记为free状态了,你再调析构函数free那块内存就没法free了,于是报了_UNKOWN_BLOCK。可见,不是任何时候我们都需要拷贝的,上例中的func函数,调用了3次,就拷贝了3次参数,调用完毕还得销毁,所以也销毁了3次。本篇先讲什么是copy,然后手写一个字符串复制的类,揭开拷贝的本质,就是拷贝都做了什么工作,并从中引出什么是浅拷贝、深拷贝。
2024-09-12 16:46:02
1225
原创 【C++】作用域指针、智能指针、共享指针、弱指针
因为虽然Entity是创建在堆内存上的,但是指向Entity的指针e可是创建在栈内存上的,e的作用域是它所在的花括号{},所以当{}指向完毕,e就销毁了,那指向Entity的指针都销毁了,就是相当于delete e;继续往下执行,就是22行的后花括号},就从第22行跳到第16行,再从第16行跳到第7行,第7行执行完毕后跳回第16行,执行16行,16行执行完毕后才跳回22行,算是22行执行完毕了,此时所有对象的值都没有了。作用域指针是一个类,是指针的包装器,在构造时用堆分配指针,然后在析构时删除指针。
2024-09-08 11:17:43
1018
原创 【C++】如何用C++创建对象,理解作用域、堆栈、内存分配
而堆是不同的,一旦你在堆中创建一个对象,这个对象就会一直在那里,直到你做出释放它的决定。但是上述在栈上创建的对象和在堆上创建的对象还是有差异的,差异就是小标题1中的四点。即使一个没有类成员的类,就是啥也没有的类,你实例化它创建的对象也是至少要占用1个字节的内存的。正常的情况下,一个类中是有很多类成员的,所以我们需要内存存放类实例的这一堆变量的值。第二个差异是:如果你的对象太大,或者对象太多,你最好也是把你的对象创建在堆上。从上图可见,不管在栈上创建类实例还是在堆上创建类实例,都自动默认的调用了构造函数。
2024-09-05 12:38:49
821
3
原创 【C++】类成员初始化列表、三元运算符、运算符及其重载、箭头操作符
也就是类成员初始化列表。就是我们在构造函数中初始化类成员(变量,有时也叫属性)的一种方式。见mutable关键字。
2024-09-03 16:15:42
324
原创 【C++】C++中的关键字:const、mutable、auto、typedef、using、new、delete、explicit、this、多文件放代码
const是一个限定修饰符,表示承诺某个对象不能改变,是强制开发人员写代码时的一个规则,也就是语法上的一个规则。但是如果这个类方法必须得改变类中的某些变量,而且它还想是个const方法时,就得用mutable关键字来修饰那个被改变得变量。小结:const用在类的方法中,一般都是这个方法声明不改变类的其他东西,就是读读,不修改的。在讲常量部分,有一个叫常变量的,就是就是用const限定一个常量,就变成常变量了。mutable是字面意思是可改变的,immutable是不可改变的、无法改变的。
2024-09-03 16:11:45
973
原创 【C++】深度理解C++数据类型:常量、变量、数组、字符串、指针、函数
用array数组,虽然要增加点开销,但要方便很多,比如计算数组长度.size即可,还有像边界检查等我们都不需要考虑了。数组就是一个变量(数组)中有多个变量(各个元素)数组中的所有元素是连续放在某一块儿内存区域的。数组名就是这个数组在内存中的第一个元素的地址。
2024-06-29 17:15:49
679
原创 【C++】类、静态static、枚举、重载、多态、继承、重写、虚函数、纯需函数、虚析构函数
上面的Log类中的公共变量我用了两次public是因为:我喜欢把类中不同的部分分开来写,比如,public方法写在一部分,public变量又放另一部分,public静态变量又会放其他一部分。类外的函数访问类外的变量,肯定访问不了类内的变量了。说明:上面的步骤只是展示了如何逻辑清晰的写一个类,但事实上上面的代码是非常糟糕的,后面我们将使用更多的概念来改进这个类,使其达到专业生产级水平的代码。唯一的区别就是结构体中的变量默认都是共有的,类中的变量没有public声明就都默认是私有的。静态方法无法访问类的实例。
2024-06-26 12:33:27
1249
原创 【C++】一个极简但完整的C++程序
认真看过编译原理的同学就知道,变量名其实是给程序员看的,程序编译的时候,变量名直接被编译器映射成首地址和长度(长度是从变量的类型上看到的,比如上面的int类型)。某个书店将每本售出的图书的书名和出版社,输入到一个文件中,这些信息以书售出的时间顺序输入,每两周店主会手工计算每本书的销售量、以及每个出版社的销售量。(3a)按出版社排序 (3b)对每个出版社的书,按书名排序 (3c)在每个出版社组中,比较相邻的书名,如果二者匹配,增加第一个的数量,删除第二个。语句是C++中最小的程序单元。上述代码就是3条语句。
2024-06-21 00:09:54
1965
原创 【C++】循环、控制流语句、指针、引用
我们约定成俗是这样使用的:当我们确实是想无限持续循环的,比如游戏,就是想让一帧帧一直循环,我们不在意究竟循环了多少次,循环到哪里,就是不介意是否要去声明i,也不介意i究竟是多少了,就是想无限循环下去,那我们就使用while循环。如果条件是true,就执行循环体,一直执行到for循环的最后的花括号},跳回到for语句,此时首先执行的是i++,然后再判断条件,条件true就是上面的一套流程;如此循环,直到B不满足条件,也就是B返回false,指令指针跳出for循环,也就是执行E后面的代码行(第12行)。
2024-06-19 16:39:30
864
原创 【C++】数据类型、函数、头文件、断点调试、输入输出、条件与分支、VS项目设置
但你自定义的类型都是在这些基本类型之上创建的。(7)数据转化为指针或引用。指针通过一个*号来声明,引用用&表示。说来话长,这些以后要专门聊。
2024-06-17 10:54:37
1112
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人