2022年的 Tcl/Tk 編程入門參考 8.表達(dá)式計(jì)算
??為什么又繼續(xù)更了"異常處理"?因?yàn)槲以噲D掩蓋失誤……但是我發(fā)現(xiàn)都欺騙不了我自己,放棄了……
這個(gè)命令比較關(guān)鍵的地方在于它的執(zhí)行流程:首先,它會(huì)把所有的參數(shù)組合成一個(gè)字符串,然后對(duì)這個(gè)字符串進(jìn)行替換操作,最后把替換后的結(jié)果視為表達(dá)式進(jìn)行計(jì)算。如果只給它一個(gè)參數(shù),由于不需要組合,所以能微弱提升效率,但是組合的步驟仍然會(huì)把這個(gè)唯一參數(shù)變成字符串,然后進(jìn)行替換操作,再進(jìn)行計(jì)算。
也就是說,無論是單個(gè)參數(shù)還是多個(gè)參數(shù),即便用{}括起來,在計(jì)算前也會(huì)進(jìn)行替換操作。
?
字符串比較
expr可以比較兩個(gè)字符串是否相同,與邏輯比較類似,返回代表布爾值概念的1/0(1代表"是",0 代表 "否")
其使用eq和ne作為比較運(yùn)算符(eq ?-> equal 相等,ne ?-> ?not ?equal 不相等):
*提示:字符串的string命令也有比較功能。
精度問題
expr命令在計(jì)算或邏輯比較時(shí),會(huì)對(duì)表達(dá)式的值進(jìn)行自動(dòng)轉(zhuǎn)換(不是Tcl語法里的替換,是數(shù)學(xué)層面的轉(zhuǎn)換),這有可能會(huì)導(dǎo)致精確度問題,或者與預(yù)期不符。
?
三元運(yùn)算符
三元運(yùn)算符(?和:)是編程語言中常見的縮寫形式,用來縮短 if - then - else 語句的代碼量。但是在Tcl語言里,運(yùn)算符必須配合expr這樣的命令使用,考慮到expr自身的規(guī)則都快趕上語法了,所以實(shí)際上就沒啥優(yōu)勢(shì)了。
三元運(yùn)算符:判斷條件 ? {為真時(shí)執(zhí)行的代碼} : {為假時(shí)執(zhí)行的代碼}
?
安全性
舉例時(shí)經(jīng)常給表達(dá)式加上大括號(hào),這是官方推薦的寫法,除了前面提到的能略微提升效率之外,還有一個(gè)更重要的原因——防止命令注入。
無論是命令行還是圖形界面程序,經(jīng)常會(huì)接收用戶輸入的數(shù)據(jù)(比如用戶名、密碼的輸入框),而expr的運(yùn)行機(jī)制在接收用戶數(shù)據(jù)時(shí)有問題(假設(shè)存放在userinput變量中):
?