do...break...while的一个“高级用法”

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

 

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

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

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

1、如果A文件不存在;

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

3、无法复制出B文件;

4、无法打开B文件;

5、无法写入B文件;

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

 

用伪代码写该段程序为:

if( A文件存在 ) 

{ 

    执行A文件的相关操作; 

    if( B文件不存在 || 用户允许覆盖原有B文件) 

    { 

        复制A文件为B文件; 

        if(复制文件成功) 

        { 

            打开B文件; 

       if(打开文件成功) 

             { 

                写入文件; 

         if(写入成功) 

         { 

                    关闭B文件; 

                    if(关闭成成功) 

           { 

                       执行其它必须在一切成功后进行的操作。 

             ……   

                     } 

                 } 

             }     

        } 

    } 

} 

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

 

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

do

{

   if(A文件不存在)

      break;

   执行A文件的相关操作; 

  

   if(B文件存在 && 用户不允许覆盖)

      break;

   

   复制A文件为B文件;

   if(复制不成功)

      break;

 

   打开B文件;

   if(打开B文件不成功)

      break;

 

   写入文件;

   if(写入文件不成功)

      break;

 

   关闭B文件;

   if(关闭不成功)

      break;

  

    执行其它必须在一切成功后进行的操作。 

  ……   

}

while(false);

看,代码是不是“直”了很多?

这里用了do..while,可是根本不是为了循环,而是为了使用它的break功能。

每当有操作不成功,就直接用break跳出循环。所以循环条件总是一个“永假” false。

猜你喜欢

转载自blog.csdn.net/johnt25/article/details/86711242