名稱
expr - 評估一個表達式
概要
expr arg ? arg arg ... ?
連接arg (在它們之間添加分隔符空格),將結果評估為Tcl表達式,並返回該值。 Tcl表達式中允許的運算符是C表達式中允許的運算符的子集,它們與相應的C運算符具有相同的含義和優先級。 表達式幾乎總是產生數值結果 (整數或浮點值)。 例如,表達式
表達8.2 + 6評估為14.2。 Tcl表達式與C表達式在指定操作數的方式上不同。 另外,Tcl表達式支持非數字操作數和字符串比較。
操作數
Tcl表達式由操作數,運算符和括號組成。 操作數和運算符與括號之間可以使用空格; 它被表達式的指示忽略。 在可能的情況下,操作數被解釋為整數值。 整數值可以用十進制(正常情況下),八進制(如果操作數的第一個字符為0 )或十六進制(如果操作數的前兩個字符為0x )指定。 如果一個操作數沒有上面給出的整數格式之一,那麼它將被視為一個浮點數,如果這是可能的話。 浮點數可以用符合ANSI的C編譯器接受的任何方式指定(除了在大多數安裝中不允許使用f , F , l和L後綴)。 例如,以下所有內容都是有效的浮點數:2.1,3.,6e4,7.91e + 16。 如果沒有數字解釋是可能的,那麼操作數被保留為一個字符串(並且只有有限的一組操作符可以應用於它)。
操作數可以通過以下任何方式指定:
[1]
作為數值,可以是整數或浮點數。
[2]
作為一個Tcl變量,使用標準的$表示法。 該變量的值將被用作操作數。
[3]
作為用雙引號括起來的字符串。 表達式解析器將對引號之間的信息執行反斜杠,變量和命令替換,並將結果值用作操作數
[4]
作為括號中的字符串。 開放大括號和匹配大括號之間的字符將被用作操作數,而不進行任何替換。
[5]
作為括號中的Tcl命令。 該命令將被執行並且其結果將被用作操作數。
[6]
作為一個數學函數,其參數具有任何上述形式的操作數,如sin($ x) 。 請參閱下面的定義功能列表。
在上面發生替換(例如引用字符串內部)時,它們由表達式的指令執行。 但是,在調用表達式處理器之前,命令解析器可能已經執行了額外的替換層。 如下所述,通常最好將括號中的表達式括起來,以防止命令解析器對內容進行替換。
對於簡單表達式的一些示例,假設變量a的值為3,變量b的值為6.然後,下面每行的左側的命令將生成該行右側的值:
expr 3.1 + $ a6.1 expr 2 +“$ a。$ b”5.6 expr 4 * [llength“6 2”] 8 expr {{word one} <“word $ a”} 0運營商
下面列出了有效的運算符,按照優先級的降序進行分組:
- +〜!
一元減號,一元加號,按位不是,邏輯非。 這些操作數中沒有一個可以應用於字符串操作數,而按位NOT可以僅應用於整數。
* /%
相乘,除,餘數。 這些操作數中沒有一個可以應用於字符串操作數,餘數可能僅適用於整數。 其餘的將始終具有與除數相同的符號和小於除數的絕對值。
+ -
加減法。 適用於任何數字操作數。
<< >>
左右移動。 僅對整數操作數有效。 右移總是傳播符號位。
<> <=> =
布爾減少,大於,小於或等於,大於或等於。 如果條件為真,則每個運算符產生1,否則為0。 這些運算符可以應用於字符串以及數字操作數,在這種情況下使用字符串比較。
==!=
布爾相等而不相等。 每個運算符產生一個零/一個結果。 適用於所有操作數類型。
&
按位與。 僅對整數操作數有效。
^
按位獨占OR。 僅對整數操作數有效。
|
按位或。 僅對整數操作數有效。
&&
邏輯AND。 如果兩個操作數都為非零,則產生1結果,否則為0。 僅對布爾型和數字(整數或浮點型)操作數有效。
||
邏輯或。 如果兩個操作數均為零,則產生0結果,否則為1。 僅對布爾型和數字(整數或浮點型)操作數有效。
x ? y : z
If-then-else,如在C.如果x評估為非零,那麼結果是y的值。 否則,結果就是z的值。 x操作數必須有一個數值。
有關每個操作員生成的結果的更多詳細信息,請參閱C手冊。 所有的二元運算符在相同的優先級內從左到右分組。 例如,該命令
expr 4 * 2 <7返回0。
&& , || ,和?:運算符具有“懶惰評估”,就像在C中一樣,這意味著如果不需要確定結果,操作數就不會被評估。 例如,在命令中
expr {$ v? [a]:[b]}根據$ v的值,實際上只會評估[a]或[b]中的 一個 。 但是請注意,只有整個表達式用大括號括起來才是正確的。 否則,在調用expr命令之前,Tcl解析器將同時評估[a]和[b] 。
數學函數
Tcl在表達式中支持以下數學函數:
abs cosh log sqrt acos double log10 srand asin exp pow tan atan floor rand tanh atan2 fmod round ceil hypot sin cos int sinhabs( arg )
返回arg的絕對值。 Arg可以是整數或浮點數,結果以相同的形式返回。
acos( arg )
返回arg的反餘弦,範圍為[0,pi]弧度。 Arg應該在[-1,1]的範圍內。
asin( arg )
返回arg的反正弦值,範圍為[-pi / 2,pi / 2]弧度。 Arg應該在[-1,1]的範圍內。
阿坦( arg )
返回arg的反正切,範圍為[-pi / 2,pi / 2]弧度。
atan2( x,y )
返回y / x的反正切,範圍為[-pi,pi]弧度。 x和y不能都是0。
ceil( arg )
返回不小於arg的最小整數值。
cos( arg )
返回arg的餘弦,以弧度為單位。
cosh( arg )
返回arg的雙曲餘弦。 如果結果會導致溢出,則返回錯誤。
雙( arg )
如果arg是一個浮點值,則返回arg ,否則將arg轉換為浮點並返迴轉換後的值。
exp( arg )
返回arg的指數,定義為e ** arg 。 如果結果會導致溢出,則返回錯誤。
地板( arg )
返回不大於arg的最大整數值。
fmod( x,y )
返回x除以y的浮點餘數。 如果y為0,則返回錯誤。
hypot( x,y )
計算直角三角形( x * x + y * y )斜邊的長度。
int( arg )
如果arg是整數值,則返回arg ,否則通過截斷將arg轉換為整數並返迴轉換後的值。
日誌( arg )
返回arg的自然對數。 Arg必須是正值。
log10( arg )
返回arg的 10進制的對數。 Arg必須是正值。
pow( x,y )
計算x增加到y的值 。 如果x是負數,則y必須是整數值。
RAND()
返回從零到小於1的浮點數,或者在數學術語中,返回範圍[0,1)。 種子來自機器的內部時鐘,或者可以通過srand功能進行手動設置。
圓( arg )
如果arg是整數值,則返回arg ,否則通過舍入將arg轉換為整數並返迴轉換後的值。
罪( arg )
返回arg的正弦值,以弧度為單位。
sinh( arg )
返回arg的雙曲正弦值。 如果結果會導致溢出,則返回錯誤。
sqrt( arg )
返回arg的平方根。 Arg必須是非負的。
srand( arg )
arg必須是一個整數,用於重置隨機數生成器的種子。 返回該種子的第一個隨機數。 每個口譯員都有自己的種子。
tan( arg )
返回arg的正切值,以弧度為單位。
tanh( arg )
返回arg的雙曲正切。
除了這些預定義的函數之外,應用程序還可以使用Tcl_CreateMathFunc ()定義附加函數。
類型,溢出和精度
所有涉及整數的內部計算都是用C型long來完成的,所有涉及浮點的內部計算都是用C型double來完成的。 將字符串轉換為浮點時,檢測到指數溢出並導致Tcl錯誤。 對於從字符串轉換為整數,溢出的檢測取決於本地C庫中一些例程的行為,因此應視為不可靠。 在任何情況下,對於中間結果,通常不會可靠地檢測到整數溢出和下溢。 在硬件支持的程度上檢測浮點溢出和下溢,通常非常可靠。
整數,浮點和字符串操作數的內部表示之間的轉換根據需要自動完成。 對於算術計算,整數一直使用,直到引入一些浮點數,然後使用浮點數。 例如,
expr 5/4返回1,while
expr 5 / 4.0 expr 5 /([字符串長度“abcd”] + 0.0)兩者都返回1.25。 浮點值總是以``返回。 ''或e,這樣它們看起來不像整數值。 例如,
expr 20.0 / 5.0返回4.0 ,而不是4 。
字符串操作
字符串值可以用作比較運算符的操作數,儘管表達式計算器可能會嘗試將其作為整數或浮點進行比較。 如果比較操作數中的一個是字符串,另一個是數字值,則數字操作數將轉換回使用C sprintf格式說明符%d作為整數, %g作為浮點值的字符串。 例如,命令
expr {“0x03”>“2”} expr {“0y”<“0x12”}兩者都返回1.第一個比較是使用整數比較完成的,第二個比較是在第二個操作數轉換為字符串18後使用字符串比較完成的。 由於Tcl傾向於盡可能將值視為數字,因此,如果您真的想要字符串比較,並且操作數的值可以是任意的,那麼使用像==這樣的運算符通常不是一個好主意; 在這些情況下最好使用string命令。
性能考慮
將表達式括在大括號中以獲得最佳速度和最小存儲要求。 這允許Tcl字節碼編譯器生成最佳代碼。
如上所述,表達式被替換兩次:一次由Tcl解析器取代,一次由expr命令取代。 例如,命令
設置3 組b {$ a + 2} expr $ b * 4返回11,不是4的倍數。這是因為Tcl解析器將首先用變量b代替$ a + 2 ,然後expr命令將計算表達式$ a + 2 * 4 。
大多數表達式不需要第二輪替換。 要么它們被括在大括號中,要么它們的變量和命令替換產生不需要替換的數字或字符串。 但是,由於少數無束縛的表達式需要兩輪替換,所以字節碼編譯器必鬚髮出額外的指令來處理這種情況。 包含命令替換的無支撐表達式需要最昂貴的代碼。 每次執行表達式時都必須通過生成新代碼來實現這些表達式。
關鍵詞
算術, 布爾值 ,比較,表達式,模糊比較
重要提示:使用man命令( %man )查看特定計算機上的命令使用方式。