深入理解goto语句的替代实现方式分析

 更新时间:2013年05月23日 11:14:18   作者:  
本篇文章是对goto语句的替代实现方式进行了详细的分析介绍,需要的朋友参考下
曾几何时,goto是多么的让牛人绽放他们高超的精湛技术
曾几何时,goto又变成了万恶之首
曾几何时,goto只在教科书中的示例才会出现
有太多的理由不让用goto,但有时,我们又想使用goto的功能,怎么办?
用try/catch/finally便可实现同等于goto的功能,来看二个示例:
复制代码 代码如下:

try {
      // operation one
      if (failed) {
            throw Exception;
      }
      // operation two
      if (failed) {
            throw Exception;
      }
      // operation three
      if (failed) {
           throw Exception;
      }
} catch (Exception e) {
      // do something when cases failed
}

和:
复制代码 代码如下:

try {
     // operation one
     if (failed) {
         return;
     }
     // operation two
     if (failed) {
         return;
     }
      // operation three
      if (failed) {
          return;
      }
} finally {
      // do something when failed
}

以上二段都等同于:
复制代码 代码如下:

       // operation one
       if (failed) {
           goto when_failed;
       }
       // operation one
       if (failed) {
           goto when_failed;
       }
       // operation one
       if (failed) {
           goto when_failed;
       }
when_failed:
       // do something when failed

用异常的方式有些暴力,但确实能正确的帮助实现类似goto的功能;用return和finally虽不是很暴力,但是比较难控制,因为涉及到return语句,它会在finally块执行后得以执行,所以如果不想退出程序的话,这个方法还不如用异常来控制。
另外,break, continue也是比较强大的跳转语句,特别是break label和continue label,可以跳出一层循环或是多层循环; 但是要注意一点的是break只能在循环语句和switch语句中使用,continue只能在循环语句中使用。所以它们的局限性也很大。
这个小示例说明,goto不单单是一个语句,它是一种解决问题的思路和编程习惯,习惯了它的人,或者是想用它的人,即使不用goto也会写出类似goto逻辑出来。它的优点是会更容易的帮助找出解决方案。它的缺点也是众人皆知。但我们要避免的不单单是一个goto语句,而是这种“跳转式”的解决思路和编程习惯。

相关文章

  • Qt中QDateTimeEdit的具体使用

    Qt中QDateTimeEdit的具体使用

    本文主要介绍了Qt中QDateTimeEdit的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • 详解C++中typedef 和 #define 的区别

    详解C++中typedef 和 #define 的区别

    这篇文章主要介绍了C++中typedef 与 #define 的区别,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • Visual Studio Code 2020安装教程及CPP环境配置(教程图解)

    Visual Studio Code 2020安装教程及CPP环境配置(教程图解)

    这篇文章主要介绍了Visual Studio Code 2020安装教程、CPP环境配置,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • C++ typeid 和虚函数详解

    C++ typeid 和虚函数详解

    这篇文章主要介绍了c++ typeid 和虚函数的使用,帮助大家更好的理解和使用c++,感兴趣的朋友可以了解下,希望能够给你带来帮助
    2021-09-09
  • Linux网络编程之UDP Socket程序示例

    Linux网络编程之UDP Socket程序示例

    这篇文章主要介绍了Linux网络编程之UDP Socket程序示例,有助于读者在实践中掌握UDP协议的原理及应用方法,需要的朋友可以参考下
    2014-08-08
  • 快速了解Boost.Asio 的多线程模型

    快速了解Boost.Asio 的多线程模型

    这篇文章主要介绍了Boost.Asio 的多线程模型的相关知识,文中代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下
    2020-06-06
  • FFmpeg中AVIOContext的使用方法详解

    FFmpeg中AVIOContext的使用方法详解

    AVIOContext是FFMPEG管理输入输出数据的结构体,这篇文章主要为大家详细介绍了这个结构体的具体使用,文中的示例代码讲解详细,需要的可以参考一下
    2023-08-08
  • QT5连接MySQL实现增删改查

    QT5连接MySQL实现增删改查

    这篇文章主要为大家详细介绍了QT5如何连接MySQL实现增删改查功能,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的可以了解一下
    2022-12-12
  • vs运行时报C4996代码错误的问题解决

    vs运行时报C4996代码错误的问题解决

    C4996错误的意思:是VS觉得strcpy这函数不安全,建议你使更安全的函数,那么如何解决呢,本文主要介绍了vs运行时报C4996代码错误的问题解决,感兴趣的可以了解一下
    2024-01-01
  • C语言如何实现BOOL类型

    C语言如何实现BOOL类型

    这篇文章主要介绍了C语言如何实现BOOL类型问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02

最新评论