文章目录
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 语句,其循环体为空语句。由于有时需要空语句,