教材:陈涛 Tcl 编程初步 tcl/tk入门经典(2)
1.除了自加自减,tcl的数学和逻辑运算符,运算符优先级,数学函数与相似。
2.自加自减速运算用incr命令完成
incr varName ?step? 没有后一个参数表示加1,incr a -n表示减n。
3.expr命令将它的参数做表达式处理。expr 4+2;expr log10(100);
4.if语句
这个命令会将他的第一个参数当做表达式
if {x<10} {set a=x}
5.在tcl8.5中,当表达式解析器遇到像sin($x),log10($y)等数学函数时,它会将函数替换为对tcl::mathfunc命名空间中一个普通命令的调用。
例 expr {sin($x+$y)}和expr {[tcl::mathfunc::sin [expr {$x+$y}]]}一样。
如果数学函数有多个参数
例 expr pow($x+2,$y/2)和expr {[tcl::mathfunc::pow [expr {$x+2}] [expr {$y/2}]}
6.tcl允许定义自己的数学函数,只在tcl::mathfunc命名空间中创建新的命令就可
例 proc tcl::mathfunc::avg {args} {
if {[llength $args] == 0} {
return -code error "too few argurments to math function avg."
}
set total 0
foreach val $args {
set total [expr {$total + $val}]
}
return [expr {double($total) / [llength $args]}]
}
这样就可以调用avg: expr avg(1,2,3);
7.替换
表达式操作数的替换有两种方式。
第一种是一般的tcl解析器机制,如expr $x + $y; 设x = 1,y = 2,解析器会在执行expr命令前替换变量的值,将"1 + 2"传递给expr。
第二种是通过表达式处理完成,如expr {$x + $y}; 先将" $x + $y"传递给命令expr,当表达式处理器遇到$时会进行一次替换。
例 set val 1
set num 33
while {$val < $num} {
set val [incr val 2]
}
如果没有大括号,那么在解析while之前tcl解析器就会处理"$val < $num",使之成为一个常量"1 < 33",程序进入死循环。
第二个例子
set x [expr $input + 2]
如果在windows下,一个恶意用户输入[format C:\],那么tcl解析器会将这个字符串作为input的变量,表达式处理器执行其中的命令-格式化C盘,而用{}括起来,则只会报错。
8.由7的例子可知,表达示最好用{}括起来!
9.与C不同的是,字符串也可作某些表达式操作数
例 set x "Los Angeles"
if {$x eq "New York"} {
....
}
表达式解析器会先将"$x eq "New York" 传递给if命令,if命令执行表达式时会判断x的值和"New York" 是否相等。如果没有用{},tcl解析器会先进行替换,使表达式变成
Los Angeles eq New York,表达式解析无法解析Los,因为它不是数字、函数或字符串(因为不在""中)。
除了eq,还有ne、<、<=、>、>=、==、!=。
10.表达式还能进行列表操作
例 set x [people from New York,Beijing and Tokyo enjoy this treatment.]
if {"New York" in $x} {
....
}
in和ni操作符严格比较字符串 "New York" 和列表x11.类型与转换
一般tcl把表达式作数字处理。
使用字符串比较符,关系操作式中有一个操作数为字符串时进行字符串操作。
int、wide、entier和round把实数转化为整数:int一般为32位,超过这个长度会截去高位,wide为64位,entier的返回值可以占任意长度的空间以保证能完整存放。