一、引言
控制结构允许程序根据不同的状态、条件和参数来选择不同的处理和执行路径,从而使代码具有更强的灵活性、健壮性和可读性。
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
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} }