Manpages

______________________________________________________________________________

NAME

expr - 求 一 個 表 達 式 的 值

總 覽 SYNOPSIS

expr arg ?arg arg ...? _________________________________________________________________

描 述 DESCRIPTION

連 接 (concatenate)所 有 arg (在 它 們 中 間 添 加 分 隔 符 空 格 ), 把 結 果 作 爲 一 個 Tcl 表 示 式 來 求 值 (evaluate)並 返 回 結 果 。 在 Tcl 表 達 式 中 允 許 的 操 作 符 式 在 C 表 達 式 中 允 許 的 操 作 符 的 一 個 子 集 , 並 且 它 們 與 相 應 的 C 操 作 符 有 相 同 意 義 和 優 先 級 。 表 達 式 幾 乎 總 是 產 生 一 個 數 值 結 果 (整 數 或 浮 點 數 的 值 )。 例 如 , 表 達 式

expr 8.2 + 6 求 值 出14.2. Tcl 表 達 式 與 C 表 達 式 在 操 作 數 指 定 的 方 式 上 有 區 別 。 還 有 , Tcl 表 達 式 支 持 非 數 值 操 作 符 和 字 符 串 比 較 。

操 作 數 OPERANDS

一 個 Tcl 表 達 式 由 操 作 符 、 操 作 數 和 括 號 的 組 合 構 成 。 在 操 作 符 、 操 作 數 和 括 號 之 間 可 使 用 白 空 格 ; 它 被 表 達 式 的 指 令 所 忽 略 。 指 定 整 數 值 可 以 使 用 十 進 制 (通 常 的 情 況 )、 八 進 制 (如 果 操 作 數 的 第 一 個 字 符 是 0)、 或 十 六 進 制 (如 果 操 作 數 的 前 兩 個 字 符 是 0x)。 如 果 一 個 操 作 數 沒 有 上 述 的 整 數 格 式 , 則 如 果 可 能 的 話 把 它 作 爲 浮 點 數 對 待 。 指 定 浮 點 數 可 以 使 用 任 何 遵 從 ANSI 的 C 編 譯 器 可 接 受 方 式 (除 了 在 多 數 安 裝 (installation)中 不 允 許 fFlL 後 綴 )。 例 如 , 下 列 的 數 都 是 有 效 的 浮 點 數 : 2.1、 3.、 6e4、 7.91e+16。 如 果 沒 有 可 能 的 數 值 解 釋 , 則 一 個 操 作 數 被 作 爲 字 符 串 來 保 留 (並 且 對 它 只 提 供 一 組 有 限 的 操 作 符 )。 可 以 用 下 列 方 式 指 定 操 作 數 :

[1] 爲 一 個 數 值 值 , 要 麼 是 整 數 要 麼 是 浮 點 數 。

[2] 作 爲 一 個

Tcl 變 量 , 使 用 標 準 的 $ 記 號 。 變 量 的 值 將 被 用 作 操 作 數 。

[3] 作 爲 用 雙 引 號 包 圍 起 來 的 一 個 字 符 串 。 表 達 式 分 析 器 將 在 引 號 之 間 的 信 息 上 完 成 反 斜 槓 、 變 量 和 命 令 替 換 , 並 把 結 果 值 用 作 操 作 數 。

[4] 作 爲 用 花 括 號 包 圍 起 來 的 一 個 字 符 串 。 在 左 花 括 號 和 相 匹 配 的 右 花 括 號 之 間 的 字 符 將 被 用 作 操 作 數 而 不 做 任 何 替 換 。

[5] 作 爲 一 個 用 方 括 號 包 圍 起 來 的

Tcl 命 令 。 命 令 將 被 執 行 並 且 它 的 結 果 將 被 用 作 操 作 數 。

[6] 作 爲 一 個 數 學 函 數 , 它 的 參 數 可 以 是 操 作 數 的 任 何 上 述 形 式 , 比 如

sin($x)。 參 見 下 面 的 已 定 義 的 函 數 的 一 個 列 表 。 在 上 述 替 換 髮 生 的 地 方 (例 如 在 被 引 用 起 來 的 字 符 串 當 中 ), 他 們 由 表 達 式 的 指 令 來 完 成 。 但 是 , 在 調 用 表 達 式 處 理 器 之 前 命 令 分 析 器 可 能 已 經 完 成 了 一 個 額 外 的 替 換 層 。 如 下 面 討 論 的 那 樣 , 通 常 最 好 把 表 達 式 包 圍 在 花 括 號 中 來 防 止 命 令 分 析 器 在 這 些 內 容 上 進 行 替 換 。 舉 一 些 簡 單 的 表 達 式 的 例 子 , 假 設 變 量 a 的 值 是 3 並 且 變 量 b 的 值 是 6。 則 下 面 的 每 行 左 邊 的 命 令 將 生 成 右 邊 的 值 。

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

