Provided by:
manpages-zh_1.5.1-1_all 
NAME
expr - 求一茠竁F式的
` SYNOPSIS
expr arg ?arg arg ...?
_________________________________________________________________
yz DESCRIPTION
連接(concatenate)所有 arg (在它怳介〃K加分隔符空格),把結果作為一紘cl
表示式來求(evaluate)並返回結果。在 Tcl 表達式中允釭瑣犑@符式在 C
表達式中允釭瑣犑@符的一茪l集,並且它抳P相應的 C
操作符有相同意義和優先級。表達式幾乎總是產生一蚍結果(整數或浮點數的-
)。例如,表達式
expr 8.2 + 6
求X 14.2. Tcl 表達式與 C 表達式在操作數指定的方式上有區別。還有,Tcl
表達式支持非數犑@符和字符串比較。
@ OPERANDS
一 Tcl
表達式由操作符、操作數和括號的組合構成。在操作符、操作數和括號之間可使用白空格;它被表達式的指令所忽略。指定整數-
i以使用十進制(通常的情況)、八進制(如果操作數的第一茼r符是
0)、或十六進制(如果操作數的前兩茼r符是 0x)。如果一蚞犑@數沒有上-
z的整數格式,則如果可能的話把它作為浮點數對待。指定浮點數可以使用任何遵從
ANSI 的 C 編譯器可接受方式(除了在多數安裝(installation)中不允 f、F、l
和 L 延伸檔名)。例如,下列的數都是有效的浮點數:
2.1、3.、6e4、7.91e+16。如果沒有可能的數挭嚏A則一-
蚞犑@數被作為字符串來保留(並且對它只提供一組有的操作符)。
可以用下列方式指定操作數:
[1] 為一蚍An麼是整數n麼是浮點數。
[2] 作為一 Tcl 變量,使用標準的 $ 記號。變量的N被用作操作數。
[3] 作為用雙引號包圍起來的一-
茼r符串。表達式分析器將在引號之間的信息上完成反斜槓、變量和命令替換,並把結果-
峓@操作數。
[4] 作為用花括號包圍起來的一-
茼r符串。在左花括號和相匹配的右花括號之間的字符將被用作操作數而不做任何替換。
[5] 作為一茈峇雓A號包圍起來的 Tcl
命令。命令將被執行並且它的結果將被用作操作數。
[6] 作為一蚍蝻A它的參數可以是操作數的任何上z形式,比如
sin($x)。參見下悸漱w定義的函數的一茼C表。
在上z替換發生的地方(例如在被引用起來的字符串當中),他-
怚悛竁F式的指令來完成。但是,在調用表達式處理器之前命令分析器可能已經完成了一-
蚚B外的替換層。如下-
掠Q論的那樣,通常最好把表達式包圍在花括號中來防止命令分析器在這些內容上進行替換。
舉一些簡單的表達式的例子,假設變量a 的O 3 並且變量 b 的O 6。則下-
悸漕C行左邊的命令將生成右邊的C
expr 3.1 + $a 6.1
expr 2 + "$a.$b" 5.6
expr 4*[llength "6 2"] 8
expr {{word one} < "word $a"}0
@ OPERATORS
下惘C出了有效的操作符,用優先級的飢徽:
- + ~ ! 一元(Unary,也譯為單目)減,一元加,位(bit-wise)
NOT,邏輯
NOT。這些操作符不能提供給字符串操作數,並且位 NOT
只能提供給整數。
* / % 慼A除,求餘。這些操作符不能提供給字符串操作數,並且求餘只能提供給整數。餘數將總是與除數有相同的符號並且絕對-
p於除數。
+ - 加和減。對任何數犑@數均有效。
<< >> 左移和右移。只對整數操作數有效。一右移總是傳播(propagate)符號位。
< > <= >= Boolean
小於,大於,小於等於,大於等於。如果條件是真則每-
蚞犑@符產生 1,否則 0。這些操作符可以像提供給數-
犑@數一樣提供給字符串,在這種情況下使用字符串比較。
== != Boolean 等於和不等於。每蚞犑@符產生一-
蚢s/一結果。對所有操作數類型有效。
& 位與。只對整數操作數有效。
^ 位異或。只對整數操作數有效。
| 位或。只對整數操作數有效。
&& 邏輯與。如果兩蚞犑@數都是非零則生成一 1,否則生成
0。只對 boolean 和數(整數或浮點數)操作數有效。
|| 邏輯或。如果兩蚞犑@數都是零則生成一 0,否則生成
1。只對 boolean 和數(整數或浮點數)操作數有效。
x?y:z If-then-else,如同 C 語言那樣。如果 x 求-
鬥D零,則結果是 y 的C否則結果是 z 的-
Cx操作數必須是一蚍C
參見 C 手冊來得到對每蚞犑@符的生成結果的更詳細的描-
z。所有相同的優先級的二元操作符從左至右的組合(group)。例如,命令
expr 4*2 < 7
返回 0.
&&, ||, 和 ?: 操作符「惰性求v,如同 C
語言那樣,這意味著如果操作數對確定結果不是必須的則不被求C例如,命令
expr {$v ? [a] : [b]}
中實際上只有 [a] 或 [b]中的一荓N被求A依賴於 $v 的C注意,這只在整-
茠竁F式被包圍在花括號中時是真的;否則 Tcl 分析器將在調用 expr
命令之前求 [a] 和 [b] 二者。
MATH FUNCTIONS
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 sinh
abs(arg)
返回 arg 的絕對CArg可以n麼式整數-
n麼是浮點數,並且結果以同樣的形式返回。
acos(arg)
返回 arg 的反餘弦,鴐O [0,pi] 弧度。Arg的定義域是 [-1,1]。 .TP
asin(arg) 返回 arg 的反正弦,鴐O [-pi/2,pi/2] 弧度。Arg
的定義域是 [-1,1]。
atan(arg)
返回 arg 的反正切,鴐O [-pi/2,pi/2] 弧度。
atan2(x, y)
返回 y/x 的反正切,鴐O [-pi,pi] 和,x 和 y 不能都是 0。
ceil(arg)
返回不小於 arg 的最小的整數C
cos(arg)
返回 arg 的餘弦,單位是弧度。
cosh(arg)
返回 arg 的雙曲餘弦,如果結果導P溢出,返回一蚇欞~。
double(arg)
如果 arg 是一荅B點A返回 arg;否則把 arg
轉換成浮點數並返回轉換後的C
exp(arg)
返回 arg 的指數,定義為 e**arg。如果結果導P溢出,返回一蚇欞~。
floor(arg)
返回不大於 arg 的最大整數C
fmod(x, y)
返回 x 除以 y 得到的浮點餘數。如果 y 是 0,返回一蚇欞~。
hypot(x, y)
p算一茠膘中T角形的斜邊的長度(x*x+y*y)。
int(arg)
如果 arg 是一蚞蒱,返回 arg,否則通過截取arg
(的整數部分)來把它轉換成整數並返回轉換後的C
log(arg)
返回 arg 的自然對數。Arg 必須是正數C
log10(arg)
返回 arg 的以10 為底的對數(常用對數)。Arg必須是正數C
pow(x, y)
p算 x 的 y 次鴃C如果 x 是t數,y 必須是一蚞蒱。
rand() 返回一茪j於等於零且小於 1 的一(隨機)浮點數,這-
S圍用數學術語是區間[0,1)。種子來自機器的內部時鐘或用 srand
函數人為設定。
round(arg)
如果 arg 是一蚞蒱A返回 arg,否則通過四舍中J把 arg
轉換成整數並返回轉換後的C
sin(arg)
返回 arg 的正弦,單位是弧度。
sinh(arg)
返回 arg 的雙曲正弦。如果結果導P溢出,返回一蚇欞~。
sqrt(arg)
返回 arg 的開方。Arg 必須是非t數。
srand(arg)
arg 必須是一蚞蒱A它被用於姜m隨機數生成器的種子。返回用這-
蚨堣l生成的第一蚗H機數。每虒挭擰像ㄕ野戌菑v的種子。
tan(arg)
返回 arg 的正切。單位是弧度。
tanh(arg)
返回 arg 的雙曲正切。
除了這些預定義的函數之外,應用可以使用 Tcl_CreateMathFunc ()
定義增補的函數。
TYPES,X OVERFLOW,M PRECISION
所有涉及整數的內部運算用 C 類型 long
處置。並且所有涉及浮點數的內部運算用 C 類型 double 處置。當把一-
茼r符串轉換成一荅B點數的時唌AY檢測到指數溢出則導P一 Tcl
錯誤。對於從字符串轉換成整數,溢出檢測依賴於在本地 C
庫中的一些例程的行為,所以它應被作為不可靠的來看待。在任何情況下,對中間結果通常不能可靠的檢測整數的上溢和下溢。浮點數上溢和下溢的檢測通常達到由硬體支持的程度,普遍非常可靠。
整數,浮點數、和字符串的內部表示之間的轉換按需n自動完成。對於算術-
p算,在浮點數介入之前使用整數,此後使用浮點數。例如,
expr 5 / 4
返回 1,而
expr 5 / 4.0
expr 5 / ( [string length "abcd"] + 0.0 )
都返回 1.25。 返回的浮點`是帶著一荂u.」或一 e 所以它怓搯_來不像整數-
C例如,
expr 20.0/5.0
返回 4.0, 而不是 4.
r@ STRING OPERATIONS
字符串可被用做比較操作符的操作數,儘管表達式求-
劃犮i能的嘗試著作為整數或浮點數來做比較。如果一茪騆的操作數中的一-
茯O字符串而其他是數,數犑@數被轉換回字符串,對整數洏 C sprintf
格式指定符 %d ,對浮點數洏 %g。例如,命令
expr {"0x03" > "2"}
expr {"0y" < "0x12"}
都返回 1。做第一茪騆使用了整數比較,而做第二茪騆在把第二-
蚞犑@數轉換成字符串 18之後使用了字符串比較。因為 Tcl 趨向於盡可能的把-
@為數麉搳A在你事實上想進行字符串比較並且操作符的i以是任意的的時-
唻洏庣 == 這樣的操作符通常不是茼n主意;在這種情況下最好使用
string命令。
{ PERFORMANCE CONSIDERATIONS
n得到最快的速度和最小的存儲需求,就n把表達式包圍在花括號中。這允 Tcl
字節碼編譯器生成最好的代碼。
像上惟珒ㄓ峈漕獐芊A表達式被替換兩次: 一次由 Tcl 解釋器,一次由 expr
命令。例如,命令
set a 3
set b {$a + 2}
expr $b*4
返回 11,而不是 4 的蕉C這是因為 Tcl 分析器將漸把變量 b替換成 $a +
2,接著 expr 命令將求竁F式 $a + 2*4。
多數表達式不需n兩輪替換。n它抭Q包圍在花括號中,n麼它-
怐瘍僆q和命令替換生成數峊豪不需-
n替換的字符串。但是,因為一些未用化括號包圍起來的表達式需-
n兩輪替換,字節碼編譯器必須散佈(emit)額外的指令來處理這些情況。對於未用化括號包圍起來的表達式,代價最高昂的代碼是包含命令替換的代碼。必須通過在每次執行這-
茠竁F式時生成新的代碼來實現這些表達式。
r KEYWORDS
arithmetic, boolean, compare, expression, fuzzy comparison
[]
Hhh
[]
2001/07/22
m Linux manUpn:
http://cmpp.linuxforum.net