随缘指北 代码查错指北

代码差错指北

如题, 这是随缘更新的指北.

不严谨的统计显示, 程序员的工作时间中, 10%用于构思和写代码, 30%用于debug, 60%用于纠结该给变量起什么名字.

那么问题来了, 抢答!! PHP天下第一!!, 如何DEBUG才是高效的DEBUG呢?

LOG调试法

打LOG无论是在学习中还是在工作中都是极其重要的DEBUG方式. 1 那么就有人问了, 啥是打LOG?

LOG能帮我们:

对程序运行情况的记录和监控;

了解程序的运行状态

总而言之, LOG就是程序运行时输出的帮助我们辨别程序运行状态的输出.

通过LOG看变量的值

这点很显然, 程序执行到一半输出变量的值就能知道变量的值是多少. 废话 需要注意的是, 不仅仅能打印变量的值, 还能打印表达式的值.

举个例子: 优秀的X同学在做某道题的时候写出了以下的代码

1
2
3
4
5
6
long a;
scanf("%d",&a); // 注意这里有一个错误: 应该是%ld

if(a==-1){
执行某些代码
}

他输入了-1之后,发现本应执行的if语句内代码并没有被执行. 于是他就在第三行插入了 printf("%d",a==-1);, 发现输出的值是0, 意味着a并不等于-1. 意识到 a!=-1 之后, 优秀的X同学就意识到了scanf处出现了错误.

通过LOG判断程序执行的位置

看到上面的例子后, 各位可能有个疑惑: “X同学是怎么知道程序没有执行if语句内的内容呢?”

(做手势: 看看本节标题) 你是不是心中浮现了一个玄妙的想法: 只要在if语句内输出点东西就好了啊! 是不是特别神奇! (夸张脸)

说时迟, 那时快, 只见X同学飞快的敲下了以下代码

1
2
3
4
5
6
7
long a;
scanf("%d",&a); // 注意这里有一个错误: 应该是%ld

if(a==-1){
printf("这个东西应该输出的啊???");// 当然并没有输出
执行某些代码
}

当他按下了神圣的F11键之后, “当场他就懵了”, 陷入了沉思.

通过LOG查看递归调用的函数

这点可能课内还没有学到, 可以等讲完课后回来复习 (观众留存度++)

对于一个递归函数, 比如汉诺塔:

1
2
3
4
5
6
7
8
9
10
11
void hanoi(int n, char from, char via, char to) {
printf("将要从%c通过借助%c移动%d个盘子到%c\n",from,via,n,to);
if (n == 1)
move(from, to);
else {
hanoi(n - 1, from, to, via);
move(from, to);
hanoi(n - 1, via, from, to);
}
printf("已经从%c通过借助%c移动%d个盘子到%c\n",from,via,n,to);
}

室友调试法

把室友扥(den)过来, 完整的讲述你程序的思路给他听, (不用管室友是否真的在听), 一般讲到一半你就会意识到你哪儿错了

小黄鸭调试法

没有室友? 找一只小黄鸭放在桌子上给它讲述你的程序思路.