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

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

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.完结


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


相关文章
|
1月前
|
程序员 开发者
探索编程之旅:我的技术感悟与代码示例
【8月更文挑战第1天】在编程的世界里,我经历了无数的挑战和困惑。从最初的小白到现在的熟练开发者,我走过了一段充满艰辛和收获的旅程。在这篇文章中,我将分享一些我在编程过程中的感悟和经验,并结合具体的代码示例来阐述这些观点。希望这篇文章能够帮助初学者更好地理解编程,并为有经验的开发者提供一些新的思考方向。
|
4月前
|
程序员 Python
揭秘单步调试:掌握这一技能让你代码无懈可击
揭秘单步调试:掌握这一技能让你代码无懈可击
34 0
|
4月前
|
存储 缓存 IDE
嵌入式开发中的几个有用的经验!
嵌入式开发中的几个有用的经验!
38 0
|
4月前
|
程序员 Windows
程序员必备技能——调试技巧
程序员必备技能——调试技巧
62 0
|
4月前
|
存储 程序员 编译器
程序员必备技能——调试技巧(二)
程序员必备技能——调试技巧(二)
45 0
|
设计模式 分布式计算 算法
一些令人惊叹的编程方式:
一些令人惊叹的编程方式:
102 1
|
程序员 编译器
编程终极技能-调试(上)
编程终极技能-调试
|
IDE 程序员 编译器
必备技能:程序的调试
本节内容相对来说比较笼统一些,但是也是非常非常非常重要的一节内容,毕竟一个程序猿不能只会写bug,你写一堆bug谁来修呢?所以通过调试去排查错误的能力是一个优秀的程序猿必须要掌握的技能,而且不能仅仅是掌握,更要精通,本节内容总体来说只有两大部分,一是学习调试的方法,会有举例实际去感受一下,二是在写代码就要考虑的一些问题,养成良好的写代码习惯,防患于未然。
必备技能:程序的调试
|
编译器 C语言 C++
C++入门编程 ---- 助你更好理解C++的奥妙(二)
C++入门编程 ---- 助你更好理解C++的奥妙(二)
49 0
|
编译器 C语言 C++
C++入门编程 ---- 助你更好理解C++的奥妙(三)
C++入门编程 ---- 助你更好理解C++的奥妙(三)
73 0