一、引言
控制結構允許程序根據不同的狀態、條件和參數來選擇不同的處理和執行路徑,從而使代碼具有更強的靈活性、健壯性和可讀性。
Tcl 提供了 if、if/else、if/elseif、foreach、 for、while 和 switch 命令來管理控制結構。這些命令和其他語言如C語言的條件語句的作用相同。需要區別的是在 Tcl 中所有控制結構都是由相應的命令來實現,而 C 語言中則是一條控制語句。
控制結構通常要求帶有一個延遲執行命令體或者過程體,這個命令體需要用花括號括起來以加以界定。
二、詳細
1.if/else 命令
if 命令根據表達式的結果來執行命令體:如果表達式結果為真,則執行命令體,否則會執行另外一個條件命令體(如果存在的話)。后面兩個命令體(elseif 和 else)是可選的。
[語法] if { test expr 測試表達式 } {
body 1
} elseif {test expr 測試表達式} {
body2
} else {
test expr
}
1.語法中用以界定過程體的花括號一定要和 if 命令在同一行上!因為對 Tcl 來講,換行符就是命令結束符,所以如果在 if 表達式后直接換行,寫成:
if { test expr }
{
...
}
就會出錯。Tcl 遇到換行后就認為命令結束,但找不到執行命令體,返回錯誤。其他的控制命令,還有以后的過程定義命令等等都存在這個問題。
但情況並不全部如此。當在一個花括號體內或者一個雙引號體內換行的時候,解釋器不認為是命令的結束,所以上面的語法中,我們只將執行命令體的第一個花括號(左括號)留在了 if 命令行和 else 命令行,然后另起一行書寫執行命令體的過程語句,右括號也被單獨放到了一行上。這樣做是為了提高可讀性和便於查錯。
2.如果 if 后面還有 else/elseif 命令,則要留意 else/elseif 的位置。else/elseif 要跟在 if 執行命令體的后面一個花括號后,不能分行,要有空格間隔花括號和 else /elseif。
3.花括號括起的表達式、執行命令體或者其他內容相當於變量存在,所以前后與其他命令元素之前要有空格,否則 Tcl 會返回語法錯誤。
4.可以使用多個 elseif 來創建一連串的條件命令控制結構。
5.表達式支持變量替換和命令替換。
6.表達式的計算結果如果是”true”、”yes”和非零值就判斷為真,如果結果
是”false”、”no”和零則判斷為假。控制命令根據表達式結果來判斷是否執行相應的執行命令體。
#要求根據學生的score判斷學生的成績等級,如果大於90則打印出的等級為A,並顯示其成績 #如果80則B,其他為C 並顯示具體成績 puts "請輸入學生的成績:" set score [gets stdin] if {$score>=90} { puts "分數是$score,等級為A" } elseif {$score>=80} { puts "分數是$score,等級為B" } else { puts "分數是$score,等級為C" }
2.for 命令
for 命令和 C 語言的 for 語句相似。for 命令的語法格式為:
[語法]:for {start} {test expr} {next} {body
}
for 命令有四個變元,start 是預置條件或者初始化命令,告訴 for 命令起始執行條件。test
expr 是條件布爾表達式,以決定是否執行循環體 body,如果是真,則執行循環體,如果假則退出命令。如果表達式真,則在執行循環體后處理 next 命令,即 next 是一個后置命令執行體。前三個變元可以選擇置空,而將相應的處理放到循環體 body 中去。
for {set i 0} {$i<=100} {incr i} { incr sum $i} puts $sum

for {set i 100} {$i<=999} {incr i} { set bw [expr $i/100] set sw [expr $i/10%10] set gw [expr $i%10] if {[expr $bw*$bw*$bw+$sw*$sw*$sw+$gw*$gw*$gw]==$i} { puts $i }
3. while 命令
while 命令格式為:
[語法]:while {test } {
body
}
while 命令和 for 命令非常相似。只要 test 為真,while 就執行循環體直到 test 變為假。for
命令和 while 命令的主要區別是,在 while 循環體內你必須更改被檢測的測試體 test 的值,否則如果值一直沒有改變成假時,while 將無限的執行循環體。而 for 命令你可以將這種處理過程在 next 變元中顯式給出。
set i 3 while {$i > 0} { puts "Current index is $i." incr i –1 } => Current index is 3. Current index is 2. Current index is 1.
4. switch 命令
switch 命令通過將給定字符串與不同的匹配模式進行匹配從而選擇執行多分支命令體。
switch 可基於模式匹配。命令格式為:
[語法]: switch [option] string {
pattern-1 {body1}
pattern-2 {body2}
pattern-n {bodyn}
}
說明:
1.option 主要有:
-exact 用精確匹配(默認);
-glob 用 glob 格式行模式匹配; -regexp 用 正則表達式模式匹配; -- 標記選項結束或者說明不用選項。
set result tru switch $result { true {puts true} false {puts false} default {puts unknow} }