almasy 发表于 2010-11-5 08:32:02

keil C 没有goto语句的?

如题,求解

millwood0 发表于 2010-11-5 08:43:13

if you have to use "goto", you should NOT code for the rest of your life.

sipure 发表于 2010-11-5 08:59:31

有的. GOTO语句绝对禁用是教条的.只要时刻不忘程序要模块化低耦合,任何语句都可以用.

sunmy 发表于 2010-11-5 09:00:24

if you have to use "goto" in C , you should NOT code for the rest of your life.

goink 发表于 2010-11-5 09:02:54

回复【1楼】millwood0
if you have to use "goto", you should not code for the rest of your life.

-----------------------------------------------------------------------

这话绝对了,看来 millwood0 兄没弄过linux驱动,呵呵~~

zhaoxukiller 发表于 2010-11-5 09:03:06

goto 语句是可以用的,不过容易循环混乱。个人觉得如果循环嵌套不多,GOTO语句还是不错的

qwerttt 发表于 2010-11-5 09:05:46

用goto的,都是写程序逻辑轮乱

NowCan 发表于 2010-11-5 09:25:00

那不一定,有很多是为了高效。

snoopyzz 发表于 2010-11-5 09:55:19

goto安全的用法
1. 跳出多层循环
2. 跳到统一的函数结尾处返回(适用return需要做相同处理的情况)


其它时候,不用也罢,基本没有不能用do{break;}while(0); 或者inline函数中return代替的情况

flyhouse 发表于 2010-11-5 11:09:17

小范围跳还是不错的。

NJ8888 发表于 2010-11-5 11:32:26

下面是美国人写的代码

static int csmsh_setserialnum()
{
char buff[(OEMCFGBASESIZE_SERIAL_NUM*2)+1];
unsigned int bufflen = (OEMCFGBASESIZE_SERIAL_NUM*2);
int tmpret = 0;

buff[(OEMCFGBASESIZE_SERIAL_NUM*2)] = 0x0;

csmsh_macops->dbg.prompt_string_ser("Enter sevice serial number string (80 chars max)",
                                    (char*)buff, &bufflen);
/* bounds check user input */
if(bufflen < 1)
{
    csmsh_macops->dbg.pr_ser("ERROR: no user input\r\n");
    goto done_exit;
}
/* output what the user typed */
csmsh_macops->dbg.pr_ser("%d chars, data->%s<-\r\n", bufflen, buff);

/* now call the generic usb string descriptor write function */
tmpret = csmsh_macops->oemcfg.wrusbstrdesc(OEMCFGBASE_SERIAL_NUM, buff, bufflen);
if(tmpret != 0)
{
    csmsh_macops->dbg.pr_ser("ERROR: failed to write string to oem cfg, macerrno = 0x%X\r\n",
                           macerrno);
    goto done_exit;
}
done_exit:
return 0;
}

alengend 发表于 2010-11-5 11:40:15

我感觉应该具体问题具体分析,有些场合,可以谨慎的用一下。

Joyway 发表于 2010-11-5 12:07:14

有呢,我经常用的,不过还是少用好

QQ373466062 发表于 2010-11-5 12:15:58

linux内核中 使用了大家XX的goto
   
    看看MFC源码也可以看到Goto的身影   ......

hsztc 发表于 2010-11-5 12:39:13

【10楼】 888888888888

第一个goto 直接用 return 0; 代替

第二个goto 可以直接去掉

lsy5110 发表于 2010-11-5 12:40:20

看个人爱好

dengting 发表于 2010-11-5 13:11:11

不用GOTO,那是搞纯C++/或Java,搞模板编程之类的理论。
单片机编程,不用GOTO,那是SB呀

dengting 发表于 2010-11-5 13:16:54

