初識Tcl(五):Tcl 迴圈
目錄
Tcl迴圈
可能有一種情況,當需要執行一個程式碼塊多次。在一般情況下,語句是順序執行的:如在函式內的第一條語句,首先執行,然後是第二個 ... 等等。
程式語言提供了各種控制結構,允許更多複雜的執行路徑。
迴圈語句可以讓我們執行語句多次或程式碼組,下面是在大多數程式語言迴圈語句的一般形式:
TCL語言提供迴圈以下型別來處理迴圈。
迴圈型別 | 描述 |
---|---|
while迴圈 | 重複宣告語句或一組,當給定的條件為真。它測試條件在執行迴圈體前。 |
for迴圈 | 執行語句多次,序列和簡寫管理迴圈變數的程式碼。 |
內嵌迴圈 | 可以使用一個或多個迴圈內再使用其它的while語句,或do..while迴圈。 |
迴圈控制語句
迴圈控制語句改變其正常的順序執行。當執行離開範圍,在該範圍內建立的所有自動物件被銷燬。
TCL支援下面的控制語句。
控制語句 | 描述 |
---|---|
break語句 | 終止迴圈或switch語句並將執行立即迴圈或切換到下面的語句。 |
continue語句 | 導致迴圈跳過它的主體的其餘部分,並立即重新測試其條件宣告之前。 |
無限迴圈
如果條件永遠不會為假那麼一個迴圈就是無限迴圈。 while迴圈是傳統上用於此目的。可以通過條件表示式為1,來執行一個死迴圈。
while {1} { puts "This loop will run forever." }
當條件表示式為不存在,它被假定為真。 TCL程式設計師更普遍使用while {1} 構造以表示無限迴圈。
注意:可以通過按 Ctrl+ C鍵 終止無限迴圈。
Tcl while迴圈
在Tcl語言while迴圈,只要給定的條件為真,執行目標語句宣告多次。
語法
在Tcl語言while迴圈的語法是:
while {condition} { statement(s) }
在這裡,宣告(S)可以是單個語句或語句塊。所述條件可以是任何表達,真是指任何非零值。迴圈迭代當條件為真。
當條件為假,則程式控制進到緊接在迴圈之後的程式碼行。
流程圖
在這裡,while迴圈的關鍵點是,當條件測試結果為假時,在迴圈可能不會永遠執行。迴圈體將跳過while迴圈後的第一個語句將被執行。
示例
#!/usr/bin/tclsh set a 10 #while loop execution while { $a < 20 } { puts "value of a: $a" incr a }
當上述程式碼被編譯和執行時,它產生了以下結果:
value of a: 10 value of a: 11 value of a: 12 value of a: 13 value of a: 14 value of a: 15 value of a: 16 value of a: 17 value of a: 18 value of a: 19
Tcl for迴圈
for迴圈是一個迴圈控制結構,可以有效地編寫需要執行特定的程式碼次數。
語法
Tcl語言for迴圈的語法是:
for {initialization} {condition} {increment} { statement(s); }
下面是一個迴圈控制的流程:
-
初始化步驟首先執行,並且只有一次。這一步可以宣告和初始化任何迴圈控制變數。不需要把一個宣告放在這裡,只要給定一個分號。
-
接著,條件condition進行了計算。如果為真,則執行迴圈體。如果是假的,迴圈體不執行,for迴圈之後的流程控制跳轉到下一條語句。
-
迴圈的執行主體之後,控制流跳轉回到增量語句。此語句可以更新任何迴圈控制變數。這個語句可以留空,只需要一個分號。
-
條件現在重新計算評估。如果條件為真,迴圈執行的過程中重新執行(迴圈體,然後增加步,然後再次計算條件)。之後當條件為假時,for迴圈終止。
流程圖
示例
#!/usr/bin/tclsh # for loop execution for { set a 10} {$a < 20} {incr a} { puts "value of a: $a" }
當上述程式碼被編譯和執行時,它產生了以下結果:
value of a: 10 value of a: 11 value of a: 12 value of a: 13 value of a: 14 value of a: 15 value of a: 16 value of a: 17 value of a: 18 value of a: 19
Tcl巢狀迴圈
TCL允許使用一個迴圈內的另一個迴圈。下面的內容展示幾個例子來說明這個概念。
語法
Tcl語言的巢狀的迴圈語句的語法如下:
for {initialization} {condition} {increment} { for {initialization} {condition} {increment} { statement(s); } statement(s); }
Tcl語言巢狀while迴圈語句的語法如下:
while {condition} { while {condition} { statement(s); } statement(s); }
在迴圈巢狀最後需要說明的是,可以把任何型別迴圈巢狀在其他型別迴圈內。例如,for迴圈可以是一個while迴圈的內迴圈,或反之亦然。
示例
下面的程式使用巢狀for迴圈從2至100找出所有的素數:
#!/usr/bin/tclsh set j 0; for {set i 2} {$i<100} {incr i} { for {set j 2} {$j <= [expr $i/$j] } {incr j} { if { [expr $i%$j] == 0 } { break } } if {$j >[expr $i/$j] } { puts "$i is prime" } }
當上述程式碼被編譯和執行時,它產生了以下結果:
2 is prime 3 is prime 5 is prime 7 is prime 11 is prime 13 is prime 17 is prime 19 is prime 23 is prime 29 is prime 31 is prime 37 is prime 41 is prime 43 is prime 47 is prime 53 is prime 59 is prime 61 is prime 67 is prime 71 is prime 73 is prime 79 is prime 83 is prime 89 is prime 97 is prime
Tcl break語句
在Tcl語言break語句用於終止迴圈。當迴圈中遇到break語句,迴圈立即終止,程式控制繼續迴圈體後面的語句。
如果使用巢狀迴圈(即,一個迴圈在另一個迴圈體中),break語句將停止最內層迴圈的執行,並開始執行的下一行程式碼段程式之後。
語法
Tcl break語句的語法如下:
break;
流程圖
示例
#!/usr/bin/tclsh set a 10 # while loop execution while {$a < 20 } { puts "value of a: $a" incr a if { $a > 15} { # terminate the loop using break statement break } }
當上述程式碼被編譯和執行時,它產生了以下結果:
value of a: 10 value of a: 11 value of a: 12 value of a: 13 value of a: 14 value of a: 15
Tcl continue語句
Tcl語言中continue語句的工作有點像break語句。但不是強制終止,但是,繼續強制迴圈的下一個迭代發生,跳過中間的程式碼。
對於for迴圈,continue語句使迴圈的條件測試和增量部分執行。對於while迴圈,continue語句通過程式控制的條件測試。
語法
在Tcl continue語句的語法如下:
continue;
流程圖
示例
#!/usr/bin/tclsh set a 10 # do loop execution while { $a < 20 } { if { $a == 15} { #skip the iteration incr a continue } puts "value of a: $a" incr a }
當上述程式碼被編譯和執行時,它產生了以下結果:
value of a: 10 value of a: 11 value of a: 12 value of a: 13 value of a: 14 value of a: 16 value of a: 17 value of a: 18 value of a: 19