iT邦幫忙

0

寫C#程式多年,但從沒用過 do...while ,請問此迴圈寫法在什麼狀況下必用?

寫C#程式多年,如有遇到要做迴圈效果的,我大部份是用foreach ,少部份用for,從來沒有用過do ..while 迴圈,想說我算不算異類或是閉門造車,是不是有遺落什麼或錯失簡化程式碼的良機? 請先進指導一下,謝謝。

看更多先前的討論...收起先前的討論...
froce iT邦大師 4 級 ‧ 2019-11-05 09:04:57 檢舉
do while就是用在至少做一次迴圈的狀態下。
都用for去做基本上也沒啥問題。
do ..while 是鐵定會執行一次以上,因為結束條件是做完再檢查,FOR 是先檢查條件再做,兩者是不同的
什麼時候用 FOR 什麼時候用 DO 就看需求
沒有一定要用什麼的規定
ccutmis iT邦高手 9 級 ‧ 2019-11-05 09:30:08 檢舉
Q: 請問此迴圈寫法在什麼狀況下必用?
A: 在考題上註明須使用DO...WHILE解題的時候必用!
選我正解 XD
jhit03 iT邦新手 5 級 ‧ 2019-11-06 08:25:02 檢舉
我個人覺得,當無法決定或判斷這個程式迴圈的最大次數時,才用while 或 do ..while 迴圈,
不然我都會用FOR 直接限定迴圈最大值,以前我老師也不太建議都只使用while 或 do ..while
因為有些人思考邏輯較不清晰者,常常會寫成無限迴圈,執行程式沒反應,也不知道是當機還是在運算中
wilson1966 iT邦研究生 5 級 ‧ 2019-11-06 15:06:43 檢舉
jhit03 兄說的很有道理。
0
testh
iT邦新手 4 級 ‧ 2019-11-06 13:40:56
最佳解答
while(! XX.Eof){
    .....
    .....
     XX.Next();
}

XX 一般是檔案,或資料Table
不知何時結束

wilson1966 iT邦研究生 5 級 ‧ 2019-11-06 15:05:28 檢舉

好像 testh 比較合乎必用while的要求,因for 迴圈有受限條件,但讀檔案卻不知檔案的大小,只能用whil來做迴圈,每跑一次檢查一次,當是檔案底部即停止。

testh iT邦新手 4 級 ‧ 2019-11-07 03:14:59 檢舉

延伸
檔案>COM Port>USB,TCP/IP,FTP,Stream(Data,Video,Audio)...

0
海綿寶寶
iT邦超人 1 級 ‧ 2019-11-05 09:13:09

我第一個想到的就是提款機
請參考(9)关于取款的事务类:Withdrawl

選我正解

好奇問一下
為什麼會突然想問「多年來都用不到的語法」呢

wilson1966 iT邦研究生 5 級 ‧ 2019-11-05 10:37:31 檢舉

<好奇問一下
<為什麼會突然想問「多年來都用不到的語法」呢
看別人的程式碼偶爾有do while 迴圈,自己則奇怪這十幾年來,我居然沒有用到do while 迴圈。

那有空不妨一併看看有那些字從來沒用過囉
C# 保留字

2
小魚
iT邦大師 1 級 ‧ 2019-11-05 09:17:32

沒有必用的情況
While可以搞定一切。

看更多先前的回應...收起先前的回應...
wilson1966 iT邦研究生 5 級 ‧ 2019-11-05 10:40:56 檢舉

<<While可以搞定一切
我則是用 for 來搞定一切迴圈

小魚 iT邦大師 1 級 ‧ 2019-11-05 10:52:24 檢舉

也不是不行.

小魚 iT邦大師 1 級 ‧ 2019-11-05 12:34:47 檢舉

應該說do/while的歷史比Windows還要久,
語法基本上都會保留下來,
但是不代表它就是必要的.
我們真正使用到的語法可能不到一半甚至更少,
但是只要能解決問題用什麼語法其實不是問題.
等編譯成組合語言很多語法都是一樣的...
雖然我沒有在研究組合語言...

fillano iT邦超人 1 級 ‧ 2019-11-05 15:53:22 檢舉

參考維基:https://en.wikibooks.org/wiki/X86_Assembly/Control_Flow

可以知道:

  1. while、do while用條件式跳躍就可以實做(所以,用if跟go也可以實做)
  2. for loop,可能會用loop指令實做,但這其實用條件式跳躍也做的出來,只是用的指令可能會比較多

while還要先檢查

        cmp arg0, arg1
        je _next
_while: ...
        ...
        cmp arg0, arg1
        jne _while
_next:  ...

do...while反而簡單

_while: ...
        ...
        cmp arg0, arg1
        jne _while
        ...

loop來做固定次數的迴圈超簡潔

        mov cl, 10
_loop:  ...
        ...
        loop _loop
        ...

