欢迎光临散文网 会员登陆 & 注册

2022年的 Tcl/Tk 编程入门参考 8.表达式计算

2022-04-16 14:30 作者:象喻  | 我要投稿

😸为什么现在才介绍表达式……这涉及文件夹排列顺序的深层次问题——没注意,把它漏过去了——直到if命令发完,隐约感到一丝丝不安,才想起来。

😼为什么又继续更了"异常处理"?因为我试图掩盖失误……但是我发现都欺骗不了我自己,放弃了……


expr命令用于数学表达式计算、逻辑比较和字符串比较。

这个命令比较关键的地方在于它的执行流程:首先,它会把所有的参数组合成一个字符串,然后对这个字符串进行替换操作,最后把替换后的结果视为表达式进行计算。如果只给它一个参数,由于不需要组合,所以能微弱提升效率,但是组合的步骤仍然会把这个唯一参数变成字符串,然后进行替换操作,再进行计算。

也就是说,无论是单个参数还是多个参数,即便用{}括起来,在计算前也会进行替换操作。

 


字符串比较

expr可以比较两个字符串是否相同,与逻辑比较类似,返回代表布尔值概念的1/0(1代表"是",0 代表 "否")

其使用eq和ne作为比较运算符(eq  -> equal 相等,ne  ->  not  equal 不相等):

*提示:字符串的string命令也有比较功能。


精度问题

expr命令在计算或逻辑比较时,会对表达式的值进行自动转换(不是Tcl语法里的替换,是数学层面的转换),这有可能会导致精确度问题,或者与预期不符。

 


三元运算符

三元运算符(?和:)是编程语言中常见的缩写形式,用来缩短 if - then - else 语句的代码量。但是在Tcl语言里,运算符必须配合expr这样的命令使用,考虑到expr自身的规则都快赶上语法了,所以实际上就没啥优势了。

三元运算符:判断条件 ? {为真时执行的代码} : {为假时执行的代码}

 


安全性

举例时经常给表达式加上大括号,这是官方推荐的写法,除了前面提到的能略微提升效率之外,还有一个更重要的原因——防止命令注入。

无论是命令行还是图形界面程序,经常会接收用户输入的数据(比如用户名、密码的输入框),而expr的运行机制在接收用户数据时有问题(假设存放在userinput变量中):

 



2022年的 Tcl/Tk 编程入门参考 8.表达式计算的评论 (共 条)

分享到微博请遵守国家法律