[问题] 关于 control flow 的改写

楼主: Hazukashiine (私は幸せです)   2018-01-29 17:49:27
开发平台(Platform): (Ex: Win10, Linux, ...) 平台无关
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出) 环境无关
额外使用到的函数库(Library Used): (Ex: OpenGL, ...) 无
问题(Question):
如何在不增加宣告变量和使用跳跃的情况下
写出语意等价但是不会重复判断的程式码(见下)
喂入的资料(Input): 无
预期的正确结果(Expected Output): 保持语意等价
错误结果(Wrong Output): 无
程式码(Code):(请善用置底文网页, 记得排版)
1: while (1)
2: {
3: while (!a() && b())
4: c(); // c() may affect a() and b()
5:
6: if (a())
7: break;
8:
9: // remaining code section
0: }
流程图大概是这样子 www
https://i.imgur.com/DBNP7ts.jpg
补充说明(Supplement):
由于有点洁癖的缘故
觉得相同的函数 a() 需要触发两次很碍眼(灿笑
而且 if (a()) 中的 a() 必定为真
若且唯若 while (!a() && b()) 的 a() 必定为真
平常都可以改一下控制的逻辑
达到至少我满意的程度(?
不知道存不存在控制流程可以解决我的困扰 >皿<
作者: sunev (Veritas)   2018-01-29 17:51:00
那你的 "c() only affects a()" 不会改变a()吗?while(!a()){while(b()){c();}} ?
作者: AstralBrain   2018-01-29 18:11:00
不call c()的话a()和b()就不会变吗while (!a()) { if (b()) c(); } ? 我想的是这样先确认一下a=true => break, (a,b)=(false,true) => call c(a,b)=(false,false) => loop 这会卡死?我有理解错吗
作者: ckc1ark (伪物)   2018-01-29 18:33:00
还有remaining code section可以动a()和b()吧while(!a()){if(b()){c();}else{//remain..}} 这样等价吧
作者: MOONRAKER (㊣牛鹤鳗毛人)   2018-01-29 18:47:00
too hard
作者: AstralBrain   2018-01-29 18:49:00
看起来b()根本可以假设永远是true一变false就再也没机会call到c了 不要看它比较好 XDwhile(!a()){c();remain...} 就可以如果b有side-effect再随便找个地方放
作者: ckc1ark (伪物)   2018-01-29 18:58:00
我刚问的是remaining code会不会影响之后a()和b()的结果
作者: LPH66 (-6.2598534e+18f)   2018-01-29 19:11:00
这样就 while(!a()){if(b()) c(); else d();}你把你的流程图调一下就可以看到这个结构
作者: chuegou (chuegou)   2018-01-29 19:45:00
怒goto
作者: nova06091   2018-01-30 20:45:00
我都唸 肯辍flow耻ずかしいね
作者: hunandy14 (Charlott.HonG)   2018-02-01 21:11:00
えぇっ! 现在才发现原来是 耻ずかしいね

Links booklink

Contact Us: admin [ a t ] ucptt.com