下 面 列 出 了 有 效 的 操 作 符 , 用 優 先 級 的 降 序 分 組 :

- + ~ ! 一 元

(Unary, 也 譯 爲 單 目 )減 , 一 元 加 , 位 (bit-wise)

NOT, 邏 輯 NOT。 這 些 操 作 符 不 能 提 供 給 字 符 串 操 作 數 , 並 且 位 NOT 只 能 提 供 給 整 數 。

* / % 乘 , 除 , 求 餘 。 這 些 操 作 符 不 能 提 供 給 字 符 串 操 作 數 , 並 且 求 餘 隻 能 提 供 給 整 數 。 餘 數 將 總 是 與 除 數 有 相 同 的 符 號 並 且 絕 對 值 小 於 除 數 。

+ - 加 和 減 。 對 任 何 數 值 操 作 數 均 有 效 。

<< >> 左 移 和 右 移 。 只 對 整 數 操 作 數 有 效 。 一 右 移 總 是 傳 播

(propagate)符 號 位 。

< > <= >=

Boolean 小 於 , 大 於 , 小 於 等 於 , 大 於 等 於 。 如 果 條 件 是 真 則 每 個 操 作 符 產 生 1, 否 則 0。 這 些 操 作 符 可 以 象 提 供 給 數 值 操 作 數 一 樣 提 供 給 字 符 串 , 在 這 種 情 況 下 使 用 字 符 串 比 較 。

== !=

Boolean 等 於 和 不 等 於 。 每 個 操 作 符 產 生 一 個 零 /一 結 果 。 對 所 有 操 作 數 類 型 有 效 。

&

位 與 。 只 對 整 數 操 作 數 有 效 。

^ 位 異 或 。 只 對 整 數 操 作 數 有 效 。

| 位 或 。 只 對 整 數 操 作 數 有 效 。

&& 邏 輯 與 。 如 果 兩 個 操 作 數 都 是 非 零 則 生 成 一 個

1, 否 則 生

成 0。 只 對 boolean 和 數 值 (整 數 或 浮 點 數 )操 作 數 有 效 。

|| 邏 輯 或 。 如 果 兩 個 操 作 數 都 是 零 則 生 成 一 個

0, 否 則 生 成

1。 只 對 boolean 和 數 值 (整 數 或 浮 點 數 )操 作 數 有 效 。

x?y:z

If-then-else, 如 同 C 語 言 那 樣 。 如 果 x 求 值 爲 非 零 , 則 結 果 是 y 的 值 。 否 則 結 果 是 z 的 值 。 x操 作 數 必 須 是 一 個 數 值 值 。

參 見 C 手 冊 來 得 到 對 每 個 操 作 符 的 生 成 結 果 的 更 詳 細 的 描 述 。 所 有 相 同 的 優 先 級 的 二 元 操 作 符 從 左 至 右 的 組 合 (group)。 例 如 , 命 令

expr 4*2 < 7 返 回0.

&&, ||, 和 ?: 操 作 符 “惰 性 求 值 ”, 如 同 C 語 言 那 樣 , 這 意 味 着 如 果 操 作 數 對 確 定 結 果 不 是 必 須 的 則 不 被 求 值 。 例 如 , 命 令

