补:指针构造技巧
按照正确的顺序删除链表中的指针
可以先新后旧
不要吝啬指针变量的使用、要专建专用
避免之争的强制类型转换
错误示范1
2
3int a = l;
int *p = &a;
float *p1 = (float*)p;
删除和释放指针
指针、动态内存… 悬空指针、二次释放
1 | Assert(NULL!=pointers, "..."); |
删除变量之前检查非法指针
在删除或释放指针后把他们设为NULL
c++’s AUTO_PTR
注意:拷贝和赋值会转移指针所有权
语句 statement
正确性、可读性、可维护性
条件语句
首先写正常路径
检查最后一位else
检查等量的分支
if
后跟一个有意义的子句
布尔函数的策略
——例如,短路求值:c++和java以下是正确的1
while(i < MAX_ELEMENTS and item[i] <> 0)
利用短路求值的判断1
if((debominator != 0 && ((item / denominator) > MIN_VALUE))...
效率用上面的写法,保证正确性的写法是使用嵌套例子
问题——深层嵌套 避免的方法
- 重复判断某一部分条件——判断会变得更复杂
转换为
if-then-else
1
2
3
4
5
6
7
8
9
10
11
12//不合理的嵌套,需要用更利于理解逻辑的写法
if(10 < quantity){
if(100 < quantity){
if(1000 < quantity){
...
}
else{
...
}
}
...
}转换为
case
- 使用单独的子程序——循环体提取为子程序
- 使用OO方法——多态,不同的类封装不同的子程序
循环语句
判断循环是否会终止(死循环)
循环种类:计数循环、无限循环、迭代器循环、
循环灵活性和检查位置
带出口循环:半循环 改为 带出口的无限循环
把所有退出条件放在一起,防止检测调试时遗漏
- 使循环尽量模块化
三方面考虑循环控制
如何进入循环
- 只从一个位置进入循环——goto不用于跳出循环
- 初始化代码放在循环前面
- while(true) 无限循环
- 多使用for循环——控制代码集中在一起
- 在while循环更适用时,不用for——控制部分比较复杂
如何退出循环
- 要确认循环是否终止
- 终止条件要明显
- 为了终止循环,改变for的下标值
- 避免出现依赖于循环下标最终取值的行为——不要在循环终止后继续使用循环下标,因为下标值不可确定,且不易读
……
决策点(DECISION POINT)度量法
子程序的多处返回
缩进层次过深的循环
使用防卫子句重写
留心栈空间
递归 = 循环+栈……