关于C语言goto的使用

简介:
坛子里回答大家问题,讨论到了goto。比较有代表性,这里摘录出来。
 
张初语(Java学生): vc不是开发环境么,c++是语言.一直以为是一样的呢,没想到还有这种区别啊.
上面的我也会,不过我的"会"肯定和肖老师的会不在同一个字典上.
果然是学得太
肖兄:
4.类中静态数据成员,学了以后发现一直没用过
5.虚函数但是常用,有些特性没虚函数都感觉实现不了
6.从来不用异常,用goto------------------ C++是反对用goto的难到正统的C程序不是这样吗。
 
  • 肖舸
    阿东(C/C++爱好者): 肖兄:
    4.类中静态数据成员,学了以后发现一直没用过
    5.虚函数但是常用,有些特性没虚函数都感觉实现不了
    6.从来不用异常,用goto------------------C++是反对用goto的难
    呵呵,goto的用法,只要我说一次用goto,就有人反对一次。
    上次开会,我公布我的编程规范,还差点打起来。
    不过最后大家都还是用了,还觉得很好用。

    人云亦云,自古有之,IT业也不能免俗啊。

    事实上,大家想想,从1969年到现在,40年了,C语言没有取消goto语句,C++这么多年,居然也继承下来了,为什么?

    那是因为每条语句一定有其特定的用途。具有不可替代性。

    无数说面向对象编程的书籍,以及将模块化编程的书籍,对goto嗤之以鼻,视乎不批判goto就不足以说明自己的纯粹。

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

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

相关文章
|
3月前
|
编译器 C语言
C语言中的goto语句
C语言中的goto语句C语言中的goto语句 goto语句是C语言(及许多其他早期编程语言)中的一个控制流语句,它允许程序无条件地跳转到程序中的另一个位置。goto语句后面跟着一个标签(label),该标签是程序中某个语句之前的一个标识符。当执行到goto语句时,程序会立即跳转到与该标签相关联的语句处继续执行。 1. 基本概念与工作原理 基本概念:goto语句通过标签来指定跳转的目标位置。标签是一个以冒号:结尾的标识符,它可以放在程序中的任何语句之前(除了函数定义和变量声明的开始)。 工作原理:当执行到goto语句时,程序会查找与goto语句中指定的标签相匹配的标识符,并跳转到该标签所在的位置
|
5月前
|
C语言
【C语言基础篇】结构控制(下)转向语句break、continue、goto、return
【C语言基础篇】结构控制(下)转向语句break、continue、goto、return
|
6月前
|
编译器 C语言 C++
【C语言】分支和循环 ---- if、switch、while、for、goto语句, 理解getchar和putchar函数
【C语言】分支和循环 ---- if、switch、while、for、goto语句, 理解getchar和putchar函数
45 0
|
6月前
|
程序员 C语言 C++
C语言中的goto语句:使用、争议与最佳实践
C语言中的goto语句:使用、争议与最佳实践
684 1
|
6月前
|
程序员 C语言 C++
|
C语言
【零基础上手C语言】——分支和循环语句后篇(for,do while,goto)
C语言:分支和循环语句后篇(for,do while,goto)
200 0
【零基础上手C语言】——分支和循环语句后篇(for,do while,goto)
|
C语言
C语言的goto语句运用场景
C语言的goto语句运用场景
|
Go C语言
c语言学习第八课----goto语句与函数
c语言学习第八课----goto语句与函数
109 0
|
Go C语言
【C语言】循环语句 -- while -- for -- do while -- goto语句(三)
【C语言】循环语句 -- while -- for -- do while -- goto语句(三)
|
C语言
【C语言】循环语句 -- while -- for -- do while -- goto语句(二)
【C语言】循环语句 -- while -- for -- do while -- goto语句(二)