当前位置: 首页 > news >正文

万盛集团网站建设/恩施seo整站优化哪家好

万盛集团网站建设,恩施seo整站优化哪家好,天津河东做网站哪家好,wordpress+搬瓦工迁移我们日常写代码的时候,常常会遇到bug的情况,这个时候像我这样的初学者就会像无头苍蝇一样这里改改那里删删,调试的重要性也就显现出来,这篇文章接着上文来讲解。 上文地址:(8条消息) 适合初学者的超详细实用调试技巧&…

我们日常写代码的时候,常常会遇到bug的情况,这个时候像我这样的初学者就会像无头苍蝇一样这里改改那里删删,调试的重要性也就显现出来,这篇文章接着上文来讲解。

上文地址:(8条消息) 适合初学者的超详细实用调试技巧(上)_陈大大陈的博客-CSDN博客

大概分为以下几个部分:

5. 一些调试的实例。

6. 如何写出好(易于调试)的代码。

7. 编程常见的错误。

话不多说,现在开始!

5. 一些调试的实例

5.1 实例一 

实现代码:求 1!+2!+3! ...+ n! ;不考虑溢出:

我们失误写出下面的错误代码:

#include<stdio.h>
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;for(j=1; j<=i; j++){ret *= j;}sum += ret;}printf("%d\n", sum);return 0;
}

我们输入1和2时,结果并没有错误。 

这时候我们如果输入3,期待输出9,但实际输出的是15。

为什么呢?

  1. 首先推测问题出现的原因。初步确定问题可能的原因最好。
  2.  实际上手调试很有必要。
  3.  调试的时候我们要做到心里有数

我们小试牛刀调试一下,首先分析问题所在。 编译器没有报错,说明代码没有语法的问题。

 输入3,按f11逐语句进行调试。

 一次循环下来,sum和ret都变为1,i变为1。

 第二次循环下来,仍然看不到什么问题,阶乘和其和也都正确。

在第三次循环,我们发现ret增长的速度十分的快,这才发现ret的值并没有重置为1 。

我们通过调试发现了错误,写出了正确的代码:


#include<stdio.h>
int main()
{int i = 0;int sum = 0;int n = 0;int ret = 1;scanf("%d", &n);for (i = 1; i <= n; i++){int j = 0;ret = 1;//将ret=1置于循环里for (j = 1; j <= i; j++){ret *= j;}sum += ret;}printf("%d\n", sum);return 0;
}

5.2.实例2

给出一个数组越界访问的例子,出自《C陷阱与缺陷》 。

#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;
}

 如图,程序会死循环打印hehe。

上一个代码可以不用调试看出来错误,但是这个是无法看出来的,只能调试来看。

 可以看到到这一步为止都十分正常,也就是i==12之前是正常的。

然而这一步之后,i和arr[i]就一同变成了0。

知道了问题所在,我们这次通过地址来调试看看。

 可以看到,当i==12时,i的地址和arr[i]的地址是相同的,也就是说,它们在栈区所开辟的空间相同。这样导致的结果就是,  arr[i] = 0的操作将i也一同变成了0,导致死循环


6. 如何写出好(易于调试)的代码。

6.1 优秀的代码 

优秀的代码应该满足以下条件。 

1. 代码运行正常

2. bug很少

3. 效率高

4. 可读性高

5. 可维护性高

6. 注释清晰

7. 文档齐全 

为了达到这样的条件,我们可以使用以下常见的coding技巧: 

1. 使用assert

2. 尽量使用const

3. 养成良好的编码风格

4. 添加必要的注释

5. 避免编码的陷阱。

6.2 示范 

我们来模拟实现库函数strcpy

函数的参数形式char* strcpy(char*destination,const char*source);

该参数说明了strcpy返回类型是char类型的指针,将源头(不能被改)拷贝到目的地。

strcpy特点和strlen类似,遇到‘\0’就停止。

比较容易想到的写法是:

#include<stdio.h>
#include<string.h>
#include<assert.h>
void my_strcpy(char* a, char* b)
{while (*a != '\0'){*b = *a;b++;a++;}*b = *a;
}
int main()
{char a[] = "abcdef";char b[10];my_strcpy(a, b);printf("%s", b);return 0;
}

 虽然可以实现strcpy函数的内容,但是优化不怎么样,将简单的功能写的非常麻烦,且无法避免空指针的情况,下面为优化后的写法:

