下面给大家讲讲调试
先看一个程序 求1!+2!+3!.....+n!
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> int main(){ /*求1!+2!+3!.....+n!*//*二重循环*/ int n; printf("请输入n的值:"); scanf("%d", &n); int sum2 = 0;/*保存最终结果*/ int sum1 = 1;/*保存n!的结果*/ /*一重循环求1!+ ....n!*/ for (int u = 1; u <= n; u++){ /*二重循环求n!*/ for (int i = 1; i <= u; i++){ sum1 = sum1*i; } sum2 = sum2 + sum1; } printf("=%d\n", sum2); system("pause"); return 0; }
大家有没有发现这个代码有bug
调试bug的基本思路:
1.先观察现象,确定当前这样的现象是否是bug
2.定位问题,确定bug出现在代码的哪个部分,精确到行
3.分析问题原因
4.指定解决方案,修改问题
5.回归测试,检查刚才的bug有没有解决,以及是否引入新bug
核心就是定位bug,如何定位bug,核心思路"二分查找"
借助调试器"查看中间结果"
VS内置了调试器功能(各种调试器的基本功能都类似)
调试器的核心操作主要有:
1.打断点.让程序执行到某行就停下来
2.调试执行.使用F5来调试执行,SHIFT F5结束执行
接下来我们解决这个bug,首先打上断点 F5开始调试

开始执行后发现第三次循环中sum1的值出错

从新打断点调试

调试后发现就n!的第二次循环中sum1的值为4,原本值应该为2

继续执行我们发现n!的第三次循环中sum1的值为12,原本值应该为6

从这里分析出我们的问题
在算3!时sum1的初始值为2,是2!的结果,所以我们这个需要加入一个条件
使sum1在每一次循环时的初始值都为1;
修改后的代码
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> int main(){ /*求1!+2!+3!.....+n!*//*二重循环*/ int n; printf("请输入n的值:"); scanf("%d", &n); int sum1 = 1; /*保存n!的结果*/ int sum2 = 0;/*保存最终结果*/ /*一重循环求1!+ ....n!*/ for (int u = 1; u <= n; u++){ /*二重循环求n!*/ int i = 0; sum1 = 1; for (i = 1; i <= u; i++){ sum1 = sum1*i; } sum2 = sum2 + sum1; } printf("=%d\n", sum2); system("pause"); return 0; }
程序员工作大部分时间都是在找bug,而不是敲代码.
所以大家脑子里一定要有调试bug的基本思路,并且要活用打断点来调试.

浙公网安备 33010602011771号