用汇编的眼光看C++(之退出流程)

发表于:2012-5-23 09:43

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:feixiaoxing    来源:51Testing软件测试网采编

  通常情况下,我们创建一个对象时,需要各种各样的资源,等到所有资源都分配齐了,我们的代码才能开始工作。但是事实上,也存在很多分配失败的可能性。如果遇到了分配失败,那么我们就要对原来的资源进行释放处理。随着资源的总数越来越多,这个代码块就会显得越来越臃肿。那么有没有什么好的办法解决这一难题呢?goto就是一种好的选择。

void  process()
{
 if(/* get resources one */ == 0)
 {
  return;
 }

 if(/* get resource two  */ == 0)
 {
  
  goto fail_one;
 }

 if(/* get resource three */ == 0)
 {
  goto fail_two;
 }

 if(/* get resource four */ == 0)
 {
  
  goto fail_three;
 }

 /* ... */
fail_three:
 /* free resource three */

fail_two:
 /* free resource two */

fail_one:
 /* free resource one */
 return;
}

  (3) return也是跳出代码段一个很好的方法。

  它不光可以在函数中使用,也可以灵活运用在循环语句、判断语句中。要是在递归语句中,更是少不了他的身影。比如说,我们现在查看一个字符串是否满足这样一个结构:

  str = ab | a str b;

  那么换成函数代码应该怎么编写呢?大家可以自己先试一试,下面是我的一个方法:

BOOL process_multi_char(const char* str, int length)
{
 if(2 == length)
  return !strncmp(str, "ab", strlen("ab")) ? TRUE : FALSE;

 if(str[0] == 'a' && str[length -1] == 'b')
  return process_multi_char(str+1, length-2);
 else
  return FALSE;
}

BOOL process(const char str[], int length)
{
 if(NULL == str ||  length < 2 || (0 != length % 2))
  return FALSE;

 return process_multi_char(&str[0], length);
}

  这里return的好处就是充分把字符串进行了拆分。我们按照定义,先从基本的问题下手,大事化小,小事化了。当然这里的小事就是字符串这有两个字符的情形,也是最底层函数的出口。要不然函数就会一致不停地处理下去,这是没有意义的。计算过程中一旦发现了不合法的运算,那么整个迭代的过程就会结束,快速回溯,输出结果。所以说要想写好递归或者是用到堆栈结构的代码时,必须考虑代码的入口和出口的把握,而return就是最好的选择,什么时候return,什么时候迭代都要把握时机,否则很容易陷入到死循环当中去。

  【预告:下面的博客是用汇编的眼光看C++之嵌入式汇编】

相关链接:

用汇编的眼光看C++(开篇)

用汇编的眼光看C++ (之x86汇编)

用汇编的眼光看C++(之指针)

用汇编的眼光看C++(之判断流程)

用汇编的眼光看C++(之循环流程)

22/2<12
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号