[問題] 關於 control flow 的改寫

看板C_and_CPP (C/C++)作者 (みなさん、こんにちは)時間8年前 (2018/01/29 17:49), 8年前編輯推噓13(1309)
留言22則, 8人參與, 8年前最新討論串1/1
開發平台(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://www.ptt.cc/bbs/C_and_CPP/M.1517219373.A.533.html

01/29 17:51, 8年前 , 1F
那你的 "c() only affects a()" 不會改變a()嗎?
01/29 17:51, 1F
我覺得 c() 不論有沒有影響 b() 應該不會影響控制的流程(? 實際上 在我的程式碼裡 c() 是會影響 b() 的 但是我希望能簡化問題 每次迭代的時候都會觸發 c() 使得 !a() 可能突然變成假而退出第三行的 while 在這樣的情況 下一行的 break 一定會發生而退出第一行的 while 但是如果是在 b() 為假的情況下退出的話 下一行的 break 就一定不會發生 OAO 簡短來說 我希望在第三行 while 發生 short circuit evaluation 的時候 直接跳出第一行的 while 不想再多一次已知結果的判斷

01/29 18:10, 8年前 , 2F
while(!a()){while(b()){c();}} ?
01/29 18:10, 2F
這樣 c() 可能會做過頭 XD 要同時 !a() 且 b() 都為真的時候才能做 c()

01/29 18:11, 8年前 , 3F
不call c()的話a()和b()就不會變嗎
01/29 18:11, 3F
是的 不是 multi-threading www

01/29 18:13, 8年前 , 4F
while (!a()) { if (b()) c(); } ? 我想的是這樣
01/29 18:13, 4F
這樣好像也不太對 XD

01/29 18:30, 8年前 , 5F
先確認一下
01/29 18:30, 5F

01/29 18:31, 8年前 , 6F
a=true => break, (a,b)=(false,true) => call c
01/29 18:31, 6F

01/29 18:31, 8年前 , 7F
(a,b)=(false,false) => loop 這會卡死?
01/29 18:31, 7F

01/29 18:31, 8年前 , 8F
我有理解錯嗎
01/29 18:31, 8F
對的 只是不會發生 loop 這麼慘的情況 XD 時序上 a() 一開始都是 false b() 則是有時真有時假

01/29 18:33, 8年前 , 9F
還有remaining code section可以動a()和b()吧
01/29 18:33, 9F
下面的 code section 都沒有 a() 跟 b()

01/29 18:47, 8年前 , 10F
while(!a()){if(b()){c();}else{//remain..}} 這樣等價吧
01/29 18:47, 10F
哈哈哈 你的好像是第一個對的...XD

01/29 18:47, 8年前 , 11F
too hard
01/29 18:47, 11F

01/29 18:49, 8年前 , 12F
看起來b()根本可以假設永遠是true
01/29 18:49, 12F

01/29 18:50, 8年前 , 13F
一變false就再也沒機會call到c了 不要看它比較好 XD
01/29 18:50, 13F

01/29 18:53, 8年前 , 14F
while(!a()){c();remain...} 就可以
01/29 18:53, 14F

01/29 18:54, 8年前 , 15F
如果b有side-effect再隨便找個地方放
01/29 18:54, 15F
已經補上流程圖 QQ 不能假設 b() 永遠是對的

01/29 18:58, 8年前 , 16F
我剛問的是remaining code會不會影響之後a()和b()的結果
01/29 18:58, 16F
會 而且一定會 OAO

01/29 19:11, 8年前 , 17F
這樣就 while(!a()){if(b()) c(); else d();}
01/29 19:11, 17F

01/29 19:12, 8年前 , 18F
你把你的流程圖調一下就可以看到這個結構
01/29 19:12, 18F
好像真的是這樣 THX >皿<

01/29 19:45, 8年前 , 19F
怒goto
01/29 19:45, 19F
感謝各位 QQ while (!a()) { if (b()) c(); else { //remain } } 是對的沒錯!! 好感動嗚嗚嗚 謝謝你們 wwwww

01/30 20:45, 8年前 , 20F
我都唸 肯輟flow
01/30 20:45, 20F

01/30 20:46, 8年前 , 21F
恥ずかしいね
01/30 20:46, 21F

02/01 21:11, 8年前 , 22F
えぇっ! 現在才發現原來是 恥ずかしいね
02/01 21:11, 22F
ばれたか!!! 恥ずかしい www ※ 編輯: Hazukashiine (122.116.185.23), 02/01/2018 22:29:23
文章代碼(AID): #1QRkujKp (C_and_CPP)
文章代碼(AID): #1QRkujKp (C_and_CPP)