4.windows环境调试介绍
4.1调试环境的准备
在环境中选择 debug选项,才能使代码正常调试
4.2学会快捷键
最常使用的几个快捷键:
F5
- 启动调试,经常用来直接跳到下一个断点处
F9
- 创建断点和取消断点
- 断点的重要作用,可以在程序的任意位置设置断点
- 这样就可以使得程序在想要的位置随意停止执行,继而一步步执行下去
F10
- 逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句
F11
- 逐语句,就是每次都执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部
CTRL + F5
- 开始执行不调试,如果你想让程序直接运行起来而不调试就可以直接使用
在笔记本电脑上可以配合使用FN键
4.3调试的时候查看程序当前信息
1.查看临时变量的值
在调试开始之后,用于观察变量的值
2.查看内存信息
在调试开始之后,用于观察内存信息
3.查看调用堆栈
通过调用堆栈,可以清晰的反映函数的调用关系以及当前调用所处的位置
4.查看汇编信息
5.查看寄存器信息
可以查看当前运行环境的寄存器的使用信息
5.多多动手,尝试调试,才能进步
- 一定要熟练掌握调试技巧
- 初学者可能80%的时间在写代码,20%的时间在调试。但是一个程序员可能20%的时间在写程序,但是80%的时间在调试。
- 我们所讲的都是一些简单的调试。
- 以后可能会出现很复杂调试场景:多线程程序的调试等
- 多多使用快捷键,提升效率
6.如何写出好(易于调试)的代码
- 代码运行正常
- bug很少
- 效率高
- 可读性高
- 可维护性高
- 注释清晰
- 文档齐全
常见的coding技巧
- 使用assert(断言)
- 尽量使用const
- 养成良好的编码风格
- 添加必要的注释
- 避免编码的陷阱
assert
assert函数是C语言标准库<assert.h>中的一个函数,函数原型为:
voidassert(int expression)
该函数输入参数只有一个int类型参数,返回值为void类型
assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行
用法总结与注意事项
- 在函数开始处检验传入参数的合法性
- 每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败
- 不能使用改变环境的语句,因为assert只在Debug中生效,如果这么做,会使用程序在真正运行时遇到问题
- assert和后面的语句应空一行,以形成逻辑和视觉上的一致感
- 有的地方,assert不能代替条件过滤
const
常量指针
常量指针是指针指向的内容是常量,可以有以下两种定义方式
const int* n; int const* n;
常量指针说的是不能通过这个指针改变变量的值,但是可以通过其他的引用来改变变量的值
int a=5; const int* n=&a; a=6;
常量指针指向的值不能改变,但是这并不意味着指针本身不能改变,常量指针可以指向其他的地址
int a=5; int b=6; const int* n=&a; n=&b;
指针常量
指针常量是指指针本身是个常量,不能再指向其他的地址,写法如下
int*const n;
需要注意的是,指针常量指向的地址不能改变,但是地址中保存的数值是可以改变的,可以通过其他指向改地址的指针来修改
int a=5; int*p=&a; int* const n=&a; *p=8;
区分常量指针和指针常量
区分常量指针和指针常量的关键就在于星号(*)的位置,我们以星号为分界线
- 如果const在星号的左边,则为常量指针
- 如果const在星号的右边,则为指针常量
如果我们将星号读作"指针",将const读作‘常量'的话,内容正好符合。
- int const * n;是常量指针
- int * const n;是指针常量
7.编程常见的错误
7.1编译型错误
直接看错误提示信息(双击),解决问题,或者凭借经验就可以搞定
7.2链接型错误
看错误提示信息,主要再代码中找到错误信息中的标识符,然后定位问题所在
一般是标识符名不存在或者拼写错误
7.3运行时错误
借助调试,逐步定位问题