摘自wanjian的日志 為了提高圖像處理(特別是邊緣檢測)算法的效率,在循環處理中一旦找到灰度跳變就設定好標志位,然后返回,而不會繼續在循環中苦苦搜索。因為目的已經達到了,已經找到該找的東西,不必把CPU浪費在循環中。下面WJ介紹幾種實現的方法,供同學們參考。 1 用得最多的break和continue. 大家都知道break是跳出總循環,不再進行循環;continue是跳出本次循環,執行下一次循環. 如for (int i=0;i<10;i++) { if (i==5) break; printf(i); } 這樣只能執行到i=5,打印輸出0 1 2 3 4 如for (int i=0;i<10;i++) { if (i==5) continue; printf(i); } 這樣只能執行到i=9,打印輸出0 1 2 3 4 6 7 8 9,沒有5 但是,有一個問題:break和continue只限于退出一層循環。如果是雙重循環,那么只能退出內層循環。 for (int i=0;i<10;i++) { for (int j=0;j<10;j++) { if (i==5 && j==5) break; printf(i); printf(j); } } 這個結果大家可以自己試一下。 那怎么辦呢,把上面的稍加改進即可。我們設置一個標志變量,如果內嵌循環退出,那么就把這個標志變量置位。然后在外層循環檢測標志變量是否置位,為真的話跳出外層循環。 BOOL bset=FALSE; for (int i=0;i<10;i++) { for (int j=0;j<10;j++) { if (i==5 && j==5) { bset=TRUE; break; } printf(i); printf(j); } if (bset) break; } 2 在for循環里加限制條件. BOOL bset=FALSE; for(;!bset;) { for(;!bset;) { if (i==5 && j==5) bset=TRUE; else { printf(i); printf(j); } } } 這種方法適用條件不多的情況,否則程序可讀性很差。 3 直接用goto goto這個語句一直讓不少人不齒,但是存在即合理。個人覺得它用在這種情況是最合適的了。 for (int i=0;i<10;i++) { for (int j=0;j<10;j++) { if (i==5 && j==5) { goto out; } printf(i); printf(j); } } out: your next code..... 為什么有人一直抨擊它呢?是因為用上它就會喜歡上它,無法自撥以至于見到程序跳轉就想到goto,結果當然就撓亂整個程序的秩序。 4 補充一條。單獨寫個void calculate (XXXXX) void calculate (XXXXX) { for (int i=0;i<10;i++) { for (int j=0;j<10;j++) { if (i==5 && j==5) return; printf(i); printf(j); } } } 這個方法相對來說比較高級,主要是形參的傳遞比較高級,可以是數值,地址,引用,等等,非常靈活。 但也容易出錯。建議用結構體指針。 |