Debug 和 Release
Debug 为调试版本,程序中会有调试文件,运行时速度没有优化,文件体积对于Release版本过于
庞大
Release 为发布版本,是用户平常使用的版本,有优化运行速度,和缩减文件体积
调试
调试的环境准备
确认为Debug版本
调试的快捷键
F9:创建断点 和 取消断点
断电的作用:可以使程序执行到想要的位置暂停执行
F5:启动调试,常用来直接跳跃到下一个断点处(常与F9搭配使用)
F5 与 ctrl+F5的区别
F5:不是用于运行程序的,是用于调试程序的
ctrl+F5:直接运行,不调试
问题:连按3次F5,会直接结束调试吗?
不会for循环语句会在代码行 7,8,9,来回执行,所以断点处于的代码行9会停多次
代码行左侧红点代表为断点,可以按F9生成,或右击生成
可以右击代码进入条件断点,设置达成什么条件,才停止执行
F10:逐过程(一个代码一个代码执行)一个过程可以是函数调用,或者一条语句(不能进入函数内部)
F11:逐语句,每次执行一条语句,但可以进入函数内部
shift+F5:退出调试
监视:方便观察变量或内存中的值
名称可以放变量,表达式,地址
数组名是首元素地址
问题:求 1 !+2!+3!+4!+...10! 的和,请看下⾯的代码出现是什么问题:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int i = 0;
int j = 0;
int sum = 0;
int ret = 1;
for (i = 1; i <= 3; i++)
{
for (j = 1; j <= i; j++)
{
ret *= j;
}
sum += ret;
}
printf("%d\n", sum);
return 0;
}
由于 ret 没有重置所以,在计算3的阶乘时,ret 会带上2的阶乘继续*1*2*3=12
修正后
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int i = 0;
int j = 0;
int sum = 0;
int ret = 1;
for (i = 1; i <= 3; i++)
{
ret = 1;
for (j = 1; j <= i; j++)
{
ret *= j;
}
sum += ret;
}
printf("%d\n", sum);
return 0;
}
在这串代码的基础上可以进行优化如下
计算1到n的阶乘
1*1是1的阶乘
1*1*2是2的阶乘
在计算n的阶乘时这些都会出现
在过程中加上就行
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int i = 0;
int sum = 0;
int ret = 1;
for (i = 1; i <= 3; i++)
{
ret *= i;
sum += ret;
}
printf("%d\n", sum);
return 0;
}
问题:处于Debug 和 x86环境下时下面代码会发生什么情况?
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int i = 0;
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
for (i = 0; i <= 12; i++)
{
arr[i] = 0;
printf("hehe\n");
}
return 0;
}
运行结果:为死循环打印 "呵呵"
原因:
1. 栈区内存的使⽤习惯是从⾼地址向低地址使⽤,所以变量i的地址较⼤。arr数组的地址⼩于i的地址
2. 数组在内存中的存放是:随着下标的增⻓,地址是由低到⾼变化
变量i 和 数组arr 总是空2个整形吗?
不一定,是看环境的
vc.6.0 为连续存放
gcc 中间空1个整形
编程常⻅错误归类
1 编译型错误(ctrl+F7只进行编译)
编译型错误⼀般都是语法错误
2 链接型错误
• 标识符名不存在
• 拼写错误
• 头⽂件没包含
• 引⽤的库不存在
3.运行时错误