C_and_CPP 板


LINE

開發平台(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/m.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







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Tech_Job站內搜尋

TOP