c 語言中的迴圈結構有四種,分別是 goto ,do while ,while ,for。下面對這四種迴圈結構在執行循序,效能,以及用途上進行說明。
goto
goto 好比是乙個又不好管,又沒有能耐的一種人。因為破壞程式的可讀性,和流程的流水線,因此一直被語法界罵成狗。剛開始學 c 的時候,老師說過,知道有 goto 這麼一回事就行了,一定不要用。
但是 c 標準發展到現在,一次次更新,goto 卻一直沒有被乾掉,證明在某些場合 goto 是有發展空間的,並除 goto 沒有更好的取代方案。在 360 寫 poc 時,遇到迴圈多層巢狀的情況,例如:有好多層迴圈巢狀,如下面程式。
但是想在最裡面 for 執行到某個條件時,退出所有迴圈,執行 a 處,如果不用 goto 就很難實現。break 只可跳出一層迴圈,如果跳出多層迴圈,就要多次 if break ,if break。
while(1) } } }a
遇到這類情況,就要用到 goto ,可以完美的解決這類問題。
while(1) } } }end_loop: a
do while
do while 類似於在大餐廳吃飯的情況,先吃飯後給錢。下面給出程式,用 do while 實現 1-100 相加。
int main()while(n <= 100); printf("%d\r\n", nsum); return 0;}
進行除錯反彙編,可以看到 do while 的執行順序。先執行 nsum = nsum + n,再執行 n++,當 n <=100 時,跳轉到 07ff769b018b8,也就是 sum = nsum + n。
根據上面的執行順序和跳轉,用 goto 實現 do while
#include int main() printf("%d\r\n", nsum); return 0;}
while
while 類似於在小餐廳吃飯的情況,先給錢後吃飯。下面給出程式,用 while 實現 1-100 相加。
#include int main() printf("%d\r\n", nsum); return 0;}
進行除錯反彙編,可以看到 while 的執行順序。先執行 n <= 100 的判斷,在執行 nsum = nsum +n;n++,然後跳轉到 07ff6764818b8,也就是 n <= 100 的判斷。
利用上面的執行順序和跳轉,用 goto 實現 while
#include int main() printf("%d\r\n", nsum); return 0;}
for
for 是在開發中最常用的迴圈結構。下面給出程式,用 for 實現 1-100 相加。
#include int main() printf("%d\r\n", nsum); return 0;}
進行除錯反彙編,可以看到 for 的執行順序。首先賦初值 n = 1,接下來跳轉到 07ff68d7e18c9 ,也就是 做 n <= 100 的判斷,然後執行 nsum = nsum + n,然後跳轉到 07ff68d7e18c1 ,也就是 n++ 處。
利用上面的執行順序和跳轉,用 goto 實現 for
#include int main() printf("%d\r\n", nsum); return 0;}
利用 goto 實現 do while ,while ,for 後。可以觀察到,實現 do while ,while 只用了乙個 goto ,而實現 for 需要兩個 goto ,明顯多一跳。所以,在效率上 do while ,while 相較於 for 是高的。
do while 雖然效率高,但有乙個***,就是不管怎樣都會執行一次,類似於現實中的,吃完飯,發現錢包忘記帶了。
往往程式設計中,只要用到迴圈結構,幾乎大多數人都用 for 。這又是為什麼呢?技術圈有乙個定理,凡是用的順手的,效率肯定低。凡是用的不順手的,效率肯定高。某個問題難度係數一定是常量,假設這個問題難度係數為:5,當使用工具 a 時感到方便,是因為工具 a 做的事情比你多,在解決問題上,工具 a 佔了 4/5 ,而你只佔了 1/5 ,所以才會覺得方便。當使用工具 b 不方便,是因為你比工具 b 做的事情多,在解決問題上,工具 b 佔了 2/5 ,而你卻佔了 3/5,所以才會覺得不方便。
for迴圈執行順序 for迴圈
語法 for 迴圈初始化表示式 迴圈條件表示式 迴圈後的操作表示式 在 迴圈初始化表示式 中宣告的變數,我們稱之為 迴圈變數 for迴圈執行順序 1 迴圈初始化表示式 最先執行,並且只執行了一次。2 如果 迴圈條件表示式 成立,則執行迴圈體 如果 迴圈條件表示式 不成立,則跳出迴圈。3 迴圈體 執行...
c語言中四種迴圈結構格式
while 迴圈條件 例如 1 2 3 100 int fun return sum i 使迴圈條件趨於假,為while迴圈的最後一條 處,這樣與for迴圈完全等價 倘若i 並不是放在while迴圈的最後位置,則與for迴圈的區別要注意。for 賦初值 判斷條件 使條件趨於假 for迴圈的執行順序 ...
for 迴圈執行順序
for迴圈的執行順序用如下表示式 for expression1 expression2 expression3 執行的順序應該是 1 第一次迴圈,即初始化迴圈。首先執行表示式expression1 一般為初始化語句 再執行expression2 一般為條件判斷語句 判斷expression1是否符...