文章目录
- 6.调试举例1
- 7.调试举例2
- 8.调试举例3:数组
- 9.编程常⻅错误归类
- 9.1 编译型错误
- 9.2 链接型错误
- 9.3 运⾏时错误
–
6.调试举例1
求 1!+2!+3!+4!+…10! 的和。
int main() {
int n = 0;
int i = 0;
int ret = 1;
int sum = 0;
for (n = 1; n <= 3; n++) {
for (i = 1; i <= n; i++) {
ret = ret * i;
}
sum = sum + ret;
}
printf("%d\n", sum);
return 0;
}
实际上1!+2!+3!=1+2+6=9
,但这里是15,说明有问题。
我们可以通过调试,逐语句比较程序里的数据和自己内心想的数据有没有不同的地方。
最后,我们发现是少了一句ret=1
,于是补上了。
当然,我们也可以改进一下算法,使其更加高效。
int main() {
int n = 0;
int i = 0;
int ret = 1;
int sum = 0;
for (n = 1; n <= 3; n++) {
ret = ret * n;
sum = sum + ret;
}
printf("%d\n", sum);
return 0;
}
7.调试举例2
#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;
}
在VS2022、X86、Debug 的环境下,编译器不做任何优化的话,这个代码执行的结果是死循环了。
为啥?
我们打开监视,这个很奇怪吧,因为我们定义arr数组里面最多10个元素,现在却出现了arr[12],而且还有值。
我们继续执行下一次,发现i和arr[12]同时变成了0。
很神奇,那么为啥会这样?
在VS上切换到X64,这个使用的顺序就是相反的,在Release版本的程序中,这个使用的顺序也是相反的。
8.调试举例3:数组
arr3想看全就要写arr3,10
arr4想要看全就要写arr4,3
,只写arr4的话只能看到第一行的数组元素
9.编程常⻅错误归类
9.1 编译型错误
编译型错误一般都是语法错误,这类错误一般看错误信息就能找到一些蛛丝马迹的,双击错误信息也能初步的跳转到代码错误的地方或者附近。编译错误,随着语言的熟练掌握,会越来越少,也容易解决。
9.2 链接型错误
看错误提示信息,主要在代码中找到错误信息中的标识符,然后定位问题所在。一般是因为:
-
标识符名不存在
-
拼写错误
-
头文件没包含
-
引用的库不存在
9.3 运⾏时错误
运行时错误,是千变万化的,需要借助调试,逐步定位问题,调试解决的是运行时问题。