通常情况下,我们创建一个对象时,需要各种各样的资源,等到所有资源都分配齐了,我们的代码才能开始工作。但是事实上,也存在很多分配失败的可能性。如果遇到了分配失败,那么我们就要对原来的资源进行释放处理。随着资源的总数越来越多,这个代码块就会显得越来越臃肿。那么有没有什么好的办法解决这一难题呢?goto就是一种好的选择。
void process() if(/* get resource two */ == 0) if(/* get resource three */ == 0) if(/* get resource four */ == 0) /* ... */ fail_two: fail_one: |
(3) return也是跳出代码段一个很好的方法。
它不光可以在函数中使用,也可以灵活运用在循环语句、判断语句中。要是在递归语句中,更是少不了他的身影。比如说,我们现在查看一个字符串是否满足这样一个结构:
str = ab | a str b;
那么换成函数代码应该怎么编写呢?大家可以自己先试一试,下面是我的一个方法:
BOOL process_multi_char(const char* str, int length) if(str[0] == 'a' && str[length -1] == 'b') BOOL process(const char str[], int length) return process_multi_char(&str[0], length); |
这里return的好处就是充分把字符串进行了拆分。我们按照定义,先从基本的问题下手,大事化小,小事化了。当然这里的小事就是字符串这有两个字符的情形,也是最底层函数的出口。要不然函数就会一致不停地处理下去,这是没有意义的。计算过程中一旦发现了不合法的运算,那么整个迭代的过程就会结束,快速回溯,输出结果。所以说要想写好递归或者是用到堆栈结构的代码时,必须考虑代码的入口和出口的把握,而return就是最好的选择,什么时候return,什么时候迭代都要把握时机,否则很容易陷入到死循环当中去。
【预告:下面的博客是用汇编的眼光看C++之嵌入式汇编】
相关链接: