关于goto的使用

简介:

坛子里回答大家问题,讨论到了goto。比较有代表性,这里摘录出来。

删除 回复#7

阿东(C/C++爱好者) 13小时前

张初语(Java学生): vc不是开发环境么,c++是语言.一直以为是一样的呢,没想到还有这种区别啊. 
上面的我也会,不过我的"会"肯定和肖老师的会不在同一个字典上. 
果然是学得太

肖兄: 
4.类中静态数据成员,学了以后发现一直没用过 
5.虚函数但是常用,有些特性没虚函数都感觉实现不了 
6.从来不用异常,用goto------------------C++是反对用goto的难到正统的C程序不是这样吗。

  • 肖舸

    编辑 删除 #9

    肖舸 12小时前

    阿东(C/C++爱好者): 肖兄: 
    4.类中静态数据成员,学了以后发现一直没用过 
    5.虚函数但是常用,有些特性没虚函数都感觉实现不了 
    6.从来不用异常,用goto------------------C++是反对用goto的难

    呵呵,goto的用法,只要我说一次用goto,就有人反对一次。 
    上次开会,我公布我的编程规范,还差点打起来。 
    不过最后大家都还是用了,还觉得很好用。 
    人云亦云,自古有之,IT业也不能免俗啊。 
    事实上,大家想想,从1969年到现在,40年了,C语言没有取消goto语句,C++这么多年,居然也继承下来了,为什么? 
    那是因为每条语句一定有其特定的用途。具有不可替代性。 
    无数说面向对象编程的书籍,以及将模块化编程的书籍,对goto嗤之以鼻,视乎不批判goto就不足以说明自己的纯粹。 
    呵呵,先回到这里,我准备个例子传上来。

  • 肖舸

    编辑 删除 #10

    肖舸 12小时前

    例子一:不用goto,想想需要申请的指针是10个的话,程序怎么写? 
    void Func(void) 

            char* p1=null; 
            char* p2=null; 
            char* p3=null; 
            p1=(char*)malloc(10); 
            if(!p1) return; 
            p2=(char*)malloc(10); 
            if(!p2) 
            { 
                    free(p1); 
                    p1=null; 
                    return; 
            } 
            p3=(char*)malloc(10); 
            if(!p3) 
            { 
                    free(p1); 
                    p1=null; 
                    free(p2); 
                    p2=null; 
                    return; 
            } 
            //... 
            if(p1) 
            { 
                    free(p1); 
                    p1=null; 
            } 
            if(p2) 
            { 
                    free(p2); 
                    p2=null; 
            } 
            if(p3) 
            { 
                    free(p3); 
                    p3=null; 
            } 

    例子二:用goto 
    void Func(void) 

            char* p1=null; 
            char* p2=null; 
            char* p3=null; 
            p1=(char*)malloc(10); 
            if(!p1) goto Func_End_Process; 
            p2=(char*)malloc(10); 
            if(!p2) goto Func_End_Process; 
            p3=(char*)malloc(10);        
            if(!p3) goto Func_End_Process; 
            //... 
    Func_End_Process: 
            if(p1) 
            { 
                    free(p1); 
                    p1=null; 
            } 
            if(p2) 
            { 
                    free(p2); 
                    p2=null; 
            } 
            if(p3) 
            { 
                    free(p3); 
                    p3=null; 
            } 
    }

编辑 删除 #18

肖舸 9小时前

四川大学锦江学院 黄启银(C/C++学生): 就是你上面用的那申请10个指针而不用GOTO语句

这么说吧,程序开发中很多都有二元操作。 
malloc-free 
new-delete 
lock-unlock 
。。。 
这种操作在实际工程应用中很多。 
如果一个函数有多个出口,则在每个出口处,会产生巨大的退出代码,这样一来工作量大,程序员疲于奔命,二来全凭人脑记忆,稍微忘一件事情,就会出现内存泄漏,或者double-lock。 
而这些bug,在运行时全部是随机产生,几乎无法寻找。 
想想看,明天就要交活,而你还有个内存泄漏没找到,老板说,搞不定明天请你吃鱿鱼,你什么感觉? 
又或者,你到客户处做技术维护,整个电信局机房的人都看着你,旁边还有竞争对手在进谗言,说这家公司就这水平,呵呵,你却发现有内存泄漏,系统运行2小时后会挂掉,一头的汗水,什么感觉? 
所以我们规定,每个函数只能有一个出口,所有的资源释放必须放在出口统一解决,那么,不用goto,全部使用大括号,十几个,几十个if判断条件下来,你数数你的大括号有多深?根据缩进原则,屏幕宽度还够不?你还看得见你的代码吗? 
这种代码可读性好不好?万一写错了,好不好找错误? 
所有这些问题,一个goto就解决了

本文转自  tonyxiaohome  51CTO博客,原文链接:http://blog.51cto.com/tonyxiaohome/198735 ,如需转载请自行联系原作者

相关文章
|
6月前
|
C++
c++跳转语句goto的介绍
c++跳转语句goto的介绍
70 0
|
6月前
|
程序员 Go 开发者
Go语言中的跳转控制结构:`goto`、`break` 和 `continue`
【2月更文挑战第3天】在Go语言中,跳转控制结构允许程序员直接控制程序的执行流程,通过`goto`、`break`和`continue`关键字实现代码的跳转、退出循环或跳过循环的某次迭代。本文将深入探讨这些跳转控制结构的使用场景、注意事项以及最佳实践,帮助读者更好地理解和应用Go语言中的跳转控制结构。
|
小程序 C语言
goto的应用举例及详解
goto的应用举例及详解
85 0
|
程序员 C语言
|
程序员 Go 开发者
goto 和 return | 学习笔记
快速学习 goto 和 return
goto 和 return | 学习笔记
C/C++零散知识点汇总之break、continue、goto、return和exit
C/C++零散知识点汇总之break、continue、goto、return和exit
|
C语言
goto语句用法
goto语句用法
201 0