一、Debug 和 Release 区别
1.Debug 为调试版本
包含调试信息,不做任何优化,便于程序员调试程序,产生Debug.exe
可以调试,因为文件中包含了调试信息,文件比release大
2.Release 为发布版本
进行了各种优化,是程序在代码大小和运行速度是最优,产生Release.exe
不能调试,可以以处理一些小错误
二、快捷键
F5
启动调试,经常用来直接调到下一个断点,和F9配合使用
F9
创建和取消断点(代码执行到这停下来),可以在程序任意位置设置断点,使得程序在需要的位置停下来.
F10 逐过程
通常用来处理一个过程,一个过程可以是一次函数调用,或是一条语句,不进入函数内部
F11 逐语句
逐语句,每次都执行一条语句,可以使我们逻辑进入函数内部, shift+F11跳出函数
Ctrl+F5
开始执行不调试,想要程序不调试直接使用
监视窗口
调试-窗口-监视-监视1.....
三、 疑题:
#include<stdio.h>
main()
{
int i = 0;
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
for (i = 0; i <= 12; i++)
{
printf("hehe\n");
arr[i] = 0;
}
return 0;
}
以上代码将会循环输出原因:
arr数组下标越界, 系统将申请临时非法空间,给越界数组元素存储.
在栈存储过程中, 先默认使用 高地址 处的空间, 再使用 低地址 处的空间
数组随着下标增长,地址 由低到高变化
当arr数组越界时, arr[12] 地址 与 i 地址 碰巧重合, 所以把i的 值修改为了 0,从而循环.
vc6.0 环境 <=10 死循环
gcc编译器 <=11 死循环
vs2013 <=12 死循环
解决办法:
1.将数组定义,与下标定义调换 定义先后位置
2.切换为 release版本
栈存储示意图:
四、优秀代码:
- 运行正常
- bug少
- 效率高
- 可读性高
- 可维护性高
- 注释清晰
- 文档齐全
五、常见coding技巧
- 使用assert
- 尽量使用const
- 养成良好编码风格
- 添加必要的注释
- 避免编码的陷阱
六、assert()函数
头文件:assert.h
用法:断言函数,当函数内表达式为真时,什么都不发生, 当为假时,出现报错.
用途:(出现错误时,可以及时提醒,保证指针有效性)
七、 const 成员函数( const Member Functions)
在 C++ 中是一种特殊的成员函数,它保证不会修改对象的状态
用途1:当子函数传参时,在 形参前面加上const,确保形参不会修改值.
用途2: 定义变量时,放在类型前面, 如const int a=10; 将不能修改a的值.
const int *p, 修饰 指针变量 *p int * const p 修饰变量 p
八、常见错误
编译性错误
直接看错误提示信息,解决问题,双击提示信息,定位错误
链接性错误
看错误信息,标识符一般为 标识符名不存在或者拼写错误
运行时错误
借助调试,逐步定位