谁能改造这段代码,去掉goto语句

[复制链接]
3815|11
 楼主| djyos 发表于 2007-5-6 21:36 | 显示全部楼层 |阅读模式
code&nbsp;a;<br />if(b)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;code&nbsp;c;&nbsp;&nbsp;&nbsp;&nbsp;//b成立才可以执行&nbsp;c<br />&nbsp;&nbsp;&nbsp;&nbsp;if(d)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//执行code&nbsp;c&nbsp;产生条件d<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;code&nbsp;e;<br />&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;goto&nbsp;label;<br />}else<br />label:<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;code&nbsp;f;&nbsp;&nbsp;//f与a有很强的关联,用独立函数实现会很难看(n多参数)<br />}<br />code&nbsp;g;<br /><br />看了不少关于goto的争论,我对此持务实的中间态度,反对滥用,但并不绝对禁止使用,但象上述代码一样从一个条件句跳到另一个条件块,还是不想使用,但又想不出更好的办法,哪位大侠帮我想想?
平常人 发表于 2007-5-6 21:47 | 显示全部楼层

使用switch ... case ... 可以不用goto

  
high 发表于 2007-5-6 22:27 | 显示全部楼层

我也提供一个办法

setjump和longjump提供了和goto一样的,区域内跳转功能.
high 发表于 2007-5-6 22:29 | 显示全部楼层

//f与a有很强的关联,用独立函数实现会很难看(n多参数)

可以使用宏:<br />#define&nbsp;macroFun()&nbsp;do{&nbsp;code&nbsp;f;&nbsp;}&nbsp;while(0)
sodwell 发表于 2007-5-7 00:21 | 显示全部楼层

呵呵

把else后label处改为if,就不用else了,if(!b&&!d)就可以了,前一个if做完了都必须再判断一下条件,把d的条件处break跳出!<br />
ayb_ice 发表于 2007-5-7 07:50 | 显示全部楼层

把goto label换成将要执行的代码

把goto&nbsp;label换成将要执行的代码,也即重复写代码,好的编译器会编译成跳转指令,也即你的goto可以用...<br />另外巧妙的利用for,while,switch和break,continue也可以改造你这段代码...
sodwell 发表于 2007-5-7 12:15 | 显示全部楼层

换成将要执行的代码&nbsp;我还不知道编译器能不能自动换成goto,我觉得把第一层的if&nbsp;else改成两个if语句+置一个标志位判断就可以了
andrew.xu 发表于 2007-5-7 14:06 | 显示全部楼层

re:

code&nbsp;a;<br />if(b)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;code&nbsp;c;&nbsp;&nbsp;&nbsp;&nbsp;//b成立才可以执行&nbsp;c<br />&nbsp;&nbsp;&nbsp;&nbsp;if(d)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//执行code&nbsp;c&nbsp;产生条件d<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;code&nbsp;e;<br />&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;goto&nbsp;label;<br />}else<br />label:<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;code&nbsp;f;&nbsp;&nbsp;//f与a有很强的关联,用独立函数实现会很难看(n多参数)<br />}<br />code&nbsp;g;<br />============================================================<br />把c改成函数,返回d<br />code&nbsp;a;<br />if(b&nbsp;&&&nbsp;cd)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;因为要b成立才能执行c,所以要注意b和cd的位置<br />&nbsp;&nbsp;code&nbsp;e;<br />else<br />&nbsp;&nbsp;code&nbsp;f;<br />code&nbsp;g;<br />=============================================<br />看不懂楼下的意图<br />&nbsp;if(b){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;code&nbsp;c;&nbsp;&nbsp;&nbsp;&nbsp;//b成立才可以执行&nbsp;c<br />&nbsp;&nbsp;}else{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d&nbsp;=&nbsp;false;<br />&nbsp;&nbsp;}<br />是干什么?<br />感觉没用
dengm 发表于 2007-5-7 14:22 | 显示全部楼层

re: 不执行code c 也产生条件d

&nbsp;&nbsp;code&nbsp;a;<br /><br />&nbsp;&nbsp;if(b){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;code&nbsp;c;&nbsp;&nbsp;&nbsp;&nbsp;//b成立才可以执行&nbsp;c<br />&nbsp;&nbsp;}else{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d&nbsp;=&nbsp;false;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;if(b&nbsp;&&&nbsp;d)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//执行code&nbsp;c&nbsp;产生条件d<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;code&nbsp;e;<br />&nbsp;&nbsp;}else{<br />&nbsp;&nbsp;&nbsp;&nbsp;code&nbsp;f;&nbsp;&nbsp;//f与a有很强的关联,用独立函数实现会很难看(n多参数)<br />&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;code&nbsp;g;<br />
 楼主| djyos 发表于 2007-5-7 15:10 | 显示全部楼层

多谢各位

&nbsp;&nbsp;&nbsp;&nbsp;8楼:C语言并没有规定并行逻辑等式的执行顺序,因此编译器完全可能先执行后面的等式.<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;还是9楼和7楼的方法比较好,逻辑比较清晰,可读性也强,执行效率也只损失一点点,如果编译器够聪明的话,根本不损失执行效率.谢谢!
xufeng100 发表于 2007-5-8 11:51 | 显示全部楼层

谁能改造这段代码,去掉goto语句

code&nbsp;a;<br />d&nbsp;=&nbsp;1;<br />if(b)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;code&nbsp;c;&nbsp;&nbsp;&nbsp;&nbsp;//b成立才可以执行&nbsp;c<br />&nbsp;&nbsp;&nbsp;&nbsp;if(d)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//执行code&nbsp;c&nbsp;产生条件d<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;code&nbsp;e;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d&nbsp;=&nbsp;0;<br /><br />}<br />if(!b&nbsp;&&&nbsp;d)<br />label:<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;code&nbsp;f;&nbsp;&nbsp;//f与a有很强的关联,用独立函数实现会很难看(n多参数)<br />}<br />code&nbsp;g;
xplore 发表于 2007-5-8 12:38 | 显示全部楼层

使用最直观的编程方式

逻辑上直观<br /><br />看程序最容易理解即可。<br /><br />没必要避免使用 goto.<br /><br />为避免使用goto动脑筋,愚不可及!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

60

主题

454

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部