[問題] 關於 control flow 的改寫
看板C_and_CPP (C/C++)作者Hazukashiine (みなさん、こんにちは)時間8年前 (2018/01/29 17:49)推噓13(13推 0噓 9→)留言22則, 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
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
01/29 18:10, 2F
這樣 c() 可能會做過頭 XD
要同時 !a() 且 b() 都為真的時候才能做 c()
推
01/29 18:11,
8年前
, 3F
01/29 18:11, 3F
是的 不是 multi-threading www
推
01/29 18:13,
8年前
, 4F
01/29 18:13, 4F
這樣好像也不太對 XD
推
01/29 18:30,
8年前
, 5F
01/29 18:30, 5F
→
01/29 18:31,
8年前
, 6F
01/29 18:31, 6F
→
01/29 18:31,
8年前
, 7F
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
01/29 18:33, 9F
下面的 code section 都沒有 a() 跟 b()
推
01/29 18:47,
8年前
, 10F
01/29 18:47, 10F
哈哈哈 你的好像是第一個對的...XD
→
01/29 18:47,
8年前
, 11F
01/29 18:47, 11F
推
01/29 18:49,
8年前
, 12F
01/29 18:49, 12F
→
01/29 18:50,
8年前
, 13F
01/29 18:50, 13F
推
01/29 18:53,
8年前
, 14F
01/29 18:53, 14F
→
01/29 18:54,
8年前
, 15F
01/29 18:54, 15F
已經補上流程圖 QQ 不能假設 b() 永遠是對的
推
01/29 18:58,
8年前
, 16F
01/29 18:58, 16F
會 而且一定會 OAO
推
01/29 19:11,
8年前
, 17F
01/29 19:11, 17F
→
01/29 19:12,
8年前
, 18F
01/29 19:12, 18F
好像真的是這樣 THX >皿<
推
01/29 19:45,
8年前
, 19F
01/29 19:45, 19F
感謝各位 QQ
while (!a()) { if (b()) c(); else { //remain } }
是對的沒錯!! 好感動嗚嗚嗚 謝謝你們 wwwww
推
01/30 20:45,
8年前
, 20F
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
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章