(cmp那一行知道意思就好,我隨便寫的。arg0/arg1應該是暫存器、記憶體或立即值,語法參考一下維基)

6
補覺鳴詩
iT邦新手 1 級 ‧ 2019-11-05 10:32:50

問到懂為止

    do
    {
        it 邦發問;
    } while (沒有搞懂);
}
看更多先前的回應...收起先前的回應...
dragonH iT邦大師 1 級 ‧ 2019-11-05 10:39:41 檢舉

可是應該是沒有搞懂才來問吧XD

所以應該是

while (沒有搞懂) {
    it 邦發問;
}

/images/emoticon/emoticon01.gif

wilson1966 iT邦研究生 5 級 ‧ 2019-11-05 10:42:59 檢舉

哈,也對,沒有搞懂while ,到底while是要放在前面或後面.

dragonH iT邦大師 1 級 ‧ 2019-11-05 10:46:04 檢舉

do while 會不管你懂不懂

先問再說XD/images/emoticon/emoticon48.gif

ccutmis iT邦高手 9 級 ‧ 2019-11-05 11:01:00 檢舉

先督(do)再說...然後就壞(while)了

dragonH iT邦大師 1 級 ‧ 2019-11-05 11:30:43 檢舉

/images/emoticon/emoticon27.gif

阿展展展 iT邦研究生 2 級 ‧ 2019-11-05 12:34:23 檢舉

ccutmis 壞壞哦

0
舜~
iT邦研究生 2 級 ‧ 2019-11-05 10:41:32

只有在 先處理後判斷 的情況下可以使用do-while

好處是 至少 執行一次

不過通常都不會想到用do-while來處理XD

wilson1966 iT邦研究生 5 級 ‧ 2019-11-05 10:45:03 檢舉

<<先處理後判斷
這for 迴圈也可用,當判斷為真時即break;

1
阿展展展
iT邦研究生 2 級 ‧ 2019-11-05 12:39:02

foreach for while do...while 各種都有自己的....粉絲群?
有人極端點 還只用if 哩

所以...不會是異類啦XDDD 只不過別人寫時你要看的懂就對惹

回到原命題

while 跟 do....while 最大的差別...
就是do...while至少做一次
while 可能連第一次都沒進去

沒有誰對誰錯 都是能用的
/images/emoticon/emoticon07.gif

3
bizpro
iT邦大師 1 級 ‧ 2019-11-05 15:35:04

寫C#程式多年,如有遇到要做迴圈效果的,我大部份是用foreach ,少部份用for,從來沒有用過do ..while 迴圈,想說我算不算異類或是閉門造車,是不是有遺落什麼或錯失簡化程式碼的良機? 請先進指導一下,謝謝。

迴圈是昂貴的。 for/while迴圈使用較少的CPU處理資源,foreach則較耗CPU資源。當然,也許不差那幾毫秒。我的看法是,能不浪費就不浪費。

至於do ... while. 我是常用。這是一種邏輯思考的習慣。想清楚如果至少要執行一次,真的需要先進入迴圈嗎? 如果大部份情況是只須執行一次,那就用do...while, 而且,大部份的編譯器是將while/for/foreach...編譯成第一個判斷式(if)加上do...while,也就是說,對CPU來看,do while少了一次邏輯判斷. 同樣地,也許不差那幾毫秒。

如果要處理AI, 大數據,或複雜的圖形...,那會有很大的差異的。年初我用Javascript寫的一個案子就用了許多do..while, 因為是前端圖形演算法,對瀏覽器來說,運算效能較差,一次運算差幾毫秒乘上幾萬幾十萬就有差。

0
frogsoul
iT邦新手 4 級 ‧ 2019-11-06 09:27:44

個人有個習慣,可以當個參考...

當有一段程式碼隨時會因為各種條件中斷,
但是後續又有事情要做,不能直接return時,
不想或不方便另外拆做一個新的function,
就會使用 do {} while(0) 作替代...

ex.

int getSomething()  {
    int finalResult = 0
   // do someThing... 
   ...
   ...
   ...
   // get some value: value1, value2, value3, value4, value5
   
   BOOL someChecking = FALSE;
   do {
       if (!checkPoint1(value1, value3)) break;
       if (!checkPoint2(value2)) break;
       // making some processing with value4 & value5, get some results
       if (!checkResults(results)) break;
       someChecking = TRUE;
   }
   while (0)
   
   // continue do something with someChecking and value2~4
   ...
   ...
   
   return finalResult
}
wilson1966 iT邦研究生 5 級 ‧ 2019-11-06 15:00:11 檢舉

這也不錯
/images/emoticon/emoticon12.gif

0
miy
iT邦新手 5 級 ‧ 2019-11-06 17:31:57

無法預先得知何時該結束尋覽時
像是搜尋的演算法

我要發表回答

立即登入回答