名称
expr - 评估表达式
概要
EXPR ARG ? arg arg … ?
串接 ARG (在它们之间添加分隔符空格),将结果计算为Tcl表达式,并返回该值。 Tcl表达式中允许的运算符是C表达式中允许的运算符的子集,它们与相应的C运算符具有相同的含义和优先级。表达式几乎总是产生数值结果(整数或浮点值)。例如,表达式
expr 8.2 + 6
评估为14.2。在指定操作数的方式中,Tcl表达式与C表达式不同。此外,Tcl表达式支持非数字操作数和字符串比较。
操作数
Tcl表达式由操作数,运算符和括号组成。操作数和运算符以及括号之间可以使用空格;它被表达式的指令忽略了。在可能的情况下,操作数被解释为整数值。整数值可以十进制(正常情况)指定,以八进制表示(如果操作数的第一个字符是0),或十六进制(如果操作数的前两个字符是0X)。如果操作数没有上面给出的整数格式之一,那么如果可能,则将其视为浮点数。浮点数可以用ANSI兼容的C编译器接受的任何方式指定(除了F, F, 升,和大号 在大多数安装中不允许使用后缀)。例如,以下所有都是有效的浮点数:2.1,3.,6e4,7.91e + 16。如果不可能进行数字解释,那么操作数将保留为字符串(并且只能对其应用一组有限的运算符)。
操作数可以通过以下任何方式指定:
1
作为数值,可以是整数或浮点数。
2
作为Tcl变量,使用标准$ 符号。变量的值将用作操作数。
3
作为用双引号括起来的字符串。表达式解析器将对引号之间的信息执行反斜杠,变量和命令替换,并将结果值用作操作数
4
作为括在括号中的字符串。开括号和匹配的闭括号之间的字符将用作操作数而没有任何替换。
5
作为括在括号中的Tcl命令。该命令将被执行,其结果将用作操作数。
6
作为一个数学函数,其参数具有上述任何操作数形式,例如罪($ X)。请参阅下面的已定义函数列表。
在上面发生替换的情况下(例如在引用的字符串内),它们由表达式的指令执行。但是,在调用表达式处理程序之前,命令解析器可能已经执行了额外的替换层。如下所述,通常最好将表达式括在大括号中以防止命令解析器对内容执行替换。
对于简单表达式的一些示例,假设变量一个 具有值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。这些运算符可以应用于字符串以及数字操作数,在这种情况下使用字符串比较。
== !=
布尔值相等且不相等。每个运算符产生零/一个结果。适用于所有操作数类型。
&
按位和。仅对整数操作数有效。
^
按位异或。仅对整数操作数有效。
|
按位或。仅对整数操作数有效。
&&
逻辑和。如果两个操作数都为非零,则产生1个结果,否则为0。仅对布尔和数字(整数或浮点)操作数有效。
||
逻辑或。如果两个操作数都为零,则产生0结果,否则产生1。仅对布尔和数字(整数或浮点)操作数有效。
X ? ÿ : ž
If-then-else,如C. X 求值为非零,则结果为值 ÿ 。否则,结果是值 ž 。该 X 操作数必须具有数值。
有关每个操作员生成结果的更多详细信息,请参阅C手册。所有二元运算符都在相同的优先级内从左到右分组。例如,命令
expr 4 * 2 <7
返回0。
该&&, ||,和?: 运算符具有“懒惰评估”,就像在C中一样,这意味着如果不需要操作数来确定结果,则不对其进行评估。例如,在命令中
expr {$ v? a:b}
只有一个一个 要么并b 实际上将根据价值进行评估$ v。但请注意,只有将整个表达式括在大括号中时才会出现这种情况。否则,Tcl解析器将评估两者一个 和并b 在调用之前EXPR 命令。
数学函数
Tcl在表达式中支持以下数学函数:
ABS 护身用手杖日志开方 ACOS 双LOG10函数srand ASIN EXPPOW黄褐色 晒黑 地板兰特正切 ATAN2 FMOD回合 小区 hypot将罪 COS INT双曲正弦
ABS( ARG )
返回的绝对值 ARG . 精氨酸 可以是整数或浮点数,结果以相同的形式返回。
ACOS( ARG )
返回的反余弦值 ARG ,在0,pi弧度范围内。 精氨酸 应该在-1,1范围内。
ASIN( ARG )
返回的正弦值 ARG ,在-pi / 2,pi / 2弧度范围内。 精氨酸 应该在-1,1范围内。
晒黑( ARG )
返回的反正切 ARG ,在-pi / 2,pi / 2弧度范围内。
ATAN2( x,y )
返回的反正切 ÿ / X ,在-pi,pi弧度范围内。 X 和 ÿ 不能都是0。
小区( ARG )
返回不小于的最小整数值 ARG .
COS( ARG )
返回的余弦 ARG ,以弧度表示。
COSH( ARG )
返回的双曲余弦值 ARG 。如果结果将导致溢出,则返回错误。
双( ARG )
如果 ARG 是一个浮动值,返回 ARG ,否则转换 ARG 浮动并返回转换后的值。
EXP( ARG )
返回指数 ARG ,定义为e ** ARG 。如果结果将导致溢出,则返回错误。
地板( ARG )
返回不大于的最大整数值 ARG .
FMOD( x,y )
返回除法的浮点余数 X 通过 ÿ 。如果 ÿ 为0,返回错误。
hypot将( x,y )
计算直角三角形的斜边长度( X * X + ÿ * ÿ ).
INT( ARG )
如果 ARG 是一个整数值,返回 ARG ,否则转换 ARG 通过截断转换为整数并返回转换后的值。
日志( ARG )
返回的自然对数 ARG . 精氨酸 必须是一个积极的价值。
LOG10( ARG )
返回基数10的对数 ARG . 精氨酸 必须是一个积极的价值。
POW( x,y )
计算的值 X 提升到了权力 ÿ 。如果 X 是消极的, ÿ 必须是整数值。
RAND()
返回从零到小于1的浮点数,或者在数学术语中,返回范围0,1)。种子来自机器的内部时钟,或者可以使用srand功能手动设置。
回合( ARG )
如果 ARG 是一个整数值,返回 ARG ,否则转换 ARG 通过舍入返回整数并返回转换后的值。
罪( ARG )
返回的正弦值 ARG ,以弧度表示。
SINH( ARG )
返回双曲正弦值 ARG 。如果结果将导致溢出,则返回错误。
SQRT( ARG )
返回的平方根 ARG . 精氨酸 必须是非负面的。
函数srand( ARG )
该 ARG 必须是整数,用于重置随机数生成器的种子。返回该种子中的第一个随机数。每个口译员都有自己的种子。
棕褐色( ARG )
返回的正切值 ARG ,以弧度表示。
正切( ARG )
返回的双曲正切值 ARG .
除了这些预定义的功能,应用程序还可以使用定义其他功能Tcl_CreateMathFunc().
类型,溢出和精度
涉及整数的所有内部计算都是使用C类型完成的 长 ,所有涉及浮点的内部计算都是用C类型完成的 双 。将字符串转换为浮点时,会检测到指数溢出并导致Tcl错误。对于从字符串转换为整数,溢出的检测取决于本地C库中某些例程的行为,因此应将其视为不可靠。在任何情况下,对于中间结果,通常不能可靠地检测整数上溢和下溢。检测到浮点溢出和下溢达到硬件支持的程度,这通常非常可靠。
根据需要,自动完成整数,浮点和字符串操作数的内部表示之间的转换。对于算术计算,使用整数直到引入某个浮点数,然后使用浮点数。例如,
expr 5/4
返回1,而
expr 5 / 4.0 expr 5 /(字符串长度“abcd” + 0.0)
均返回1.25。浮点值总是以``返回.'或者Ë 这样它们看起来不像整数值。例如,
expr 20.0 / 5.0
回报4.0不是4.
字符串操作
字符串值可以用作比较运算符的操作数,尽管表达式求值程序尝试在可能的情况下进行整数或浮点比较。如果比较的一个操作数是字符串而另一个操作数具有数值,则使用C将数字操作数转换回字符串 的sprintf 格式说明符%d 对于整数和%G 对于浮点值。例如,命令
expr {“0x03”>“2”} expr {“0y”<“0x12”}
返回1.第一次比较是使用整数比较完成的,第二次比较是在第二次操作数转换为字符串后使用字符串比较完成的18。由于Tcl倾向于尽可能将值视为数字,因此使用类似的运算符通常不是一个好主意==当你真的想要字符串比较时,操作数的值可以是任意的;在这些情况下使用它会更好串 而命令。
性能注意事项
将表达式括在括号中以获得最佳速度和最小存储要求。这允许Tcl字节码编译器生成最佳代码。
如上所述,表达式被替换两次:一次由Tcl解析器替换,一次由 EXPR 命令。例如,命令
设置3 设置b {$ a + 2} expr $ b * 4
返回11,而不是4的倍数。这是因为Tcl解析器将首先替换$ a + 2 对于变量b那么EXPR 命令将评估表达式$ a + 2 * 4.
大多数表达不需要第二轮替换。它们被括在括号中,或者如果没有,它们的变量和命令替换产生的数字或字符串本身不需要替换。但是,因为一些无支撑的表达式需要两轮替换,所以字节码编译器必须发出额外的指令来处理这种情况。包含命令替换的无括号表达式需要最昂贵的代码。必须通过每次执行表达式时生成新代码来实现这些表达式。
关键词
算术,布尔,比较,表达,模糊比较
重要: 使用 人 命令( % 人 )查看特定计算机上如何使用命令。