回复【10楼】888888888888
下面是美国人写的代码
static int csmsh_setserialnum()
{
char buff[(oemcfgbasesize_serial_num*2)+1];
unsigned int bufflen = (oemcfgbasesize_serial_num*2);
int tmpret = 0;
buff[(oemcfgbasesize_serial_num*2)] = 0x0;
csmsh_macops-&gt;dbg.prompt_string_ser("enter sevice serial number string (80 chars max)",
                                    (char*)buff, &amp;bufflen);
/* bounds check user......
-----------------------------------------------------------------------

这代码不错呀,减少花括号与阶梯数,扩充性好,函数简单明了,效率高,有什么不好的。

almasy 发表于 2010-11-5 19:37:44

学习了,其实就是想偷懒,没偷着。只是看keil c的help文档中没找到关于GOTO的解释,特发此问,没想到大家讨论得这么激烈

rengo 发表于 2010-11-6 08:30:14

你瞅瞅你变出来的代码成汇编后再说。

banyai 发表于 2010-11-6 09:29:23

keil c里可以用goto的,一般一个函数中,所有的goto都跳转到函数末的一个进入点,逻辑上不会混乱,linux中有很多这样的代码。

sunnyhook 发表于 2010-11-6 11:28:33

break的性质和goto一样,单片机的程序还是可以用用的,毕竟能简化程序,增强运行速度。

diyman 发表于 2010-11-6 20:44:43

goto还是很有用的,尤其是在错误处理,或是取消注_册中还是蛮好的,总不能在程序中加入太多重复的代码,还不用遇到错误就跳转到错误处理程序的好。

qilujie 发表于 2010-11-6 20:59:31

回复【16楼】dengting 守望者
不用goto,那是搞纯c++/或java,搞模板编程之类的理论。
单片机编程,不用goto,那是sb呀
-----------------------------------------------------------------------

+1

hemjidn 发表于 2010-11-6 22:04:40

傻又如何说到这份上啥整就啥整!

kupica 发表于 2010-11-6 23:52:27

goto 不是给逻辑混乱的人用的,是给头脑清醒的人用的。
找到合适自己的方法最重要。
我有一同学,写程序从来一气呵成,里面全是goto,该用指针的地方用指针,不该用的地方也用。整个程序乱七八糟,一般人都读不懂,
但是,从来没出过错误,从来,根本不用仿真器,也不用测试部门去做后期测试,
编完程序,烧录芯片,立刻完美执行。

eduhf_123 发表于 2010-11-7 02:14:48

回复【25楼】kupica
goto 不是给逻辑混乱的人用的,是给头脑清醒的人用的。
找到合适自己的方法最重要。
我有一同学,写程序从来一气呵成,里面全是goto,该用指针的地方用指针,不该用的地方也用。整个程序乱七八糟,一般人都读不懂,
但是,从来没出过错误,从来,根本不用仿真器,也不用测试部门去做后期测试,
编完程序,烧录芯片,立刻完美执行。

-----------------------------------------------------------------------

这样的人写的程序,不出错还好,一旦出错,保管他自己都找不到问题出在什么地方。
另外,以这样的习惯远也写不了大程序、复杂程序。

rainyss 发表于 2010-11-7 14:28:55

回复【26楼】eduhf_123 经历
回复【25楼】kupica
goto 不是给逻辑混乱的人用的,是给头脑清醒的人用的。
找到合适自己的方法最重要。
我有一同学,写程序从来一气呵成,里面全是goto,该用指针的地方用指针,不该用的地方也用。整个程序乱七八糟,一般人都读不懂,
但是,从来没出过错误,从来,根本不用仿真器,也不用测试部门去做后期测试,
编完程序,烧录芯片,立刻完美执行。
-----------------------------------------------------------------------
这样的人写的程序,不出错还好,一旦出错,保管他自己都找不到问题出在什么地方。
另外,以这样的习惯远也写不了大程序、复杂程序。
-----------------------------------------------------------------------

用GOTO的人写不了大程序吗?你去看看LINUX内核吧.26楼说的是对的,goto 不是给逻辑混乱的人用的.

kupica 发表于 2010-11-7 15:55:53

-----------------------------------------------------------------------
这样的人写的程序,不出错还好,一旦出错,保管他自己都找不到问题出在什么地方。
另外,以这样的习惯远也写不了大程序、复杂程序。
-----------------------------------------------------------------------
既然编完程序,烧录芯片,立刻完美执行,就证明他的逻辑非常清晰,如果出错,他本人肯定能找出来。
富有创造性和高难度的软件工程,都是这种人写的,这种人就是程序天才。
那位大哥每月拿着3.5万的基本薪水,他的部门就3个人,一个人给他焊电路板,一个人给他的程序做注释。

uc-can-m3 发表于 2010-11-7 17:20:30

习惯在错误处理和退出时使用goto

alexshao1978 发表于 2010-11-8 10:46:14

楼上小白真多。。。学过MISRA后再来回话。。。
不要说用GOTO,就是函数多一条RETURN,在MISRA2004里面都是不允许的!!!
Rule 14.4 (required): The goto statement shall not be used.
Rule 14.7 (required): A function shall have a single point of exit at the end of the function.

另外,只有脑子清醒的程序员,才会用最简单的二分枝来实现多返回功能并且交由编译器优化成GOTO指令,同时使用BREAK在合适的位置退出循环。
换句话说,GOTO这个事情,交由编译器做,才是最合理的。。。

alexshao1978 发表于 2010-11-8 11:01:16

回复【28楼】kupica
-----------------------------------------------------------------------

关于这样的“人才”,才是中国软件工业问题的源泉。
10年前就听过一个“笑话”,说如果在印度进行一场软件编程考试,你会惊讶的发现,所以的学生,连变量的命名都是一样的!!!
个人感觉,就是这样的软件培训体系,造就了印度的软件工业。所有的程序员,都是工业链上的螺丝钉,标准且有效。
所以,印度的软件工业,可以以一个团队,与中国的一个“人才”对抗。
不按照标准化进行操作,靠个人才华进行开发,迟早会被一个按标准化开发的团队所超越。。。
或者说,国际化的过程中,已经越来越不允许这样的非标准化存在。

有所异议,欢迎拍砖。

ShawnLinson 发表于 2010-11-8 11:03:15

一个函数中最好只有一个return

banyai 发表于 2010-11-8 11:14:43

回复【28楼】kupica
-----------------------------------------------------------------------
这样的人写的程序,不出错还好,一旦出错,保管他自己都找不到问题出在什么地方。
另外,以这样的习惯远也写不了大程序、复杂程序。
-----------------------------------------------------------------------
既然编完程序,烧录芯片,立刻完美执行,就证明他的逻辑非常清晰,如果出错,他本人肯定能找出来。
富有创造性和高难度的软件工程,都是这种人写的,这种人就是程序天才。
那位大哥每月拿着3.5万的基本薪水,他的部门就3个人,一个人给他焊电路板,一个人给他的程序做注释。

-----------------------------------------------------------------------
我上次也见到一个人,用51汇编写了差不多250KB的程序,包括操作系统,液晶驱动,打印机驱动,菜单,通信,时钟,按键LED,主从机等等复杂功能,不用文档,不用伪代码和程序流程图,也没有任何参考代码,一周全部完成,一次编译,完美运行。经我和质量部经理一个月的测试,并送国家试验室检验,没有任何问题。佩服极了。

almasy 发表于 2010-11-8 11:24:11

不管goto本身如何,期待辩论得越激烈越好,小白我也能多学习学习

fy024 发表于 2010-11-8 11:39:50

goto语句我经常用的,只要不把自己都弄乱了就行,在单片机程序里面有时候用goto是很节省时间空间的,要是不能用,C里面还弄个goto出来做什么了~~~~

jpchen 发表于 2010-11-8 11:51:44

单片机因为资源有限,为了运行效率和节约空间,使用goto的几率确实比PC程序中要明显高一些,不过使用要慎重,不能因为允许使用就滥用。

kupica 发表于 2010-11-8 13:53:33

回复【31楼】alexshao1978 梦幻空花
回复【28楼】kupica
-----------------------------------------------------------------------
关于这样的“人才”,才是中国软件工业问题的源泉。
10年前就听过一个“笑话”,说如果在印度进行一场软件编程考试,你会惊讶的发现,所以的学生,连变量的命名都是一样的!!!
个人感觉,就是这样的软件培训体系,造就了印度的软件工业。所有的程序员,都是工业链上的螺丝钉,标准且有效。
所以,印度的软件工业,可以以一个团队,与中国的一个“人才”对抗。
不按照标准化进行操作,靠个人才华进行开发,迟早会被一个按标准化开发的团队所超越。。。
或者说,国际化的过程中,已经越来越不允许这样的非标准化存在。
有所异议,欢迎拍砖。
-----------------------------------------------------------------------

印度在给全世界的软件公司打工,输出劳力,真正创造性的东西,值钱的东西是别人的。
中国在给全世界的制造业公司打工,输出劳力,只是赚取产品本身3%都不到的利润。

团队里必须有天才,所以团队才能有灵魂。
即使是现在的科学研究,也只是沿着天才指示的道路做横向扩展。

为什么诺贝尔只是一两个人得,而不是集体得?

如果中国完全标准化,只能是中国多给西方人白打工。中国再延迟几十年获科学领域的诺贝尔奖。

还有补充一点。
西方电影里面大多宣传个人英雄主义对吧?
标准化虽然是西方提出的,但是一般只是针对控制产品质量的生产过程,
他们认为的真正意义上的开发和创造,从来不被标准所束缚。
因为他们相信,一个人真的可以抵得上一个国家。这也正是西方创造力的源泉。

uc-can-m3 发表于 2010-11-8 22:19:38

回复【32楼】ShawnLinson 昇
-----------------------------------------------------------------------

看看UCOS-II。要是真像你说的,效率不知低多少。

zhangli2020 发表于 2010-11-9 00:31:08

记号 等着学习…

qilujie 发表于 2010-11-9 19:04:19

印度在给全世界的软件公司打工,输出劳力,真正创造性的东西,值钱的东西是别人的。
中国在给全世界的制造业公司打工,输出劳力,只是赚取产品本身3%都不到的利润。

团队里必须有天才,所以团队才能有灵魂。
即使是现在的科学研究,也只是沿着天才指示的道路做横向扩展。

为什么诺贝尔只是一两个人得,而不是集体得?

如果中国完全标准化,只能是中国多给西方人白打工。中国再延迟几十年获科学领域的诺贝尔奖。

还有补充一点。
西方电影里面大多宣传个人英雄主义对吧?
标准化虽然是西方提出的,但是一般只是针对控制产品质量的生产过程,
他们认为的真正意义上的开发和创造,从来不被标准所束缚。
因为他们相信,一个人真的可以抵得上一个国家。这也正是西方创造力的源泉。

——————————————————————————————————————————————————
+1

alexshao1978 发表于 2010-11-10 12:57:14

回复【40楼】qilujie 福大狗
-----------------------------------------------------------------------

回复【37楼】kupica
-----------------------------------------------------------------------

一个中国人是条龙,一群中国人是群虫。WHY?
“天才”太多了,想法太多了,最后就没法形成团队了。

以发明著称的爱迪生,其1000多项发明,其中绝大多数都是其工作室完成冠以他的名义发表的。西方其实更讲究TEAM WORK。
这个从网游里面就能看出。。。魔兽必须是一个团队做任务,而国产网游一般都一个人杀一堆人。。。

eduhf_123 发表于 2010-11-10 21:10:23

印度在给全世界的软件公司打工,输出劳力,真正创造性的东西,值钱的东西是别人的。
中国在给全世界的制造业公司打工,输出劳力,只是赚取产品本身3%都不到的利润。

团队里必须有天才,所以团队才能有灵魂。
即使是现在的科学研究,也只是沿着天才指示的道路做横向扩展。

为什么诺贝尔只是一两个人得,而不是集体得?
----------------------------------------
问题在于,现在有“团队”么?有“集体”么?
连团队都没有,还谈什么“灵魂”,不搞笑么?
所谓的“爬都爬不好、就想着飞了”。

AWEN2000 发表于 2010-11-10 21:16:15

回复【6楼】qwerttt
用goto的,都是写程序逻辑轮乱
-----------------------------------------------------------------------

未必吧

有些时候需要用死循环while(1)

还真不如用goto 来的清晰

eduhf_123 发表于 2010-11-10 21:18:23

回复【33楼】banyai
我上次也见到一个人,用51汇编写了差不多250KB的程序,包括操作系统,液晶驱动,打印机驱动,菜单,通信,时钟,按键LED,主从机等等复杂功能,不用文档,不用伪代码和程序流程图,也没有任何参考代码,一周全部完成,一次编译,完美运行。经我和质量部经理一个月的测试,并送国家试验室检验,没有任何问题。佩服极了。
-----------------------------------------------------------------------

要是你在他的单位,等他走了、公司让你接手这个项目并且客户提出要求要做一点小改动的时候,估计你就不是佩服他而是恨死他了……

eduhf_123 发表于 2010-11-10 21:32:47

回复【27楼】rainyss
用GOTO的人写不了大程序吗?你去看看LINUX内核吧.26楼说的是对的,goto 不是给逻辑混乱的人用的.
-----------------------------------------------------------------------

首先我没有说用GOTO的人写不了大程序,我说的是,像这样“写程序从来一气呵成,里面全是goto,该用指针的地方用指针,不该用的地方也用。整个程序乱七八糟,一般人都读不懂”的人是写不了大程序的。

25楼的“goto 不是给逻辑混乱的人用的,是给头脑清醒的人用的。”的这个说法我非常赞同。但是我更想说的是,对有“是否应该用GOTO”这样疑问的人来说,GOTO最好别用,因为这样的人通常都是初学者、还无法驾驭GOTO;在团队开发的情况下,因为人员更替是很正常的事、因为不是所有CODER都是“头脑清醒的人”,对GOTO的使用就更应该慎重对待。

eduhf_123 发表于 2010-11-10 21:40:55

滥用GOTO,就意味着你拒绝了编译器所能执行的很多优化,因为你人为地打乱了程序的执行流程、破坏了程序的封闭性。

而滥用指针,则意味着你拒绝了编译器对某些变量的优化(将这些变量放入寄存器的优化,因为寄存器中的变量是无法取地址的);通常情况下,拒绝这样的优化就意味着一定程度的运行时性能损失。现在RISC被广泛采用、工作寄存器组被广泛使用的情况下,这个问题更是尤为突出。

wwwdege 发表于 2010-11-10 23:45:39

学习了.....

powerxia 发表于 2010-11-11 11:54:55

学习中,顶礼膜拜啊,都是牛人啊

zuogm 发表于 2010-11-11 13:18:08

最好不要用。

llemmx 发表于 2010-11-11 14:14:16

大家可以不用goto ,不过可以提个问题,如果没有goto uIP是如何诞生的

librae8226 发表于 2010-11-11 14:30:48

貌似从来没用过goto
但貌似据说大牛软件都有goto
于是乎看了几个linux/driver,确实goto了~

heuyck 发表于 2010-11-11 14:37:48

回复【14楼】hsztc
【10楼】 888888888888
第一个goto 直接用 return 0; 代替
第二个goto 可以直接去掉
-----------------------------------------------------------------------

第一个GOTO不可能去掉,要是哪天想把return 0改为return NO_ERR,你就得找那一堆return 0挨个改。
如果用了GOTO,直接改GOTO标号的那个return 0即可。
滥用return,我觉得比用goto更垃圾。

hsztc 发表于 2010-11-11 17:35:16

【52楼】 heuyck

那是你认为的,goto语句使用起来是很容易出错的,就是多加几个return 0也不想用goto

又是你认为的,你可以加个宏定义 #define abcreturn 0 ,

后面return 0全用abc来代,要改的话只要改这个宏定义就行了,何必要去找一堆,

这个宏是看到你的回复后写出来的,因为我从来没遇到过这么改代码的,也没用过这样的宏。


一般多个return如果值是一样的话,编译器会将多出来的return成生跳转语句,实际上也是一个return,

但使用return更安全。

kupica 发表于 2010-11-11 18:16:29

现在的编译器,优化能力未必好的过人的脑子,编译器越来越烂,越来越效率越低。
编译器自动优化,编译器是神?
现在的编译器,各种各样,什么样的都有,一堆二把刀搞出来的编译器,还能指望他自动优化,最多指望他能把高级语言变成汇编。

xiaobendan 发表于 2010-11-11 19:02:08

都是牛人,俺好像从来没有用过

hemjidn 发表于 2010-11-11 19:30:28

【54楼】 kupica
牛!用人脑优化代码!膜拜!
公开代码估计也没几个会懂!

USACH 发表于 2010-11-11 20:32:48

回复【1楼】millwood0
-----------------------------------------------------------------------

求中文解释,不能很好理解NOT。

god-father 发表于 2010-11-11 23:35:46

当然有

eduhf_123 发表于 2010-11-12 10:40:07

回复【54楼】kupica
现在的编译器,优化能力未必好的过人的脑子,编译器越来越烂,越来越效率越低。
编译器自动优化,编译器是神?
现在的编译器,各种各样,什么样的都有,一堆二把刀搞出来的编译器,还能指望他自动优化,最多指望他能把高级语言变成汇编。
-----------------------------------------------------------------------

这话说的没错,不过就我在46楼说的指针问题,我们还就只能靠编译器了,因为到目前为止,C语言中的“register”还只是对编译器的建议而不是命令。

修改原因:加入以下这段话:
另外,按你的说法,搞编译器的都是“二把刀”了,用编译器的人中的大部分,你能指望他们水平有多高?

kupica 发表于 2010-11-12 16:30:36

用编译器的人中的大部分,你能指望他们水平有多高?
-----------------------------------------------------------------------

正解!

tuy0326 发表于 2010-11-12 16:38:42

欢迎使用"goto"

pang7 发表于 2010-11-12 17:14:30

goto?我都是用 jmp的

jpchen 发表于 2010-11-12 19:06:52

我相信一个相对成熟的编译器优化能力比绝大部分程序员人工优化要好。

mtswz213 发表于 2010-11-12 19:55:22

什么话呢?怎么个不通用goto语句!

almasy 发表于 2010-11-29 11:38:36

都是牛人都是牛人,继续讨论讨论编译器让我们也多学点~~

rube 发表于 2010-11-29 13:36:35

函数内部用goto是可以的

bgb719 发表于 2010-11-29 22:05:23

毕业设计就用了GOTO,蛮好的~特别是在子模块中使用起来还是方便的

i387DX 发表于 2010-11-29 22:50:13

俺是老BASIC过来的,因此俺喜欢goto,幸好只是业余爱好不是搞专业的东东,凑合吧……

maomaomao007 发表于 2011-10-19 16:53:04

回复【3楼】sunmy 混沌
if you have to use "goto" in c , you should not code for the rest of your life.
-----------------------------------------------------------------------


如果从嵌套十几个循环中跳出,不知还有比GOTO更来得简洁的方法吗?

USACH 发表于 2011-10-19 21:03:27

既然在linux 内核中出现如此多的goto,那么用goto肯定是有道理的。

能在内核里出现的都是某方面大神级的。

大神用什么都是大神,正常人还是在有限的生命力远离无限梦魇般的“GOTO”吧。

自从上次想明白这事情以前,没用过goto。

WamingZhen 发表于 2011-10-19 21:28:17

Keil C中goto语句是有的,但谨慎使用~~

daoen518 发表于 2011-10-19 21:33:41

回复【楼主位】almasy 小陈同学
-----------------------------------------------------------------------

有的,不过很少人用,建议不要用,除非你很懂go to的用法。

fei959671016 发表于 2011-10-19 21:52:35

goto   ...

782169545 发表于 2011-10-19 22:40:10

学习了

cdmc 发表于 2011-10-19 22:47:16

有的,几年来从没用过

duozcg 发表于 2011-10-20 10:11:12

只要在特定的环境下适用就用,何必纠结于别人用不用

ll007j 发表于 2011-10-20 22:14:02

回复【楼主位】almasy小陈同学
-----------------------------------------------------------------------

c里面肯定是有GOTO的,单片机开发还是用汇编的好

liuerbin 发表于 2014-7-5 10:33:35

eduhf_123 发表于 2010-11-10 21:18
回复【33楼】banyai
我上次也见到一个人,用51汇编写了差不多250KB的程序,包括操作系统,液晶驱动,打印 ...

请问这样的人在哪个公司,膜拜中ing

zhangshixing 发表于 2014-7-5 14:12:03

有的时候用goto比用一大堆嵌套很深的if 什么的可读性更好。。。
页: [1]
查看完整版本: keil C 没有goto语句的?