《编程精粹 - Microsoft编写优质无错C程序秘诀》笔记一、二章

本文是《编程精粹》笔记,主要探讨了C程序中常见的错误,如边界问题、无意的赋值、参数传递错误,并提出了解决方案。此外,介绍了如何利用断言增强程序的错误检查能力,强调了在调试和交付版本中维护代码的重要性。
摘要由CSDN通过智能技术生成

1.假想的编译程序

1.1 代码边界问题

有时程序编译能够正确通过,代码也不存在语法问题,但是出现了与预期结果不符的问题,可能是定义的边界出现了问题

  • 如程序中有“差1”错误
while (i <= j)  // off by one error:this shoule be '<'

我在编程过程中遇到的“差1”错误最多与数组相关,如array或者vector等

int a[5] = {
   0};
//此时,我们想访问数组的最后一个元素,应该是a[4],因为数组的下标是从0开始的,如果写成a[5],就会得到意想不到的结果
vector<int> vec;
for (int i = 0; i <= vec.size(); i++)   //这里应该是 i < vec.size()
    cout << vec[i] << endl;
  • 越界错误
int itoa(short int i, char* str)  //algorithm error: itoa fails when i is  -32768

关于越界,其实和上面的问题一样,例如我们在进行加法运算时,如果结果超出数据存储范围,将会得到一个预期之外的数值,所以在二分法时,我会这样写程序

int start,end
int middle;
middle = start + (end - start) / 2;   //这里其实表达的意思就是 middle = (start + end) / 2; 但是start + end 可能会造成数据的越界错误
  • 参数传递错误
strCopy = memcpy(malloc(length), str, lenght);   //memcpy fails  when  malloc returns  NULL

这一点毋庸置疑,参数出现错误,自然希望程序不应该执行下去。我想到的是,在与用户交互时,用户输入的参数可能与我们预期的输入不相符时,我们通常采取的策略是先对参数进行判断,然后进行功能代码的编写。

int dosomething(Person* p, short int b)
{
   
    if (p == nullptr)
        return;
    if (b > 32768)
        return;
    
    //dosomething now
    ....
}

1.2 其它

void* memcpy(void* pvTo, void* pvFrom, size_t size)
{
   
    byte* pbTo = (byte*)pvTo; byte* pbFrom = (byte*)pvFrom;
    while(size-->0); 
    	*pbTo++ = *pbFrom++;
    return(pvTo); 
}

我们从程序的缩进情况就可以知道 while 表达式后由的分号肯定是个错误,但编译程序 却认为这是一个完全合法的 while 语句,其循环体为空语句。由于有时需要空语句,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值