do-while的一种另类用法
设想场景,在一个函数的定义中。如果创建了一个对象(new的),在以后的操作中如果出现了异常我们需要释放该对象,返回false;反之释放对象,返回true
我们一般写法如下:
1 bool doWork 2 { 3 int *p = new int; 4 bool isOk = true; 5 isOk = fun1(); 6 if(!isOk) 7 { 8 delete p; 9 p = null; 10 return isOk; 11 } 12 isOk = fun2(); 13 if(!isOk) 14 { 15 delete p; 16 p = null; 17 return isOk; 18 } 19 isOk = fun3(); 20 if(!isOk) 21 { 22 delete p; 23 p = null; 24 return isOk; 25 } 26 27 delete p; 28 p = null; 29 return isOk; 30 }
啊哦,delete p; p = null; return isOk; 这三句话我们写了4遍,有好办法让代码简短写吗?看看下面
1 bool doWork() 2 { 3 int *p = new int; 4 bool isOk = true; 5 do 6 { 7 isOk = fun1(); 8 if(!isOk) break; 9 isOk = fun2(); 10 if(!isOk) brrak; 11 isOk = fun3(); 12 if(!isOk) break; 13 }while(0); 14 15 delete p; 16 p = null; 17 return isOk; 18 }
搞定,其实这种用法的妙处在于,使用do-while时我们没有着重使用它的循环功能,而是使用循环体中的break功能。
ps;为什么突然研究do while呢。最近在学习cocos2d-x发现在init场景时人们都喜欢把代码放到 do while(0)中,仔细想了想,又百度了一下,发现了原因。