Tcl/Tk: 数学表达式与 expr 命令

教材:陈涛 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" 和列表x

11.类型与转换

一般tcl把表达式作数字处理。

使用字符串比较符,关系操作式中有一个操作数为字符串时进行字符串操作。

int、wide、entier和round把实数转化为整数:int一般为32位,超过这个长度会截去高位,wide为64位,entier的返回值可以占任意长度的空间以保证能完整存放。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值