4. 多多动手,尝试调试,才能有进步
一定要熟练掌握调试技巧。
初学者可能80%的时间在写代码,20%的时间在调试。但是一个程序员可能20%的时间在写程序,但是80%的时间在调试。
我们所讲的都是一些简单的调试。
以后可能会出现很复杂调试场景:多线程程序的调试等。
多多使用快捷键,提升效率。
5. 一些调试的实例
5.1 实例一
实现代码:求 1!+2!+3! …+ n! ;不考虑溢出。
int main() { int i = 0; int sum = 0;//保存最终结果 int n = 0; int ret = 1;//保存n的阶乘 scanf("%d", &n); //举一个1到3的阶乘,1到3,1!+2!+3!=1 + 2 + 6 =9但编译器结果为15 for (i = 1; i <= n; i++) { int j = 0; for (j = 1; j <= i; j++) { ret *= j; } sum += ret; } printf("%d\n", sum); return 0; }
举一个1到3的阶乘,1到3,1!+2!+3!=1 + 2 + 6 =9但编译器结果为15
这时候我们如果3,期待输出9,但实际输出的是15。
why?
这里我们就得找我们问题。
首先推测问题出现的原因。初步确定问题可能的原因最好。
实际上手调试很有必要。
调试的时候我们心里有数
int main() { int i = 0; int sum = 0;//保存最终结果 int n = 0; int ret = 1;//保存n的阶乘 scanf("%d", &n); for (i = 1; i <= n; i++) { int j = 0; ret = 1;//经过调试,这样改就对了 for (j = 1; j <= i; j++) { ret *= j; } sum += ret; } printf("%d\n", sum); return 0; }
5.2 实例二
#include <stdio.h> int main() { int i = 0; int arr[10] = { 0 }; for (i = 0; i <= 12; i++) { arr[i] = 0; printf("hehe\n"); } return 0; }
研究程序死循环的原因
原理:
i 和 arr 是局部变量,局部变量是放在栈区上的。
栈区内存的使用习惯是,先使用高地址处的空间,再使用低地址处的空间,再使用低地址处的空间。
数组随着下标的增长,地址是由低到高变化的。
注意:
该代码的运行结果是跟环境有关的。