do while(false)

来源:互联网 发布:js获取一个id的值 编辑:程序博客网 时间:2024/05/12 11:13

使用do...break...while简化多级条件判断的结构。

 

如果你写过不少代码,那么一定会不时遇到类似下的情况:

假设要找到文件A,复制该文件为B;然后打开B文件,然后往B文件内写入一些内容;最后在写入成功后,我们需要再进行一些相关操作。

在此过程,遇到以下情况时将放弃后续的操作,认为是操作失败:

1、如果A文件不存在;

2、如果B文件已经存在,并且询问用户是否覆盖时,用户回答“不”;

3、无法复制出B文件;

4、无法打开B文件;

5、无法写入B文件;

6、无法正常关闭B文件。

 

用伪代码写该段程序为:

 

[c-sharp] view plain copy
  1. if( A文件存在 )   
  2.   
  3. {   
  4.   
  5.     执行A文件的相关操作;   
  6.   
  7.     if( B文件不存在 || 用户允许覆盖原有B文件)   
  8.   
  9.     {   
  10.   
  11.         复制A文件为B文件;   
  12.   
  13.         if(复制文件成功)   
  14.   
  15.         {   
  16.   
  17.             打开B文件;   
  18.   
  19.        if(打开文件成功)   
  20.   
  21.              {   
  22.   
  23.                 写入文件;   
  24.   
  25.          if(写入成功)   
  26.   
  27.          {   
  28.   
  29.                     关闭B文件;   
  30.   
  31.                     if(关闭成成功)   
  32.   
  33.            {   
  34.   
  35.                        执行其它必须在一切成功后进行的操作。   
  36.   
  37.              ……     
  38.   
  39.                      }   
  40.   
  41.                  }   
  42.   
  43.              }       
  44.   
  45.         }   
  46.   
  47.     }   
  48.   
  49. }   
  50.   
  51.     

可能有些操作和判断可以同时处理,但这个程序的繁琐仍然不可避免,而现实中程序的复杂性往往要远过于此例。从语法上看,这个例子没有任何错误,但它的一层套一层的条件判断却让人难以书写,阅读,调试,在复杂的情况就容易造成人为的错误(比如最马虎的,花括号匹配不对等……)。

 

同样一段代码“程序老鸟”是这样写的:

 

[c-sharp] view plain copy
  1. do  
  2.   
  3. {  
  4.   
  5.    if(A文件不存在)  
  6.   
  7.       break;  
  8.   
  9.    执行A文件的相关操作;   
  10.   
  11.     
  12.   
  13.    if(B文件存在 && 用户不允许覆盖)  
  14.   
  15.       break;  
  16.   
  17.      
  18.   
  19.    复制A文件为B文件;  
  20.   
  21.    if(复制不成功)  
  22.   
  23.       break;  
  24.   
  25.    
  26.   
  27.    打开B文件;  
  28.   
  29.    if(打开B文件不成功)  
  30.   
  31.       break;  
  32.   
  33.    
  34.   
  35.    写入文件;  
  36.   
  37.    if(写入文件不成功)  
  38.   
  39.       break;  
  40.   
  41.    
  42.   
  43.    关闭B文件;  
  44.   
  45.    if(关闭不成功)  
  46.   
  47.       break;  
  48.   
  49.     
  50.   
  51.     执行其它必须在一切成功后进行的操作。   
  52.   
  53.   ……     
  54.   
  55. }  
  56.   
  57. while(false);  

 

看,代码是不是“直”了很多?这里用了do..while,可是根本不是为了循环,而是为了使用它的break功能。每当有操作不成功,就直接用break跳出循环。所以循环条件总是一个“永假” false。

在一个程序中,这种结构相当的多,为了更加一步淡化while的原来的循环用途,我们非常值得在代码加入两个共用的宏:

#define  BEG_DOWHILE do {

#define  END_DOWHILE } while(false);

 

这里举的是do...while结构,在某些情况下,可以使用while...来实现类似功能。



do 
{
if(!pHeart->LoginLicense())
{
break;
}
if(!pHeart->MakeHeartBeat())
{
break;
}

} while (false);

return 0;

0
0 0