[問題] 關於 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