2022年的 Tcl/Tk 编程入门参考 8.表达式计算
😼为什么又继续更了"异常处理"?因为我试图掩盖失误……但是我发现都欺骗不了我自己,放弃了……
这个命令比较关键的地方在于它的执行流程:首先,它会把所有的参数组合成一个字符串,然后对这个字符串进行替换操作,最后把替换后的结果视为表达式进行计算。如果只给它一个参数,由于不需要组合,所以能微弱提升效率,但是组合的步骤仍然会把这个唯一参数变成字符串,然后进行替换操作,再进行计算。
也就是说,无论是单个参数还是多个参数,即便用{}括起来,在计算前也会进行替换操作。
字符串比较
expr可以比较两个字符串是否相同,与逻辑比较类似,返回代表布尔值概念的1/0(1代表"是",0 代表 "否")
其使用eq和ne作为比较运算符(eq -> equal 相等,ne -> not equal 不相等):
*提示:字符串的string命令也有比较功能。
精度问题
expr命令在计算或逻辑比较时,会对表达式的值进行自动转换(不是Tcl语法里的替换,是数学层面的转换),这有可能会导致精确度问题,或者与预期不符。
三元运算符
三元运算符(?和:)是编程语言中常见的缩写形式,用来缩短 if - then - else 语句的代码量。但是在Tcl语言里,运算符必须配合expr这样的命令使用,考虑到expr自身的规则都快赶上语法了,所以实际上就没啥优势了。
三元运算符:判断条件 ? {为真时执行的代码} : {为假时执行的代码}
安全性
举例时经常给表达式加上大括号,这是官方推荐的写法,除了前面提到的能略微提升效率之外,还有一个更重要的原因——防止命令注入。
无论是命令行还是图形界面程序,经常会接收用户输入的数据(比如用户名、密码的输入框),而expr的运行机制在接收用户数据时有问题(假设存放在userinput变量中):