看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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
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 不想再多一次已知結果的判斷
sunev: while(!a()){while(b()){c();}} ? 01/29 18:10
這樣 c() 可能會做過頭 XD 要同時 !a() 且 b() 都為真的時候才能做 c()
AstralBrain: 不call c()的話a()和b()就不會變嗎 01/29 18:11
是的 不是 multi-threading www
AstralBrain: while (!a()) { if (b()) c(); } ? 我想的是這樣01/29 18:13
這樣好像也不太對 XD
AstralBrain: 先確認一下01/29 18:30
AstralBrain: a=true => break, (a,b)=(false,true) => call c01/29 18:31
AstralBrain: (a,b)=(false,false) => loop 這會卡死?01/29 18:31
AstralBrain: 我有理解錯嗎01/29 18:31
對的 只是不會發生 loop 這麼慘的情況 XD 時序上 a() 一開始都是 false b() 則是有時真有時假
ckc1ark: 還有remaining code section可以動a()和b()吧01/29 18:33
下面的 code section 都沒有 a() 跟 b()
ckc1ark: while(!a()){if(b()){c();}else{//remain..}} 這樣等價吧01/29 18:47
哈哈哈 你的好像是第一個對的...XD
MOONRAKER: too hard01/29 18:47
AstralBrain: 看起來b()根本可以假設永遠是true01/29 18:49
AstralBrain: 一變false就再也沒機會call到c了 不要看它比較好 XD01/29 18:50
AstralBrain: while(!a()){c();remain...} 就可以01/29 18:53
AstralBrain: 如果b有side-effect再隨便找個地方放01/29 18:54
已經補上流程圖 QQ 不能假設 b() 永遠是對的
ckc1ark: 我剛問的是remaining code會不會影響之後a()和b()的結果01/29 18:58
會 而且一定會 OAO
LPH66: 這樣就 while(!a()){if(b()) c(); else d();} 01/29 19:11
LPH66: 你把你的流程圖調一下就可以看到這個結構 01/29 19:12
好像真的是這樣 THX >皿<
chuegou: 怒goto 01/29 19:45
感謝各位 QQ while (!a()) { if (b()) c(); else { //remain } } 是對的沒錯!! 好感動嗚嗚嗚 謝謝你們 wwwww
nova06091: 我都唸 肯輟flow 01/30 20:45
nova06091: 恥ずかしいね 01/30 20:46
hunandy14: えぇっ! 現在才發現原來是 恥ずかしいね 02/01 21:11
ばれたか!!! 恥ずかしい www ※ 編輯: Hazukashiine (122.116.185.23), 02/01/2018 22:29:23