程序因为流程控制而拥有生命。
流程控制只有顺序执行,条件跳转,循环执行三种形式。而恰恰是这三种方式的组合构建出一个又一个精彩的程序。
所谓大道至简,诚如其言。
这没什么太多好说的,通常就是代码的书写顺序。
最常见的条件分支语句是if语句。另外一个是switch语句
if {$a > 10} {
puts "I'm here"
} elseif {
puts "I'm in else"
}
switch $var {
pattern_a {call_my_proc}
pattern_b {puts "I'm here"}
default {puts "No match! Use default!"}
}
Tcl中的switch语句可以指定匹配方式(通配符、正则表达式、完全匹配)。
switch -exact $var-glob 或者 -regexpfor {set i 0} {$i<10} {incr i} {
puts "Loop $i"
}
while {$i<10} {
puts "Loop $i"
}
foreach item $itemlist {
puts "This is $item"
}
while {$i<10} {
if {$is_break} {
break
} else {
continue
}
puts "haha"
}
下面的语句有什么问题吗?
if { 5 > 4 } {
# if {10 > 3} {
puts "I am here"
}
实际执行的话,可能会发现大括号不匹配的问题。问题就出在被注释掉的 if 语句那行。对Tcl来说,if 本质上是一条命令,所有后面的语句都只是参数,带有注释符号的那行只有在被执行时才会被认为是注释,在此之前,可以认为它只是字符串。而当作字符串来看的话,就确实有大括号不匹配的问题。
看下面的代码:
set i 0
while "$i < 3" {
incr i
puts $i
}
如果你认为上面的循环会循环3遍的话,那就错了。事实上它会变成一个死循环(Infinite Loop)。
原因在于双引号中的字符串在传递给命令之前先进行变量替换。这样对于while语句来说,他看到的循环条件其实是 "0 < 3",也就是永远为真值。