编程终极技能-调试(下)

简介: 编程终极技能-调试

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


常见技巧:


  • 尽量使用assert
  • 尽量使用 const
  • 养成良好的编码习惯
  • 添加必要的注释


实例二


【strcpy库函数的实现】


/***
*char *strcpy(dst, src) - copy one string over another
*
*Purpose:
*       Copies the string src into the spot specified by
*       dest; assumes enough room.
*
*Entry:
*       char * dst - string over which "src" is to be copied
*       const char * src - string to be copied over "dst"
*
*Exit:
*       The address of "dst"
*
*Exceptions:
*******************************************************************************/
char * strcpy(char * dst, const char * src)
{
        char * cp = dst;
 assert(dst && src);
        while( *cp++ = *src++ )
               ;     /* Copy src over dst */
        return( dst );
}

仔细观察,这里库函数的第二个参数是被const修饰的。那么这里的const有什么作用呢?


const 的作用


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


const修饰指针时:


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


assert 的作用


assert的作用是:当程序运行时,若assert的括号中的条件不满足时,程序会强制提醒程序员。例如:


但是assert需要包含头文件:#include<assert.h>。


#include<stdio.h>
#include<assert.h>
int div1(int a, int b)
{
  assert(0);
  int ret = a / b;
  return ret;
}
int main()
{
  int a = 4;
  int b = 1;
  //scanf("%d %d", &a, &b);
  int ret = div1(a, b);
  printf("%d", ret);
  return 0;
}

23c65a1e406b2ae3ee92594f6d368922_5756db0538684b4fbc2ee1d89019ffb5.png


只要程序不满足assert括号中的语句,程序就会强制提醒用户出错的地方。


小练习:模拟实现strlen函数


#include<stdio.h>
#include<assert.h>
//模拟实现strlen函数
int MyStrlen(const char* arr)
{
  assert(arr != NULL);
  int count = 0;
  while (*arr != '\0')
  {
  count++;
  arr++;
  }
  return count;
}
int main()
{
  char arr[1000];
  gets(arr);//读取字符串
  int len = MyStrlen(arr);
  printf("%d \n", len);
  return 0;
}


这里要注意assert的使用和 const的使用。


6. 编程常见错误


编译型错误:


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


链接型错误:


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


运行时错误:


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


所以,还是要靠我们做一个有心人,积累排错经验。


7.完结


本章的内容就到这里啦,若有不足,欢迎评论区指正,最后,希望大佬们多多三连吧,下期见!


相关文章
|
18天前
|
存储 缓存 IDE
嵌入式开发中的几个有用的经验!
嵌入式开发中的几个有用的经验!
23 0
|
18天前
|
存储 程序员 编译器
程序员必备技能——调试技巧(二)
程序员必备技能——调试技巧(二)
29 0
|
18天前
|
程序员 Windows
程序员必备技能——调试技巧
程序员必备技能——调试技巧
42 0
|
8月前
|
人工智能 安全
编程利器Boit 使用详解
利用ai编程利器Boit 提高开发效率
60 0
|
10月前
|
程序员 编译器
编程终极技能-调试(上)
编程终极技能-调试
|
12月前
|
网络协议 Java
编程技能强化代码知识点整理
编程技能强化代码知识点整理
132 0
|
存储 程序员 编译器
【C/调试实用技巧】—作为程序员应如何面对并尝试解决Bug?
【C/调试实用技巧】—作为程序员应如何面对并尝试解决Bug?
110 0
|
人工智能 JSON 监控
【饭谈】小白必看,接口自动化的学习方向!!!
【饭谈】小白必看,接口自动化的学习方向!!!
|
设计模式 XML 人工智能
太牛了!Android开发高级工程师实战手写框架
导语 又到了金九银十的面试季,自己也不得不参与到这场战役中来,其实是从去年底就开始看,Android的好机会确实不太多,但也还好,3年+的android开发经历还是有一些面试机会的,不过确实不像几年前门槛那么低了,总的体会就是小的创业公司比较注重你的项目经历是否和自己的贴合,直接能过来独当一面。 大厂除了看中项目经历外,还比较注重你知识面的广度,是广度、深度和解决方案等多方面的考察,平时够工作要好好积累临时刷题只聊点皮毛估计是过不了关的。下面就总结一些大厂面试遇到必定会问的知识点,我把网络上讲解的最好的视频给大家整理出来了,各种风格的都有。
太牛了!Android开发高级工程师实战手写框架
|
算法 搜索推荐 NoSQL
「编程羽录」上线,程序员必备的这些技能你能get到嘛?
大家好,我是小羽。好久不见,给大家带来个好消息,小羽的全新专题「编程羽录」系列正式上新,主要是介绍一些关于面试题和经验总结的文章。会为大家提供一些技术栈之外,程序员还需要的其他方面硬核知识...
163 0
「编程羽录」上线,程序员必备的这些技能你能get到嘛?

热门文章

最新文章