但是为了程序结构的清晰,还是要尽量限制goto语句的使用,我们可以使用do {...} while(0)结构配合break跳出单层的循环的方法来替代这种goto的用法。 1intfun(inta)2{3do{4if(1==a)5{6...//todo7break;8}9if(2==a)10{11...//todo12break;13}14}while(0);15...//todo16printf("a is error"\n)...
总体来说,do{...}while(0) 有两种用法。 一.定义宏,实现局部作用域 大家做c语言题目的时候,一道必考题就是 #define 的算术运算。 比如,我随手写一个最简单的 #define #define FUNC(x) x*3+4 ... int result = 2 * FUNC(3); result输出多少? 26? 错! 这是c语言新手一定会犯的错误,至少我上...
else直接就编译错误了。 也许你会说,我们代码的习惯是在每个判断后面加上{}, 就不会有这种问题了,也就不需要do...while了,如: if(...) { } else { } 诚然,这是一个好的,应该提倡的编程习惯,但是我们需要做的是让代码具有通用性,强壮性,因此我们更提倡do...while(0)的用法。 ===...
1. do...while(0)消除goto语句。 通常,如果在一个函数中开始要分配一些资源,然后在中途执行过程中如果遇到错误则退出函数,当然,退出前先释放资源,我们的代码可能是这样: version 1 boolExecute() { //分配资源 int*p =newint; boolbOk(true); //执行并进行错误处理 bOk = func1(); if(!bOk) { delete...
do...while(0) do...while(false)的妙用 在C++中,有三种类型的循环语句:for, while, 和do...while, 但是在一般应用中作循环时, 我们可能用for和while要多一些,do...while相对不受重视。 但是,最近在读我们项目的代码时,却发现了do...while的一些十分聪明的用法,不是用来做循环,而是用...
我们在写代码的时候都习惯在语句右面加上分号,如果在宏中使用{},代码里就相当于这样写了:“ { ... } ; ”,展开后就是这个样子 : if(a > 0) { foo1(); foo2(); }; 这样甚至不会编译通过。所以,很多人才采用了do{...}while(0); #define DOSOMETHING() ...
这样的代码肯定不是用来做循环,那么do...while(0)的作用是? 辅助定义复杂的宏,避免引用的时候出错,提高代码健壮性 本篇就来介绍do...while(0)的具体用法和使用原因 do..while(0)的优点 当我们看到上面那个宏定义非常复杂,我们自然而然地会想到,为啥不让他变成一个函数呢?在宏定义里面搞的这么多语句,不如直...
while, 但是在一般应用中作循环时, 我们可能用for和while要多一些,do…while相对不受重视。但是我发现了do…while的一些十分聪明的用法,不是用来做循环,而是用作其他来提高代码的健壮性。 1. do…while(0)消除goto语句通常,如果在一个函数中开始要分配一些资源,然后在中途执行过程中如果遇到错误则退出函数,当然...
如果我们使用do{...}while(0)来定义宏,即: #defineDOSOMETHING()do{ action1(); action2(); }while(0) 宏被展开后,上面的调用语句会保留初始的语义,同时绝大部分编译器都能够识别do{...}while(0)这种无用的循环并进行优化,不会导致性能优化的降低。