一、引言

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

Tcl 提供了 ifif/elseif/elseifforeach forwhile 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}
}

TCL语言笔记:TCL中的控制结构命令的更多相关文章

  1. TCL语言笔记:TCL基础语法

    一.什么是TCL Tcl 全称是 Tool command Language.它是一个基于字符串的命令语言,基础结构和语法非常简单,易于学习和掌握. Tcl 语言是一个解释性语言,所谓解释性是指不象其 ...

  2. TCL语言笔记:TCL中的String命令

    一.介绍 字符串是 Tcl 中的基本数据类型,所以有大量的字符串操作命令.一个比较重要的问题就是模式匹配,通过模式匹配将字符串与指定的模式(格式)相匹配来进行字符串的比较.搜索等操作. 二.strin ...

  3. TCL语言笔记:TCL中的数组

    一.介绍 Tcl 中的数组和其他高级语言的数组有些不同:Tcl 数组元素的索引,或称键值,可以是任意的字符串,而且其本身没有所谓多维数组的概念.数组的存取速度要比列表有优势,数组在内部使用散列表来存储 ...

  4. TCL语言笔记:TCL中的列表操作

    一.介绍 列表则是具有特殊解释的字符串.Tcl 中的列表操作和其它 Tcl 命令一样具有相同的结构.列表可应用在诸如 foreach 这样的以列表为变元的循环命令中,也应于构建 eval 命令的延迟命 ...

  5. TCL语言笔记:TCL中的数学函数

    一.TCL数学函数列表 函数名 说明 举例 abs(arg) 取绝对值 set a –10  ; #a=-10 set a [expr abs($a)]; # a=10 acos(arg) 反余弦 s ...

  6. Tcl语言笔记之二

    1,表达式 1.1 操作数 TCL表达式的操作数通常是整数或实数.整数一般是十进制的, 但如果整数的第一个字符是0(zero),那么TCL将把这个整数看作八进制的,如果前两个字符是0x则这个整数被看作 ...

  7. Tcl语言笔记之一

    1,一个TCL脚本可以包含一个或多个命令.命令之间必须用换行符或分号隔开 2,置换 substitution %set y x+100                               // ...

  8. TCL语言笔记:TCL练习

    一.关于随机数的练习 1.随机生成一个最大值到最小值之间的整数 proc random {min max} { return [expr round(($max-$min)*rand()+$min)] ...

  9. TCL语言笔记:TCL练习二

    一.练习 1.二进制转十进制 proc b2d {b} { ;set len [string length $b] } {$i<$len} {incr i} { incr sum [expr , ...

随机推荐

  1. ActiveMQ之Queue

    Queue实现的是点到点模型,在以下的例子中,启动2个消费者共同监听一个Queue,然后循环给这个Queue发送多个消息. 代码如下: public class QueueTest { /** * @ ...

  2. SQL2012 附加数据库提示5120错误解决方法

    在win8.1 x64系统上使用sql2012进行附加数据库(包括在x86系统正在使用的数据库文件,直接拷贝附加在X64系统中)时,提示无法打开文件,5120错误. 这个错误是因为没有操作权限,所以附 ...

  3. 这些年,我收集的JavaScript代码

    这些年,我收集的JavaScript代码(一) http://www.cnblogs.com/jscode/archive/2012/07/25/2605395.html 这些年,我收集的JavaSc ...

  4. 理解PHP 依赖注入|Laravel IoC容器

    看Laravel的IoC容器文档只是介绍实例,但是没有说原理,之前用MVC框架都没有在意这个概念,无意中在phalcon的文档中看到这个详细的介绍,感觉豁然开朗,复制粘贴过来,主要是好久没有写东西了, ...

  5. 学习asp.net mvc5心得

    前几天时间大体学习了一下asp.net mvc5的应用,感觉最主要的就是要区分这以模式设计,其他的都是在asp.net下的基础操作 1参数的传递注意 2路由的设置规则 3model的应用

  6. Memcache+Tomcat9集群实现session共享(非jar式配置, 手动编写Memcache客户端)

    Windows上两个tomcat, 虚拟机中ip为192.168.0.30的centos上一个(测试用三台就够了, 为了测试看见端口所以没有使用nginx转发请求) 开始 1.windows上开启两个 ...

  7. Team Homework #3: The feedback of predecessors

    此次对学长的采访主要在QQ上进行,感谢陈宇宁学长的热情配合. 采访学长的问题及学长的答复如下: 1. 平均每周花在这门课上的时间 (包括上课/作业/上机) -大约15-20小时吧(学长个人花费时间) ...

  8. Struts2结合sitemesh3制作网站母版页面

    上一篇文章介绍了sitemesh3的使用,这篇文章来介绍如何结合struts2来配置和使用sitemesh,具体的如何使用sitemesh3我就不讲解了,这个你们可以看看我的上一篇博客. 首先你要添加 ...

  9. 怎么查看其它apk里面的布局代码及资源

    今天才看到的好方法, 将你要的apk文件的后缀名改为zip,解压就可以了. --------------------------------- 提示:有时候系统会自动隐藏你的后缀名的,这时候就需要你将 ...

  10. C#: Create a WebRequest with HTTP Basic Authentication

    http://blog.csdn.net/huangyaoshifog/article/details/4470675 myReq = WebRequest.Create(url); string u ...