目錄
簡潔的for循環
循環過程修改循環變量
循環語句
不同編程語言支持的循環語句
foreach
無限循環
for循環歷史
break和continue
循環判斷結束值
循環標簽
循環語句優化
循環表達式返回值
簡潔的for循環
如果需要快速枚舉一個集合的元素,盡管C語言可以用for (i = 0; i < len; ++i)枚舉不同元素,現代編程語言提供了更優雅的做法。
- ObjC 2.0提供了快速枚舉
for (NSString *str in arr) - C++11引入了基于范圍的for循環遍歷數組或者容器
for (int i : arr) - C#
foreach (int i in arr) - Java
for (int i : arr) - Swift提供for快速遍歷,可追加where字句限制循環條件
for i in 1...5 where i % 2 == 0 - Kotlin 提供形如 for (i in 1..5) 或 for (i in 1.rangeTo(5)) 簡潔的遍歷寫法。
- 不包含5的遍歷:for (i in 1 until 5)
- 也提供 形如逆向遍歷: for (i in 5 downTo 1)
- 也可調整step: for (i in 1 until 5 step 2) 遍歷1 3
- 倉頡 提供類似Kotlin簡潔且可控循環開始結束和步長的for循環。
- 從1到9:for (i in 1..10)
- 從1到10:for (i in 1..=10)
- 從1到10,步長2:for (i in 1..=10 : 2)
- 遍歷4, 8:for (i in 1..=10 : 2 where i % 4 == 0)
循環過程修改循環變量
- C#?
foreach
循環期間是不允許修改循環變量(注意是不能修改用于循環的變量,而非每個對象),以避免循環狀態不統一。
循環語句
循環語句一般分為while/for/do-while三種。
- while是if語句重復執行的優化版,如果沒有while,就需要用if和goto組合代替。
- for循環是條件和變化簡單的while語句的優化版。
不同編程語言支持的循環語句
- C/ObjC/C++/Java/C#/Kotlin/倉頡 等都支持上面三種形式。
- Python 支持for和while語句,不支持do-while語句。
- Pascal while / for / repeat..until 語句格式示例如下:
- while i < 10 do begin Writeln(i); i := i + 1; end;
- for j := 1 to 10 do Writeln(j); 或 for j := 10 downto 1 do Writeln(j);
- repeat Writeln(i); i := i + 1; until i > 10;
foreach
foreach為了優化處理集合的對象,減少不必要的index++. 一些語言為了更簡單,for語句也可實現foreach功能。
- PHP/Java/C# 等均有foreach的身影。
- Kotlin的for語句和foreach很像,采用for?xxx?in?yyy形態。Kotlin的forEach和forEachIndexed主要用于集合對象遍歷,后者除了可以獲取每個元素,還可以獲取下標。
無限循環
for(;;)和while(1)都是無限循環。編譯器對于二者的處理可能有差,前者可能僅僅用jmp不斷重復,后者可能有test/je指令。當然,優秀的編譯器應該會最優化指令。
for循環歷史
- 最早ALGOL 58就有for循環的雛形。
- Fortran 66引入了FOR語句,Fortran 90引入了DO/WHILE語句。
- for I : = 0 ( 1 ) N;
break和continue
和switch/case語句類似,循環語句一樣除了有break跳出,還增加了continue繼續判斷條件。對于匯編實現,均是jmp或j*系列跳轉,并沒有多么深奧。
- C/ObjC/C++/Java/C#/PHP/Kotlin/Python 等均支持break和continue.
- Fortran 用exit對應break,cycle對應continue.
- PHP 還支持形如break 3跳出第三層循環這種語句,可以靈活跳轉出更高層循環。
- Kotlin 也支持break和continue跳到特定循環,前提需要在循環開始添加標記,比如loop1@代表loop1循環標記。
循環判斷結束值
- Fortran 提供一種簡潔的循環初始、結束、步隔的語法。
do i = 1, 5, 1
print *, i
end do
循環標簽
- Fortran 可以為每個循環語句加上標簽,可方便閱讀或者跳轉。例如:
loop: do i = 1, 5
循環語句優化
當循環條件每次都不同,執行語句也只依賴條件,是可以并行執行的。
- Fortran提供了concurrent可讓編譯器做并行優化。
循環表達式返回值
- Rust loop表達式默認的break返回是unit類型,但可以用break?xx返回xx, 作為loop表達式返回值。
若文章對您有幫助,歡迎關注 程序員小迷 。助您在編程路上越走越好!
微風不燥,陽光正好,你就像風一樣經過這里,愿你停留的片刻溫暖舒心。
我是 程序員小迷 (致力于C、C++、C#、Android、iOS、Java、Kotlin、Objective-C、Swift、Shell、JavaScript、TypeScript、Python等編程技術的技巧經驗分享),若作品對您有幫助,請關注、分享、點贊、收藏、在看、喜歡,您的支持是我們為您提供幫助的最大動力。
1.您還可以訪問 迷軟科技 網站:https://www.minicoda.com
2.想學習更多知識,您可以關注 微信公眾號 : 程序員小迷 ( miniminicode )(一個關注于C、C++、C#、Android、iOS、Java、Kotlin、Objective-C、Swift等語言軟件開發技能技巧經驗的公眾號)