C++指针(五)完结篇
个人主页:PingdiGuo_guo
收录专栏:C++干货专栏
前言
相关文章:C++指针(一)、C++指针(二)、C++指针(三)、C++指针(四)万字图文详解!
本篇博客是介绍const、野指针、双指针以及assert断言的知识的。
文章目录
前言
1.const与指针
1.1修饰变量
1.2修饰指针变量
2.野指针
2.1为何会出现野指针?
2.1.1未初始化指针
2.1.2 指针越界访问
2.1.3 指针指向已释放的内存
2.1.4 函数返回局部变量指针
2.1.5 引用指针的指针
2.2如何避免野指针?
2.2.1初始化指针
2.2.2 及时释放和重置指针
2.2.3 避免越界访问
2.2.4 使用智能指针
2.2.5 避免返回指向局部变量的指针
2.2.6 使用合适的作用域和生命周期管理
3.assert断言
3.2断言实现
4.双指针
4.1双指针的作用
4.2双指针的实现
4.2.1快慢指针
4.2.2左右指针
4.2.3 对撞指针
4.2.4滑动窗口
4.3双指针的练习
5.NULL指针
5.1NULL指针的操作
5.1.1 初始化指针变量
5.1.2判断指针是否为空
5.1.3 赋值为NULL
5.1.4 检测NULL指针异常
总结
1.const与指针
const是C/C++中的关键字,用于声明常量。通过使用const关键字,可以将变量、函数参数、函数返回值等标记为只读,即不能被修改。
1.1修饰变量
在C++数据类型、变量常量里,我们讲了用const关键字来进行定义变量,它所定义的变量叫常量,其一旦赋值,就无法修改了。
1.2修饰指针变量
我们来看一下这段代码,大家想一想,ok的地方能运行吗?
#include <iostream>// 左边修饰
void guo1() {int n=20,mu=1000; const int* ptr=&n;*ptr=10;//ok?ptr=μ//ok?std::cout << *ptr << std::endl;
}// 右边修饰
void guo2() {int n=20,mu=1000; int const* ptr=&n;*ptr=10;//ok?ptr=μ//ok?std::cout << *ptr << std::endl;
}// 中间修饰
void guo3() {int n=20,mu=1000; int const* const ptr=&n;*ptr=10;//ok?ptr=μ//ok?std::cout << *ptr << std::endl;
}// 无修饰
void guo4() {int n=20,mu=1000; int* ptr=&n;*ptr=10;//ok?ptr=μ//ok?std::cout<<*ptr<<std::endl;
}int main() {int num = 5;guo1(); guo2();guo3();guo4();return 0;
}
在上述示例中,分别定义了四个函数,用于演示const修饰指针变量的不同情况。调用这些函数并传入一个整数的指针变量。
注:黑色圆圈处表示有语法错误。
总结:const修饰在左边,表示指针所指向的数据是常量,无法通过指针修改其值,但是可以修改指针的值。
const修饰在右边,表示指针本身是常量,无法通过指针修改其指向的地址,但指针指向的值可以通过指针改变。
const修饰在中间,表示指针本身和其所指向的数据都是常量,无法通过指针修改其指向的地址和值。
没有使用const修饰,表示指针和指针所指向的数据都可以修改。
注意,在上述示例中,对于const修饰的指针变量,是无法通过指针修改其指向的数据的,但是可以通过其他方式修改其指向的数据,比如通过其他指针或者直接使用变量名访问。
2.野指针
野指针是指未初始化或者指向已经释放的内存的指针。野指针可能会导致严重的错误,因为我们无法预测野指针指向的内存中存储了什么数据,或者该内存是否还有效。当我们试图访问野指针指向的内存时,可能会导致程序崩溃、数据损坏或其他意想不到的行为。
2.1为何会出现野指针?
野指针的成因可以有多种情况,主要包括以下几种:
2.1.1未初始化指针
当我们声明一个指针变量但没有初始化它时,它将包含一个不确定的值,即垃圾值。这个指针指向的内存地址是未知的,因此成为野指针。
int* ptr; // 未初始化指针,成为野指针
2.1.2 指针越界访问
当我们使用指针访问超出其指向对象边界的内存时,它可能指向其他未知的内存地址,导致成为野指针。
int arr[5];
int* ptr = &arr[0];// 在指针越界访问后,ptr成为野指针
ptr += 10; // 超出arr数组边界
2.1.3 指针指向已释放的内存
当我们使用delete释放一个指针指向的内存后,如果没有将指针设置为nullptr或者重新指向其他有效的内存地址,它仍然保留之前指向的无效内存地址,成为野指针。
int* ptr = new int;
delete ptr; // 释放指针指向的内存// 没有将ptr设置为nullptr或重新指向其他内存,ptr成为野指针
2.1.4 函数返回局部变量指针
当一个函数返回一个指向局部变量的指针时,当函数结束时,局部变量会被销毁,指针将指向无效的内存地址,成为野指针。
int* getLocalPointer() {int num = 10;int* ptr = #return ptr; // 返回指向局部变量的指针
}int* ptr = getLocalPointer(); // ptr成为野指针,指向已销毁的内存
2.1.5 引用指针的指针
当我们使用一个指向指针的指针时,如果没有正确地进行地址传递或赋值,指针指向的地址可能是未知的,导致成为野指针。
int num = 10;
int* ptr = #
int** refPtr = &ptr; // 指向指针的指针int* wildPtr = *refPtr; // 未正确传递地址,wildPtr成为野指针
2.2如何避免野指针?
要避免野指针问题,可以采取以下几个方法:
2.2.1初始化指针
在声明指针变量时,立即将其初始化为nullptr或者有效的内存地址,这样可以避免使用未初始化的指针。
int* ptr = nullptr; // 初始化为nullptr
int n=1;
*ptr=&n;
2.2.2 及时释放和重置指针
在使用完成后,及时释放指针所指向的内存,并将指针重置为nullptr,以防止它成为野指针。
int* ptr = new int;
// 使用ptr指向的内存delete ptr; // 释放内存
ptr = nullptr; // 重置指针为nullptr
2.2.3 避免越界访问
确保指针在访问内存时不会超出其所指向对象的边界,这样可以避免指针成为野指针。
int arr[5];
int* ptr = &arr[0];
// 使用ptr访问arr的合法元素// 避免越界访问
2.2.4 使用智能指针
使用C++标准库提供的智能指针类,如std::shared_ptr、std::unique_ptr等,来自动管理内存资源。智能指针会负责在不需要时自动释放内存,避免野指针的问题。
std::shared_ptr<int> ptr = std::make_shared<int>(5);
// 使用ptr指向的内存// 不需要手动释放内存
2.2.5 避免返回指向局部变量的指针
确保在函数返回指向局部变量的指针之前,将其转移到堆上分配的内存或者是静态存储区域中。
int* getDynamicPointer() {int* ptr = new int(10);return ptr; // 返回指向堆上分配的内存的指针
}int* ptr = getDynamicPointer(); // 调用后,ptr指向有效的内存
2.2.6 使用合适的作用域和生命周期管理
确保在适当的时候创建和销毁指针,避免指针超出其作用域而导致成为野指针。
void foo() {int* ptr = new int;// 使用ptr指向的内存delete ptr; // 在合适的位置释放内存
}
遵循这些规则和最佳实践可以有效地避免野指针问题,并提高代码的稳定性和可靠性。
3.assert断言
断言是在程序中用于验证预设条件的一种机制。断言通常用于检查程序中的错误、逻辑错误或不可能发生的情况。当断言条件为假时,程序会中止执行,并输出相关的错误信息。
3.2断言实现
在C++中,断言的使用需要包含<assert.h>头文件,并使用assert宏来进行断言。assert宏接受一个表达式作为参数,如果表达式为假(即false),则会触发断言失败。
示例代码如下:
#include <iostream>
#include <cassert>int main() {int x = 10;assert(x > 0); // 断言条件 x > 0 为真std::cout << "Program continues..." << std::endl;return 0;
}
在上述代码中,assert(x > 0) 断言了变量x大于0的条件。如果x小于等于0,程序会中止执行,并输出相关的错误信息。
断言的目的是在开发和测试阶段快速发现和诊断错误,因此在发布版本的代码中通常会禁用断言。可以使用NDEBUG宏定义来在编译时禁用断言。在编译时加上"-DNDEBUG"选项,或者在代码中添加如下代码:
#define NDEBUG
断言的使用可以帮助程序员快速发现和解决错误,但需要注意,过多地使用断言可能会导致代码冗余和性能下降,因此需要在必要的地方使用,并在发布版本中禁用。
4.双指针
双指针是指在算法中使用两个指针来解决问题的一种技巧。这两个指针可以指向同一个数组或链表的不同位置,也可以分别指向两个不同的数组或链表。
4.1双指针的作用
双指针常用于解决数组、链表或字符串相关的问题,如判断回文串、找出两个有序数组的交集、反转链表等。使用双指针技巧可以在O(n)或O(nlogn)的时间复杂度内完成操作,提高了算法的效率。
双指针的作用主要有以下几个方面:
1. 求解数组或链表中的特定问题:双指针可以用来解决一些特定的数组或链表问题,如判断链表是否有环、找到链表的中间节点、找到数组中的两个数等。
2. 滑动窗口问题:滑动窗口是指在一个固定大小的窗口内进行移动的一种技巧。双指针可以用于实现滑动窗口算法,以解决一些字符串或数组中的子串或子数组问题,如找到字符串中的最长无重复字符子串、找到数组中满足某种条件的最短连续子数组等。
3. 排序问题:双指针也可以用于解决排序相关的问题,如快速排序、归并排序等。双指针可以在不同的位置同时移动,以实现快速的交换和比较操作,从而实现排序的目的。
总的来说,双指针是一种灵活且高效的算法技巧,可以用于解决多种不同的问题。具体要根据不同的问题情况来选择使用双指针的方法和策略。
4.2双指针的实现
双指针可以实现以下几种操作:
4.2.1快慢指针
通过定义两个指针,一个移动速度较快,一个移动速度较慢,从而实现对数据结构的遍历或查找。通常情况下,快指针每次移动一定步数,而慢指针每次移动一步。这种方法常用于解决链表中的问题。
ListNode* findMiddle(ListNode* head) {ListNode* slow = head; // 慢指针ListNode* fast = head; // 快指针while (fast != nullptr && fast->next != nullptr) {slow = slow->next; // 慢指针每次移动一步fast = fast->next->next; // 快指针每次移动两步}return slow; // 返回慢指针指向的节点,即链表的中间节点
}
4.2.2左右指针
通过定义两个指针,一个指向数据结构的开头(一般为0),一个指向数据结构的末尾(一般为数组长度-1),从而在有序数组中进行搜索、查找或双向遍历。左指针向右移动,右指针向左移动,根据问题的要求,我们可以根据比较结果决定指针的移动策略。
int twoSum(vector<int>& nums, int target) {int left = 0; // 左指针int right = nums.size() - 1; // 右指针while (left < right) {int sum = nums[left] + nums[right]; // 当前左右指针指向的元素之和if (sum == target) {return true; // 如果和等于目标值,返回true}else if (sum < target) {left++; // 如果和小于目标值,左指针右移一位}else {right--; // 如果和大于目标值,右指针左移一位}}return false; // 如果找不到满足条件的两个元素,返回false
}
4.2.3 对撞指针
对撞指针也是一种常见的在有序数组或字符串中查找特定目标值的方法。通过定义两个指针,一个指向起始位置,一个指向结束位置,然后通过根据问题的要求,不断调整左指针和右指针的移动策略,来找到满足条件的解。
int binarySearch(vector<int>& nums, int target) {int left = 0; // 左指针int right = nums.size() - 1; // 右指针while (left <= right) {int mid = left + (right - left) / 2; // 中间位置的索引if (nums[mid] == target) {return mid; // 如果中间元素等于目标值,返回索引}else if (nums[mid] < target) {left = mid + 1; // 如果中间元素小于目标值,更新左指针为中间位置的右侧}else {right = mid - 1; // 如果中间元素大于目标值,更新右指针为中间位置的左侧}}return -1; // 如果找不到目标值,返回-1
}
4.2.4滑动窗口
这是一种在数组或字符串上定义一个窗口,通过调整窗口的大小和位置,来满足问题的要求。通常需要定义两个指针,一个指向窗口的起始位置,一个指向窗口的结束位置,然后根据条件来滑动窗口,得到问题的解。
int minSubArrayLen(int target, vector<int>& nums) {int left = 0; // 窗口左边界int sum = 0; // 窗口内元素的和int minLength = INT_MAX; // 最小子数组长度for (int right = 0; right < nums.size(); right++) {sum += nums[right]; // 右指针扩大窗口,累加元素while (sum >= target) { // 当窗口内元素之和大于等于目标值时minLength = min(minLength, right - left + 1); // 更新最小长度sum -= nums[left]; // 缩小窗口,左指针右移,从窗口中移除元素left++;}}return minLength == INT_MAX ? 0 : minLength; // 如果找不到满足条件的子数组,返回0
}
以上是一些常用的双指针的实现,它们常用于解决一些特定问题。
4.3双指针的练习
题目:给定一个整数数组和数组的大小n,要求将数组翻转。
步骤:
1. 定义两个指针:left指向数组的第一个元素,right指向数组的最后一个元素。
2. 进入循环,当left小于right时执行以下步骤:
- 交换left和right指向的元素。
- left向右移动一位。
- right向左移动一位。
3. 循环结束后,数组将按照相反的顺序排列。
知识点:
- 双指针:双指针技巧可以在数组中快速交换元素的位置。
- 数组操作:访问数组元素、数组下标、交换数组元素等基本操作。
流程图:
+---------------------------------------+| 初始化左指针和右指针 |+-----+-------------------------------+------+| |v v+-----|-------------------------------|-----+| 交换左指针和右指针指向的元素 |+-----+-----------------------+-------+------+| | v v+-----|-----------------------|-----+| 左指针右移 右指针左移 |+-------------------------------+------+
代码:
#include <iostream>
#include <vector>
using namespace std;void reverseArray(int nums[], int n) {int left = 0;int right = n - 1;while (left < right) {//双指针法swap(nums[left], nums[right]);left++;right--;}
}int main() {int n;cin >> n;int nums[n];for (int i = 0; i < n; i++) {cin >> nums[i];}reverseArray(nums, n);for (int i = 0; i < n; i++) {cout << nums[i] << " ";}cout << endl;return 0;
}
这段代码演示了如何使用双指针技巧将给定的数组进行翻转,在这里,我们使用了左右指针来解决这道题目。
运行结果:
左右指针执行图表:
5.NULL指针
NULL指针是一个特殊的指针常量,表示指针不指向任何有效的内存位置。它的作用在于表示一个无效的指针,可用于初始化指针变量,将其置为空值。
在C++中,NULL指针通常被定义为值为0的常量或者使用宏定义NULL。随着C++11标准的引入,还可以使用nullptr关键字表示空指针。
5.1NULL指针的操作
NULL指针在C++中可以进行如下操作:
5.1.1 初始化指针变量
可以将指针变量初始化为NULL,表示它不指向任何有效的内存位置。示例代码如下:
int* ptr = NULL;
5.1.2判断指针是否为空
可以使用if语句或条件表达式判断指针是否为空。示例代码如下:
if (ptr == NULL) {// 指针为空的处理逻辑
}// 或者使用条件表达式
bool isEmpty = (ptr == NULL);
5.1.3 赋值为NULL
可以将一个已经声明的指针变量赋值为NULL,表示将其指向空地址。示例代码如下:
int* ptr = new int; // 假设分配了一块动态内存
ptr = NULL; // 将指针赋值为空
5.1.4 检测NULL指针异常
在访问指针指向的内存之前,应该先判断指针是否为空,以避免空指针异常。示例代码如下:
if (ptr != NULL) {// 访问ptr指向的内存
} else {// 指针为空的处理逻辑
}
总之,NULL指针用于表示指针不指向任何有效的内存位置,可以进行初始化、判断、赋值等操作,以便于安全地处理指针相关的逻辑。
对了,这里大家需要注意一点,把指针赋值为NULL并不是没有给指针初始化,而是赋值为空,所以大家不必担心出现野指针。
总结
本篇博客到这里就结束了,感谢大家的支持与观看,如果有好的建议欢迎留言,制作不易,如果这篇文章对您有帮助,那请给PingdiGuo_guo一个免费的赞,谢谢大家啦!
相关文章:

C++指针(五)完结篇
个人主页:PingdiGuo_guo 收录专栏:C干货专栏 前言 相关文章:C指针(一)、C指针(二)、C指针(三)、C指针(四)万字图文详解! 本篇博客是介…...
使用registry镜像创建私有仓库
通过安装Docker后,Docker官网提供的registry镜像简单搭建一套本地私有仓库 1.通过registry镜像 ,做端口映射,创建一个容器,通过容器内的一个目录来创建私有仓库 并且将容器内仓库与本地路径做挂载 [rootnode1 ~]# docker run -d…...
前端发展史与优秀编程语言
前端开发是互联网技术领域中的一个重要分支,负责构建用户直接交互的网页和应用程序界面。随着互联网的发展,前端技术经历了多个阶段的演变,从最初的简单静态页面到如今的复杂交互式应用,不断推动着用户体验的提升和网页功能的丰富…...
利用SQL Server 进行报表统计的关键SQL语句与函数
在数据库应用中,报表统计是一项至关重要的任务,它为企业提供了数据洞察和决策支持。SQL Server作为一种强大的关系型数据库管理系统,提供了丰富的SQL语句和函数,可用于高效地进行报表统计。本文将介绍一些常用的SQL语句和函数&…...
【目标检测】旋转目标检测COCO格式标注转DOTAv1格式
DOTAv1数据集格式: imagesource:imagesource gsd:gsd x1, y1, x2, y2, x3, y3, x4, y4, category, difficult x1, y1, x2, y2, x3, y3, x4, y4, category, difficult ... imagesource: 图片来源 gsd: 分辨率 x1, y1, x2, y2, x3, y3, x4, y4:四边形的四…...

数据结构与算法:链式二叉树
上一篇文章我们结束了二叉树的顺序存储,本届内容我们来到二叉树的链式存储! 链式二叉树 1.链式二叉树的遍历1.1二叉树的前序,中序,后序遍历1.2 三种遍历方法代码实现 2. 获取相关个数2.1获取节点个数2.2获取叶节点个数2.3 获取树的…...
SpringMVC中接收参数总结
目录 一、引子 二、注解解析 RequestParam 一、要求形参名请求参数名,或者是请求实体类时(已有实体类),可以不需要加该注解 二、请求参数名!参数名时,需要写该注解RequestParam,其中 三、一名多值的情…...

使用 SPL 高效实现 Flink SLS Connector 下推
作者:潘伟龙(豁朗) 背景 日志服务 SLS 是云原生观测与分析平台,为 Log、Metric、Trace 等数据提供大规模、低成本、实时的平台化服务,基于日志服务的便捷的数据接入能力,可以将系统日志、业务日志等接入 …...

《日期类》的模拟实现
目录 前言: 头文件类与函数的定义Date.h 实现函数的Date.cpp 测试Test.cpp 运行结果: 前言: 我们在前面的两章初步学习认识了《类与对象》的概念,接下来我们将实现一个日期类,是我们的知识储备更加牢固。 头文件…...

RocketMQ架构详解
文章目录 概述RocketMQ架构rocketmq的工作流程Broker 高可用集群刷盘策略 概述 RocketMQ一个纯java、分布式、队列模型的开源消息中间件,前身是MetaQ,是阿里研发的一个队列模型的消息中间件,后开源给apache基金会成为了apache的顶级开源项目…...

【AI视野·今日NLP 自然语言处理论文速览 第八十二期】Tue, 5 Mar 2024
AI视野今日CS.NLP 自然语言处理论文速览 Tue, 5 Mar 2024 (showing first 100 of 175 entries) Totally 100 papers 👉上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Key-Point-Driven Data Synthesis with its Enhancement on Mathematica…...
windows 两个服务器远程文件夹同步,支持文件新增文件同步、修改文件同步、删除文件同步,根据文件大小和时间戳判断文件是否修改 python脚本
在Python中实现Windows两个服务器之间的文件夹同步,包括文件新增、修改和删除的同步,可以使用paramiko库进行SSH连接以及SFTP传输,并结合文件大小和时间戳判断文件是否发生过变化。以下是包含删除文件同步逻辑的完整脚本示例: im…...

vite项目修改node_modules
问题详情 在使用某个依赖的时候遇到了bug,提交issue后不想一直等待到作者更新版本,所以寻求临时自己解决 问题解决 在node_modules里找到需要修改的依赖,修改想要修改的代码 修改后记得保存 然后在node_modules里找到.vite文件夹&#x…...
NLP神器Transformers入门简单概述
在这篇博客中,我们将深入探索 🤗 Transformers —— 一个为 PyTorch、TensorFlow 和 JAX 设计的先进机器学习库。🤗 Transformers 提供了易于使用的 API 和工具,使得下载和训练前沿的预训练模型变得轻而易举。利用预训练模型不仅能减少计算成本和碳足迹,还能节省从头训练…...
微信小程序-wxml语法
介绍 WXML(WeiXin Markup Language)是框架设计的一套标签语言,可以进行页面布局,声明事件,数据绑定,条件判断。 语法 数据绑定 <view> {{message}} </view>// page.js Page({data: { // 状态…...
网络层转发分组的过程
分组转发都是基于目的主机所在网络的,这事因为互联网上的网络数远小于主机数,这样可以极大的压缩转发表的大小。当分组到达路由器后,路由器根据目的IP地址的网络地址前缀查找转发表,确定下一跳应当到哪个有路由器。因此࿰…...

计算两帧雷达数据之间的变换矩阵
文章目录 package.xmlCMakeLists.txtpoint_cloud_registration.cc运行结果 package.xml <?xml version"1.0"?> <package format"2"><name>point_cloud_registration</name><version>0.0.0</version><descriptio…...
2. gin中间件注意事项、路由拆分与注册技巧
文章目录 一、中间件二、Gin路由简介1、普通路由2、路由组 三、路由拆分与注册1、基本的路由注册2、路由拆分成单独文件或包3、路由拆分成多个文件4、路由拆分到不同的APP 一、中间件 在日常工作中,经常会有一些计算接口耗时和限流的操作,如果每写一个接…...

R语言复现:如何利用logistic逐步回归进行影响因素分析?
Logistic回归在医学科研、特别是观察性研究领域,无论是现况调查、病例对照研究、还是队列研究中都是大家经常用到的统计方法,而在影响因素研究筛选自变量时,大家习惯性用的比较多的还是先单后多,P<0.05纳入多因素研究&…...

【MySQL使用】show processlist 命令详解
show processlist 命令详解 一、命令含义二、命令返回参数三、Command值解释四、State值解释五、参考资料 一、命令含义 对于一个MySQL连接,或者说一个线程,任何时刻都有一个状态,该状态表示了MySQL当前正在做什么。SHOW PROCESSLIST 命令的…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...

cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...

接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...

【Linux】自动化构建-Make/Makefile
前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具:make/makfile 1.背景 在一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,mak…...