goto有goto是什么意思危害吗

为什么说GOTO有害?_百度知道
为什么说GOTO有害?
我有更好的答案
  主要批评goto的有2个原因:  1、降低代码的可读性。很多人管这类代码叫做Spaghetti code,说的就是代码写出来像是这么的一堆:另外早期像Basic这样频繁使用goto的语言都是有行号的,如果大量使用goto的话可能会造成代码的行号异常复杂,更加难读;  2、现在程序语言普遍的做法是用if-then-else这种结构来代替goto。因为认为大部分程序都可以通过避免使用goto来实现,以至于现在潜移默化的似的计算机语言往结构更加清晰的方向去发展。
资深电脑人
各种诡异用法甚至成了衡量程序员水平的标准之一。但在伟大的荷兰计算机科学家Dijkstra发表震惊计算机界的论文《goto有害论》,并且证明了所有 goto语句都可以被改写成不用goto语句的程序后,结构化程序设计理念兴起,一批结构化语言兴起,以algol为代表,后来的pascal、c等。 goto有害已经得到程序设计界一致的共识,现在基本上是常识了。虽然现在语言都保留了goto语句,但实际开发中,通常都会严格控制使用,比如限制在前后多少条语句范围内,在函数开始和goto以及标号语句处加上详细注释等。
本回答被提问者采纳
为您推荐:
其他类似问题
goto的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。感觉goto挺好用的,为什么java就没有呢_java吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:709,135贴子:
感觉goto挺好用的,为什么java就没有呢收藏
11级骗精系列   ---来自学园都市某受伤的自动贩卖机。
jvm内部用的高大上的玩意儿是不可能给码农用的
强行使用goto语句
逻辑混乱且易造成内存泄露
结构不好,只有汇编在用,很多书都不推荐使用GOTO语句,不符合OO设计思想!
中软高科java项目,分级教学+总监级讲师授课,名副其实小班授课,0基础0学费入学,可就业后付款,java项目,java项目欢迎实地考察,免费试听
java中的保留字...
Go To Statement Considered Harmful, 可以看下Dijkstra的这篇文章
thinking in java 这本书中对于Java中不使用goto解释的蛮好 个人看法
你可以考虑用break后加标签
黄瓜那么好用为什么广大女性同胞不用
break后面。goto只有在这个时候必须使用,调出多层判断
用多了会导致程序阅读性太差,C转过来的表示其实还是很喜欢用goto的
goto保留,到时java提供了另一种类似的用法,就是break标记,在循环的时候可以用。最近刚看到
觉得你肚子上开个洞,直接把饭塞进去挺好的,为什么要有嘴
不行就不行哪那么多废话想知道为什么自己去问java之父我还可以帮你
接口不是挺好吗?
楼上的x比门去跟11级的水货讲道理,也是醉了
登录百度帐号linux里面有很多goto,为什么明确不提倡用goto
[问题点数:81分,结帖人guotong1988]
linux里面有很多goto,为什么明确不提倡用goto
[问题点数:81分,结帖人guotong1988]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2013年6月 Linux/Unix社区大版内专家分月排行榜第二2013年5月 Linux/Unix社区大版内专家分月排行榜第二2013年3月 Linux/Unix社区大版内专家分月排行榜第二2013年1月 Linux/Unix社区大版内专家分月排行榜第二2012年12月 Linux/Unix社区大版内专家分月排行榜第二2012年8月 Linux/Unix社区大版内专家分月排行榜第二2011年12月 Linux/Unix社区大版内专家分月排行榜第二2011年10月 C/C++大版内专家分月排行榜第二2011年10月 Linux/Unix社区大版内专家分月排行榜第二
2012年6月 C/C++大版内专家分月排行榜第三2012年6月 PHP大版内专家分月排行榜第三2012年5月 C/C++大版内专家分月排行榜第三2012年3月 Linux/Unix社区大版内专家分月排行榜第三2012年2月 Linux/Unix社区大版内专家分月排行榜第三2011年11月 C/C++大版内专家分月排行榜第三
2012年10月 其他开发语言大版内专家分月排行榜第二2011年7月 其他开发语言大版内专家分月排行榜第二2010年3月 其他开发语言大版内专家分月排行榜第二2007年10月 其他开发语言大版内专家分月排行榜第二2007年9月 其他开发语言大版内专家分月排行榜第二2005年3月 Windows专区大版内专家分月排行榜第二2005年2月 Windows专区大版内专家分月排行榜第二2005年6月 扩充话题大版内专家分月排行榜第二2006年9月 其他开发语言大版内专家分月排行榜第二2006年5月 其他开发语言大版内专家分月排行榜第二2006年3月 其他开发语言大版内专家分月排行榜第二2006年2月 其他开发语言大版内专家分月排行榜第二2005年12月 其他开发语言大版内专家分月排行榜第二2005年4月 其他开发语言大版内专家分月排行榜第二2004年11月 其他开发语言大版内专家分月排行榜第二2005年3月 硬件使用大版内专家分月排行榜第二
2011年11月 其他开发语言大版内专家分月排行榜第三2011年8月 其他开发语言大版内专家分月排行榜第三2008年10月 其他开发语言大版内专家分月排行榜第三2004年9月 硬件/嵌入开发大版内专家分月排行榜第三
2012年11月 Linux/Unix社区大版内专家分月排行榜第二2011年8月 Linux/Unix社区大版内专家分月排行榜第二2008年10月 C/C++大版内专家分月排行榜第二
2012年8月 Linux/Unix社区大版内专家分月排行榜第三
2014年 总版技术专家分年内排行榜第二
2013年 总版技术专家分年内排行榜第三
2014年 总版技术专家分年内排行榜第二
2013年 总版技术专家分年内排行榜第三
2013年3月 C/C++大版内专家分月排行榜第三
2014年 总版技术专家分年内排行榜第二
2013年 总版技术专家分年内排行榜第三
2012年1月 其他开发语言大版内专家分月排行榜第二2011年5月 其他开发语言大版内专家分月排行榜第二2010年12月 其他开发语言大版内专家分月排行榜第二2009年2月 其他开发语言大版内专家分月排行榜第二2008年9月 其他开发语言大版内专家分月排行榜第二2008年8月 其他开发语言大版内专家分月排行榜第二2008年5月 其他开发语言大版内专家分月排行榜第二2007年11月 其他开发语言大版内专家分月排行榜第二
2011年4月 其他开发语言大版内专家分月排行榜第三2011年1月 其他开发语言大版内专家分月排行榜第三2009年6月 其他开发语言大版内专家分月排行榜第三2009年4月 其他开发语言大版内专家分月排行榜第三2009年1月 其他开发语言大版内专家分月排行榜第三2008年11月 其他开发语言大版内专家分月排行榜第三2008年7月 其他开发语言大版内专家分月排行榜第三2008年6月 其他开发语言大版内专家分月排行榜第三2006年9月 其他开发语言大版内专家分月排行榜第三
匿名用户不能发表回复!|程序设计为什么限制使用goto语句。_百度知道
程序设计为什么限制使用goto语句。
我有更好的答案
首先它使程序在理解上,运行上比较难理解,比较乱.然后貌似有个研究算法的人统计过大量代码得出,出错的概率和使用goto的频率是成正比的所以基本不用这个
采纳率:43%
只是容易乱,最好不用,没说不需用啊,我有时候都在用
为您推荐:
其他类似问题
goto语句的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。C++跳转语句之Goto对变量定义的影响详解
转载 &发布时间:日 09:17:32 & 投稿:daisy
goto语句也被称为无条件转移语句,这篇文章主要介绍了C++跳转语句之Goto对变量定义的影响,文中通过示例代码解文字介绍的很详细,相信对大家的理解和学习具有一定的参考借鉴价值,有需要的朋友们下面跟着小编一起来学习学习吧。
goto语句也称为无条件转移语句,其基本形式如下 :
语句标号由一个有效地标识符和符号";"组成,其中,标识符的命名规则与变量名称相同,即由字母、数字和下划线组成,且第一个字符必须是字母或下划线。执行goto语句后,程序就会跳转到语句标号处,并执行其后的语句。
通常goto语句与if条件语句连用,但是,goto语句在给程序带来灵活性的同时,也会使得使程序结构层次不清,而且不易读,所以要合理运用该语句。
我们经常碰到有在goto后面定义变量,linux下编译不通过的问题(报错信息:crosses initialization of)。其实,只要注意一下就好了,今天问了一下公司前辈之后,也翻了些资料,记录一下,加深记忆,也希望能对一些人有些许帮助。
错误示例代码:
#include &iostream&
int main()
int a = 0;
[root@localhost c-c++]# g++ goto_study.cpp
goto_study.cpp: In function 'int main()':
goto_study.cpp:31: error: jump to label 'Exit'
goto_study.cpp:29: error: from here
goto_study.cpp:30: error: crosses initialization of 'int a'
也不能说是正确的写法,只能说是编译OK的写法。
直接上代码:
改变域,变成局部变量:
int main()
int a = 0;
神奇的写法:
int main()
cout && "a = " && a &&
关键是还可以访问!结果:
[root@localhost c-c++]# g++ goto_study.cpp
[root@localhost c-c++]# ./a.out
a = 1259648
神奇的写法
看到两个可以编译通过的写法之后,最纳闷的是写法二为毛可以编译通过,而且还能使用???
参考[1][2]中提到了C++标准中的规定: & It is possible to transfer into a block, but not in a way that bypasses declarations with initialization. A program that jumps from a point where a local variable with automatic storage duration is not in scope to a point where it is in scope is ill-formed unless the variable has POD type (3.9) and is declared without an initializer.
意思是说:如果一个程序的执行路径从代码中的点A(某个局部变量x还未定义)跳到代码中另一点B(该局部变量x已定义,并且定义的时候有初始化),那么编译器会报错。这样的跳跃可以是由于执行goto语句,或者是switch-case造成的。所以,在写法二中a是int类型,是一个POD类型,并且没有初始化,所以编译通过。但是,很明显:如果去使用这个变量a的时候,结果是未知的,就像前辈说的,没有意义,还不如不支持!那如果只在局部使用,完全可以用花括号括起来!网上也有人说到,C++规范虽然没有明确说明这样是错误的,但是变量的域的规定其实是隐性说这种做法是不可取的,见参考[4]。
Goto can't skip over definitions of variables, because those variables would not exist after the jump, since lifetime of variable starts at the point of definition. The specification does not seem to explicitly mention goto must not do that, but it is implied in what is said about variable lifetime.
-fpermissive标记
参考[4]中提到,g++编译器默认是检查的,自己可以设置编译器的这个标记变成警告,未实践!!!
查了下资料-fpermissive标记的作用是: 把代码的语法错误作为警告,并继续编译进程,所以就安全起见,这个角度就不要想了,还是老老实实码砖!
参考[3],按照上面C++规定的说法,只要是POD类型,并且没有初始化都是可以编译通过的。
看一段代码:
#include &iostream&
// 注意:和B不同的是有构造和析构函数, 所以编译报错
void testA(){
cout && "A::test." &&
void testB(){
cout && "B::test." &&
int main()
// int a = 1; // windows ok.linux failed!
//A classA; // failed:
B classB; // success:
classB.testB();
classB.testB();
[root@localhost c-c++]# g++ goto_study.cpp
[root@localhost c-c++]# ./a.out
a = 1259648
&&&&& 1、以上代码在windows和linux下均编译通过和执行;
&&&&& 2、A classA一句在windows和linux均编译不通过!因为A有构造和析构函数,不满足条件;
&& && 3、至于int a = 1;这样的写法在windows(msvc)下面能够通过就与C++规范不符了,求解释!!!
以下是POD类型(还是看英文吧):
&&&&& 1、int, char, wchar_t, bool, float, double是POD类型,这些类型的long/short and signed/unsigned版本也是;
&&&&& 2、 指针(包括函数指针和成员指针)都是POD类型;
&&&&&&3、enums枚举类型;
&&&&& 4、POD的const和普通变量也都是;
&&&&& 5、POD类型的class,struct和union也是。但要求所有的成员是public,并且没有基类,没有构造、析构函数和虚函数。静态成员在这些规则下也是。
&&&&& 1、最好不要用goto;
&&&&& 2、goto后面不要跳过定义和初始化的变量,如果是POD类型可以先申明再定义,是不会编译报错的。但是不建议这么使用,可以看到如果执行语句跳过了赋值语句,那么变量的值是未知的,存在危险性;
&&&&& 3、goto后面如果是局部的变量,可以用花括号括起来构成一个局部域,就安全了。
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 python 有goto吗 的文章

 

随机推荐