作者Hazukashiine (みなさん、こんにちは)
看板C_and_CPP
标题[问题] 关於 control flow 的改写
时间Mon Jan 29 17:49:27 2018
开发平台(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() 必定为真
平常都可以改一下控制的逻辑
达到至少我满意的程度(?
不知道存不存在控制流程可以解决我的困扰 >皿<
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 122.116.185.23
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1517219373.A.533.html
1F:推 sunev: 那你的 "c() only affects a()" 不会改变a()吗? 01/29 17:51
我觉得 c() 不论有没有影响 b() 应该不会影响控制的流程(?
实际上 在我的程式码里 c() 是会影响 b() 的 但是我希望能简化问题
每次迭代的时候都会触发 c() 使得 !a() 可能突然变成假而退出第三行的 while
在这样的情况 下一行的 break 一定会发生而退出第一行的 while
但是如果是在 b() 为假的情况下退出的话 下一行的 break 就一定不会发生 OAO
简短来说 我希望在第三行 while 发生 short circuit evaluation 的时候
直接跳出第一行的 while 不想再多一次已知结果的判断
2F:推 sunev: while(!a()){while(b()){c();}} ? 01/29 18:10
这样 c() 可能会做过头 XD
要同时 !a() 且 b() 都为真的时候才能做 c()
3F:推 AstralBrain: 不call c()的话a()和b()就不会变吗 01/29 18:11
是的 不是 multi-threading www
4F:推 AstralBrain: while (!a()) { if (b()) c(); } ? 我想的是这样01/29 18:13
这样好像也不太对 XD
5F:推 AstralBrain: 先确认一下01/29 18:30
6F:→ AstralBrain: a=true => break, (a,b)=(false,true) => call c01/29 18:31
7F:→ AstralBrain: (a,b)=(false,false) => loop 这会卡死?01/29 18:31
8F:→ AstralBrain: 我有理解错吗01/29 18:31
对的 只是不会发生 loop 这麽惨的情况 XD
时序上 a() 一开始都是 false b() 则是有时真有时假
9F:推 ckc1ark: 还有remaining code section可以动a()和b()吧01/29 18:33
下面的 code section 都没有 a() 跟 b()
10F:推 ckc1ark: while(!a()){if(b()){c();}else{//remain..}} 这样等价吧01/29 18:47
哈哈哈 你的好像是第一个对的...XD
11F:→ MOONRAKER: too hard01/29 18:47
12F:推 AstralBrain: 看起来b()根本可以假设永远是true01/29 18:49
13F:→ AstralBrain: 一变false就再也没机会call到c了 不要看它比较好 XD01/29 18:50
14F:推 AstralBrain: while(!a()){c();remain...} 就可以01/29 18:53
15F:→ AstralBrain: 如果b有side-effect再随便找个地方放01/29 18:54
已经补上流程图 QQ 不能假设 b() 永远是对的
16F:推 ckc1ark: 我刚问的是remaining code会不会影响之後a()和b()的结果01/29 18:58
会 而且一定会 OAO
17F:推 LPH66: 这样就 while(!a()){if(b()) c(); else d();} 01/29 19:11
18F:→ LPH66: 你把你的流程图调一下就可以看到这个结构 01/29 19:12
好像真的是这样 THX >皿<
19F:推 chuegou: 怒goto 01/29 19:45
感谢各位 QQ
while (!a()) { if (b()) c(); else { //remain } }
是对的没错!! 好感动呜呜呜 谢谢你们 wwwww
20F:推 nova06091: 我都念 肯辍flow 01/30 20:45
21F:→ nova06091: 耻ずかしいね 01/30 20:46
22F:→ hunandy14: えぇっ! 现在才发现原来是 耻ずかしいね 02/01 21:11
ばれたか!!! 耻ずかしい www
※ 编辑: Hazukashiine (122.116.185.23), 02/01/2018 22:29:23