expr {$v ? [a] : [b]} 中 實 際 上 只 有 [a][b]中 的 一 個 將 被 求 值 , 依 賴 於 $v 的 值 。 注 意 , 這 隻 在 整 個 表 達 式 被 包 圍 在 花 括 號 中 時 是 真 的 ; 否 則 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 的 絕 對 值 。 Arg可 以 要 麼 式 整 數 要 麼 是 浮 點 數 , 並 且 結 果 以 同 樣 的 形 式 返 回 。
acos(
arg) 返 回 arg 的 反 餘 弦 , 值 域 是 [0,pi] 弧 度 。 Arg的 定 義 域 是 [-1,1]。 .TP asin(arg) 返 回 arg 的 反 正 弦 , 值 域 是 [-pi/2,pi/2] 弧 度 。 Arg 的 定 義 域 是 [-1,1]。
atan(
arg) 返 回 arg 的 反 正 切 , 值 域 是 [-pi/2,pi/2] 弧 度 。
atan2(
x, y) 返 回 y/x 的 反 正 切 , 值 域 是 [-pi,pi] 和 , xy 不 能 都 是 0。
ceil(
arg) 返 回 不 小 於 arg 的 最 小 的 整 數 值 。
cos(
arg) 返 回 arg 的 餘 弦 , 單 位 是 弧 度 。
cosh(
arg) 返 回 arg 的 雙 曲 餘 弦 , 如 果 結 果 導 致 溢 出 , 返 回 一 個 錯 誤 。
double(
arg) 如 果 arg 是 一 個 浮 點 值 , 返 回 arg; 否 則 把 arg 轉 換 成 浮 點 數 並 返 回 轉 換 後 的 值 。
exp(
arg) 返 回 arg 的 指 數 , 定 義 爲 e**arg。 如 果 結 果 導 致 溢 出 , 返 回 一 個 錯 誤 。
floor(
arg) 返 回 不 大 於 arg 的 最 大 整 數 值 。
fmod(
x, y) 返 回 x 除 以 y 得 到 的 浮 點 餘 數 。 如 果 y 是 0, 返 回 一 個 錯 誤 。
hypot(
x, y) 計 算 一 個 直 角 三 角 形 的 斜 邊 的 長 度 (x*x+y*y)。
int(
arg) 如 果 arg 是 一 個 整 數 值 , 返 回 arg, 否 則 通 過 截 取 arg (的 整 數 部 分 )來 把 它 轉 換 成 整 數 並 返 回 轉 換 後 的 值 。
log(
arg) 返 回 arg 的 自 然 對 數 。 Arg 必 須 是 正 數 值 。
log10(
arg) 返 回 arg 的 以 10 爲 底 的 對 數 (常 用 對 數 )。 Arg必 須 是 正 數 值 。
pow(
x, y) 計 算 xy 次 冪 。 如 果 x 是 負 數 , y 必 須 是 一 個 整 數 值 。

rand() 返 回 一 個 大 於 等 於 零 且 小 於

1 的 一 個 (隨 機 )浮 點 數 , 這 個 範 圍 用 數 學 術

語 是 區 間 [0,1)。 種 子 來 自 機 器 的 內 部 時 鐘 或 用 srand 函 數 人 爲 設 定 。

round(arg) 如 果 arg 是 一 個 整 數 , 返 回 arg, 否 則 通 過 四 捨 五 入 把 arg 轉 換 成 整 數 並 返 回 轉 換 後 的 值 。
sin(
arg) 返 回 arg 的 正 弦 , 單 位 是 弧 度 。
sinh(
arg) 返 回 arg 的 雙 曲 正 弦 。 如 果 結 果 導 致 溢 出 , 返 回 一 個 錯 誤 。
sqrt(
arg) 返 回 arg 的 開 方 。 Arg 必 須 是 非 負 數 。
srand(
arg)

arg 必 須 是 一 個 整 數 , 它 被 用 於 重 置 隨 機 數 生 成 器 的 種 子 。 返 回 用 這 個 種 子 生 成 的 第 一 個 隨 機 數 。 每 個 解 釋 器 都 有 它 自 己 的 種 子 。

tan(arg) 返 回 arg 的 正 切 。 單 位 是 弧 度 。
tanh(
arg) 返 回 arg 的 雙 曲 正 切 。 除 了 這 些 預 定 義 的 函 數 之 外 , 應 用 可 以 使 用 Tcl_CreateMathFunc () 定 義 增 補 的 函 數 。

類 型 TYPES, 溢 出 OVERFLOW, 和 精 度 PRECISION

所 有 涉 及 整 數 的 內 部 運 算 用 C 類 型 long 處 置 。 並 且 所 有 涉 及 浮 點 數 的 內 部 運 算 用 C 類 型 double 處 置 。 當 把 一 個 字 符 串 轉 換 成 一 個 浮 點 數 的 時 候 , 若 檢 測 到 指 數 溢 出 則 導 致 一 個 Tcl 錯 誤 。 對 於 從 字 符 串 轉 換 成 整 數 , 溢 出 檢 測 依 賴 於 在 本 地 C 庫 中 的 一 些 例 程 的 行 爲 , 所 以 它 應 被 作 爲 不 可 靠 的 來 看 待 。 在 任 何 情 況 下 , 對 中 間 結 果 通 常 不 能 可 靠 的 檢 測 整 數 的 上 溢 和 下 溢 。 浮 點 數 上 溢 和 下 溢 的 檢 測 通 常 達 到 由 硬 件 支 持 的 程 度 , 普 遍 非 常 可 靠 。 整 數 , 浮 點 數 、 和 字 符 串 的 內 部 表 示 之 間 的 轉 換 按 需 要 自 動 完 成 。 對 於 算 術 計 算 , 在 浮 點 數 介 入 之 前 使 用 整 數 , 此 後 使 用 浮 點 數 。 例 如 ,

