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