寫C#程式多年,如有遇到要做迴圈效果的,我大部份是用foreach ,少部份用for,從來沒有用過do ..while 迴圈,想說我算不算異類或是閉門造車,是不是有遺落什麼或錯失簡化程式碼的良機? 請先進指導一下,謝謝。
while(! XX.Eof){
.....
.....
XX.Next();
}
XX 一般是檔案,或資料Table
不知何時結束
<好奇問一下
<為什麼會突然想問「多年來都用不到的語法」呢
看別人的程式碼偶爾有do while 迴圈,自己則奇怪這十幾年來,我居然沒有用到do while 迴圈。
那有空不妨一併看看有那些字從來沒用過囉
C# 保留字
沒有必用的情況
While可以搞定一切。
也不是不行.
應該說do/while的歷史比Windows還要久,
語法基本上都會保留下來,
但是不代表它就是必要的.
我們真正使用到的語法可能不到一半甚至更少,
但是只要能解決問題用什麼語法其實不是問題.
等編譯成組合語言很多語法都是一樣的...
雖然我沒有在研究組合語言...
參考維基:https://en.wikibooks.org/wiki/X86_Assembly/Control_Flow
可以知道:
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應該是暫存器、記憶體或立即值,語法參考一下維基)
問到懂為止
do
{
it 邦發問;
} while (沒有搞懂);
}
可是應該是沒有搞懂才來問吧XD
所以應該是
while (沒有搞懂) {
it 邦發問;
}
哈,也對,沒有搞懂while ,到底while是要放在前面或後面.
do while 會不管你懂不懂
先問再說XD
只有在 先處理後判斷 的情況下可以使用do-while
好處是 至少 執行一次
不過通常都不會想到用do-while來處理XD
foreach for while do...while 各種都有自己的....粉絲群?
有人極端點 還只用if 哩
所以...不會是異類啦XDDD 只不過別人寫時你要看的懂就對惹
回到原命題
while 跟 do....while 最大的差別...
就是do...while至少做一次
while 可能連第一次都沒進去
沒有誰對誰錯 都是能用的
寫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, 因為是前端圖形演算法,對瀏覽器來說,運算效能較差,一次運算差幾毫秒乘上幾萬幾十萬就有差。
個人有個習慣,可以當個參考...
當有一段程式碼隨時會因為各種條件中斷,
但是後續又有事情要做,不能直接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
}