expr 5 / 4 返 回1, 而
expr 5 / 4.0
expr 5 / ( [string length "abcd"] + 0.0 )
都 返 回1.25。 返 回 的 浮 點 值 總 是 帶 着 一 個 “.”或 一 個 e 所 以 它 們 看 起 來 不 象 整 數 值 。 例 如 ,
expr 20.0/5.0
返 回4.0, 而 不 是 4.

字 符 串 操 作 STRING OPERATIONS

字 符 串 可 被 用 做 比 較 操 作 符 的 操 作 數 , 儘 管 表 達 式 求 值 器 儘 可 能 的 嘗 試 着 作 爲 整 數 或 浮 點 數 來 做 比 較 。 如 果 一 個 比 較 的 操 作 數 中 的 一 個 是 字 符 串 而 其 他 是 數 值 值 , 數 值 操 作 數 被 轉 換 回 字 符 串 , 對 整 數 值 使 用 C sprintf 格 式 指 定 符 %d , 對 浮 點 數 值 使 用 %g。 例 如 , 命 令

expr {"0x03" > "2"}
expr {"0y" < "0x12"}
都 返 回1。 做 第 一 個 比 較 使 用 了 整 數 比 較 , 而 做 第 二 個 比 較 在 把 第 二 個 操 作 數 轉 換 成 字 符 串 18之 後 使 用 了 字 符 串 比 較 。 因 爲 Tcl 趨 向 於 盡 可 能 的 把 值 作 爲 數 值 對 待 , 在 你 事 實 上 想 進 行 字 符 串 比 較 並 且 操 作 符 的 值 可 以 是 任 意 的 的 時 候 使 用 象 == 這 樣 的 操 作 符 通 常 不 是 個 好 主 意 ; 在 這 種 情 況 下 最 好 使 用 string命 令 。

性 能 的 考 慮 PERFORMANCE CONSIDERATIONS

要 得 到 最 快 的 速 度 和 最 小 的 存 儲 需 求 , 就 要 把 表 達 式 包 圍 在 花 括 號 中 。 這 允 許 Tcl 字 節 碼 編 譯 器 生 成 最 好 的 代 碼 。 象 上 面 所 提 及 的 那 樣 , 表 達 式 被 替 換 兩 次 : 一 次 由 Tcl 解 釋 器 , 一 次 由 expr 命 令 。 例 如 , 命 令

set a 3
set b {$a + 2}
expr $b*4
返 回11, 而 不 是 4 的 倍 數 。 這 是 因 爲 Tcl 分 析 器 將 首 先 把 變 量 b替 換 成 $a + 2, 接 着 expr 命 令 將 求 值 表 達 式 $a + 2*4。 多 數 表 達 式 不 需 要 兩 輪 替 換 。 要 它 們 被 包 圍 在 花 括 號 中 , 要 麼 它 們 的 變 量 和 命 令 替 換 生 成 數 值 或 本 身 不 需 要 替 換 的 字 符 串 。 但 是 , 因 爲 一 些 未 用 化 括 號 包 圍 起 來 的 表 達 式 需 要 兩 輪 替 換 , 字 節 碼 編 譯 器 必 須 散 佈 (emit)額 外 的 指 令 來 處 理 這 些 情 況 。 對 於 未 用 化 括 號 包 圍 起 來 的 表 達 式 , 代 價 最 高 昂 的 代 碼 是 包 含 命 令 替 換 的 代 碼 。 必 須 通 過 在 每 次 執 行 這 個 表 達 式 時 生 成 新 的 代 碼 來 實 現 這 些 表 達 式 。

關 鍵 字 KEYWORDS

arithmetic, boolean, compare, expression, fuzzy comparison

[中 文 版 維 護 人 ]

寒 蟬 退 士

[中 文 版 最 新 更 新 ]

2001/07/22

《 中 國 Linux 論 壇 man 手 冊 頁 翻 譯 計 劃 》 :

http://cmpp.linuxforum.net

本 頁 面 中 文 版 由 中 文 man 手 冊 頁 計 劃 提 供 。 中 文 man 手 冊 頁 計 劃 : https://github.com/man-pages-zh/manpages-zh

COMMENTS