目录
调试
基本概念
bug
虫子,bug引申为是计算机的漏洞。我们接触最早的bug应该是cf的卡墙bug吧。最早出现的bug是,1947年计算机发生故障,经过排查,在计算机的继电器触电里,找到了一只被夹扁的小飞蛾,这只小虫子卡住了机器的运行,顺手将飞蛾夹在工作笔记里,并诙谐的把程序故障称为“bug”。
调试(debug)
调试(Debug),又称除错,是发现和减少计算机程序或电子仪器设备中的程序
调试步骤
- 发现错误
- 用隔离或消除的方式对错误代码进行定位
- 确定错误产生的原因
- 提出错误代码修改方法
Debug和Release
Debug是调试版本,包含调试信息,方便程序员进行代码调试
Release是发布版本,对代码进行各种优化,使得程序在速度和大小是最优
VS是集成开发环境(IDE)
VS2019 VS2022都是IDE,是集成开发环境(IDE),包括编辑器,编译器和调试器
调试的快捷键
F5 启动调试,立刻跳到断点处
F9 设置断点,断点还可以点击灰色地带(灰色框)
F5和F9配合使用,当代码执行到断点处,代码并不执行断点行,箭头指向printf时,但是不执行语句
F10 逐过程,遍历每个代码行。逐过程不会进入函数内部。
F11 逐语句,遍历每个代码语句。逐语句会进入函数内部,并且遍历语句
Ctrl+F5 不调试直接执行
调试窗口
监视
自动窗口
显示已经执行的代码的局部变量,监视的变量无法被修改,由调试器生成
局部窗口
显示执行代码语句的当前函数栈帧的局部变量,监视的变量无法被修改,由调试器生成
监视窗口
输入想要看到的的变量并且显示,监视的变量可以被修改,用户添加或删除
在局部函数中,数组退化成指针,查看数组只能查看第一个元素,要在监视窗口中输入: arr,n,n是数组的个数,查看数组后面多少个元素。
减少程序的错误
assert(表达式)
assert,断言,是assert.h库中的函数。assert中可以放入一个表达式,表达式的结果如果为假,就报错;如果为真,则跳过。
#include <assert.h> //导入assert函数
//strcpy函数复刻
void my_strcpy(char* dest, char* src)
{
//断言
//assert中可以放入一个表达式,表达式的结果如果为假,就报错,如果为真跳过
assert(src != NULL);
while (*dest++ = *src++)
;
}
int main()
{
char str1[20] = { 0 };
char str2[] = "hello baby!";
char* p = NULL;
my_strcpy(str1, p);
printf("%s\n", str1);
return 0;
}
运行结果
const + 变量
const+变量是保护该变量不被修改,只能读取,不能修改。
1. const 修饰非指针变量(int,char,float...)
const 保护变量不被修改,只能读取
int main()
{
const int a = 10;
const char b = 'a';
//a = 5; //报错
//b = 'c'; //报错
printf("%d %c",a,b); //可以正常读取
return 0;
}
2. const 修饰指针变量
const修饰指针变量分为两种情况
a) const 在 * 的左边
有两种形式,一种是 const int * pa,另外一种形式是 int const * pa, 两种形式不一样的写法,但const都在*的左边。都是保护指针变量指向的值不被修改,可以修改指针的指向,但不可以修改指针的指向的值
int main()
{
int num = 10;
const int* pa;
int const * pb; //pa和pb的写法,作用一样
pa = # //可以修改指针pa的指向
//*pa = 4; //报错
return 0;
}
b) const 在 * 的右边
一种形式,int* const pa。保护的是指针的指向不被修改,可以修改指针的值,但不能修改指针的指向
int main()
{
int num = 10;
int num1 = 5;
int* const pa = # //pa的指向无法被修改,但可以修改pa指向的值
//pa = num1; //报错
*pa = 6;
printf("%d", num);
return 0;
}