引言

在工程中,有些地方不可避免的需要使用到 goto语句和 if else嵌套语句,但往往这样会让代码的可读性变得极差,所以我们需要一种方法来消除上述两种语句,这就是下面要介绍的 do while(false)

条件语句嵌套的例子

1
2
3
4
5
6
7
8
9
10
11
12

if (one == true) {
// operation
if (two == true) {
// operation
if (three == true) {
// operation
//第三个依赖第二个判断结果,第二个依赖第一个判断结果。
//...
}
}
}

这样过多的括号嵌套,会使得可读性变得极差,这个时候,我们就可以利用防御性编程的一些技巧,来消除这种嵌套。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
do {
if (one == false) {
// operation
break;
}
if (two == false) {
// operation
break;
}
if (three == false) {
// operation
break;
}
} while (false);

这样,我们就可以消除嵌套循环带来的问题,一旦条件不满足直接退出。

**注:**这里如果不使用do while 循环,而是直接使用花括号,是无法提前跳出的。

goto语句的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int foo()
{
somestruct *ptr = malloc(...);

dosomething...;
if(error)
goto END;
dosomething...;
if(error)
goto END;
dosomething...;
END:
free(ptr);
return 0;
}

假设我们中途执行出现 error,我们想提前结束,这个时候,我们一般会想到使用 goto 语句来完成。

但是当代码量较大,业务较复杂时,会极大程度降低代码的可读性。

这里我们也可以用 do while(false) 来解决。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int foo()
{
somestruct *ptr = malloc(...);
do
{
dosomething...;
if(error)
break;
dosomething...;
if(error)
break;
dosomething...;
}
while(false);

free(ptr);
return 0;
}

这样,就避免了 goto 语句,还能提前跳出循环。