#include<stdio.h>
#include<assert.h>
void my_strcpy(const char a[],char b[])
{assert(a!=NULL&&b!=NULL);//断言函数来避免空指针的情况while (*b++ = *a++){;//当*a为\0的时候,while里的值为假,跳出循环}
}
int main()
{char a[] = "abcdef";char b[10]="";//定义第二个数组来拷贝数组my_strcpy(a,b);printf("%s", b);return 0;
}

 值得注意的是,assert断言函数和const的使用,可以大大增加代码的安全性。

6.3 const的作用

#include <stdio.h>
//代码1
void test1()
{int n = 10;int m = 20;int *p = &n;*p = 20;//ok?p = &m; //ok?
}
void test2()
{//代码2int n = 10;int m = 20;const int* p = &n;*p = 20;//ok?p = &m; //ok?
}
void test3()
{int n = 10;int m = 20;int *const p = &n;*p = 20; //ok?p = &m;  //ok?
}
int main()
{//测试无cosnt的test1();//测试const放在*的左边test2();//测试const放在*的右边test3();return 0;
}

 结论:

const修饰指针变量的时候

1. const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改 变。但是指针变量本身的内容可变。

2. const如果放在*的右边,修饰的是指针变量本身,保证了指针变量的内容不能修改,但是指 针指向的内容,可以通过指针改变。


6.4. const的实例

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int my_strlen(const char a[])//用const来使代码更加安全
{int count = 0;while (* a++ != '\0'){count++;}return count;
}
int main()
{char a[]="abcdef";int b = my_strlen(a);printf("%d", b);return 0;
}

7.编程常见的错误 

7.1 编译型错误

直接看错误提示信息(双击),解决问题。或者凭借经验就可以搞定。相对来说简单。

如:逗号的使用,分号的添加,括号的对应,各类操作符的使用,库函数的使用格式等。

对于这种问题,我们可以直接通过错误列表的提示来定位问题所在,解决问题。 

7.2 链接型错误

看错误提示信息,主要在代码中找到错误信息中的标识符,然后定位问题所在。一般是标识符名不存在或者拼写错误。

 如:变量、头文件的包含,文件的引入,常量和宏的定义,库函数名的拼写,自定义函数名的一致等等。 

就例如将main写错为mian这样的错误。 

7.3 运行时错误

借助调试,逐步定位问题。最难搞。

如:栈溢出,逻辑漏洞,未指针的越界访,未初始化的变量,字符串溢出,数组越界,重复释放内存,使用无效的指针等等。

就像上文里的几个例子。

对于这样的问题,可以通过调试来解决


说了这么多,调试的章节终于结束了!

希望大家都能成为20%的时间在写程序,但是80%的时间在调试的程序员!

http://www.jmfq.cn/news/4947337.html

相关文章:

  • 微网站建设教程视频教程/公司企业网站制作需要多少钱
  • 网站推广优化平台/如何进行网络推广和宣传
  • 做python一个网站/友链交换有什么作用
  • 建设手机网站费用吗/预测2025年网络营销的发展
  • 建设牌官方网站/深圳网站seo优化公司
  • wordpress安装后设置/seo如何优化排名
  • 建设培训学校网站/中国最新军事新闻
  • 章丘营销型网站建设/百度问一问客服人工在线咨询
  • 大兴专业网站建设公司/互联网推广公司排名
  • wordpress更换背景/seo课程排行榜
  • 优秀大校网站/重庆网络seo公司
  • 网站怎么备案啊/北京seo优化外包
  • 海南网站优化公司/网站推广引流
  • 计科专业毕设做网站/企业推广策略
  • web开发技术介绍/seo测试
  • 利用百度云做网站/最近爆发什么病毒感染
  • 常州做的网站的公司网站/北京百度搜索排名优化
  • 美国做3d+h动画的网站/个人永久免费自助建站
  • 做不做我女朋友的网站/促销活动推广方案
  • 推广公众号平台的公司/seo排名培训学校
  • 网站开发技术教程/推广方案策略怎么写
  • 免费做网站软件下载/网站运营策划书
  • 深圳企业专业网站设计/广州网站定制多少钱
  • 地产平面网站/热门seo推广排名稳定
  • 做论坛网站多少钱/电子商务网站建设流程
  • 潍坊市建设一体化平台网站/淘宝指数网站
  • 云南建设厅网站执业注册/淘特app推广代理
  • 手机网站建设请示/发稿媒体平台
  • 网站开发设计思想/网页设计制作网站
  • 保险咨询网站留电话/友情链接怎么连