初识Tcl(三):Tcl 变量及运算符
【摘要】 目录
Tcl变量
变量命名
动态类型
数学表达式
TCL运算符
算术运算符
关系运算符
逻辑运算符
位运算符
三元运算符
Tcl运算符优先级
Tcl算术运算符
例子
Tcl关系运算符
例子
Tcl逻辑运算符
示例
Tcl位运算符
示例
Tcl三元运算符
示例
Tcl运算符优先级
示例
Tcl变量
在TCL,变量声明没有概念...
目录
Tcl变量
在TCL,变量声明没有概念。当遇到一个新的变量名,TCL将定义一个新的变量。
变量命名
变量的名称可以包含任何字符和长度。甚至可以存在空格被封闭在大括号中的变量,但不建议这样做。
set命令用于指定值的变量。set 命令的语法是:
set variableName value
变量的几个例子如下所示。
#!/usr/bin/tclsh
set variableA 10
set {variable B} test
puts $variableA
puts ${variable B}
当上述代码被执行时,它会产生以下结果。
10
test
正如可以在上面的方案看到,$variableName 用于获取变量的值。
动态类型
TCL是一种动态类型语言。变量的值可以在需要时被动态地转换为所需的类型。例如,一个数字5,其被存储为字符串将做的算术运算时被转换为数字。它如下所示。
#!/usr/bin/tclsh
set variableA "10"
puts $variableA
set sum [expr $variableA +20];
puts $sum
当上述代码被执行时,它会产生以下结果。
10
30
数学表达式
正如在上面的例子中看到,expr是用于表示数学表达式。 Tcl默认精度为12位。为了得到浮点运算的结果,我们应该增加至少一个十进制数字。一个简单的例子说明了上述情况。
#!/usr/bin/tclsh
set variableA "10"
set result [expr $variableA / 9];
puts $result
set result [expr $variableA / 9.0];
puts $result
set variableA "10.0"
set result [expr $variableA / 9];
puts $result
当上述代码被执行时,它会产生以下结果。
1
1.1111111111111112
1.1111111111111112
在上面的例子中,可以看到三种情况。第一种情况,被除数和除数是整数,得到一个整数作为结果。第二种情况,除数是小数以及第三种情况,分数是一个十进制数。在第二和第三情况下,得到的是十进制数作的结果。
在上面的代码,可以使用tcl_precision特殊变量改变精度。它如下所示。
#!/usr/bin/tclsh
set variableA "10"
set tcl_precision 5
set result [expr $variableA / 9.0];
puts $result
当上述代码被执行时,它会产生以下结果。
1.1111
TCL运算符
运算符是一个符号,告诉编译器执行特定的数学或逻辑操作。 Tcl语言有丰富的内置运算符,运算符提供的以下几种类型:
- 算术运算符
- 关系运算符
- 逻辑运算符
- 位运算符
- 三元运算符
本教程将一个一个地来解释算术,关系,逻辑,位及其他运算符。
算术运算符
下表列出了所有Tcl语言支持的算术运算符。假设变量A=10,变量B=20,则:
运算符 | 描述 | 实例 |
---|---|---|
+ | 两个操作数相加 | A + B = 30 |
- | 第一个操作数减去第二个操作数 | A - B = -10 |
* | 两个操作数相乘 | A * B = 200 |
/ | 除法分子通过去分母 | B / A = 2 |
% | 模运算及整数除法后的余数 | B % A = 0 |
关系运算符
下表列出了所有Tcl语言支持的关系运算符。假设变量A=10,以及变量B=20,则:
操作符 | 描述 | 例子 |
---|---|---|
== | 检查两个操作数的值是否相等,如果是的话那么条件为真。 | (A == B) 不为 true. |
!= | 检查两个操作数的值是否相等,如果值不相等,则条件为真。 | (A != B) 为 true. |
> | 检查左边的操作数的值是否大于右操作数的值,如果是的话那么条件为真。 | (A > B) 不为 true. |
< | 检查左边的操作数的值是否小于右操作数的值,如果是的话那么条件为真。 | (A < B) 为 true. |
>= | 检查左边的操作数的值是否大于或等于右操作数的值,如果是的话那么条件为真。 | (A >= B) 不为 true. |
<= | 检查左边的操作数的值是否小于或等于右操作数的值,如果是的话那么条件为真。 | (A <= B) 为 true. |
逻辑运算符
下表列出了所有Tcl语言支持的逻辑运算符。假设变量A=1和变量B=0,则:
运算符 | 描述 | 例子 |
---|---|---|
&& | 所谓逻辑与操作。如果两个操作数都非零,则条件变为真。 | (A && B) 为 false. |
|| | 所谓的逻辑或操作。如果任何两个操作数是非零,则条件变为真。 | (A || B) 为 true. |
! | 所谓逻辑非运算符。使用反转操作数的逻辑状态。如果条件为真,那么逻辑非运算符为假。 | !(A && B) 为 true. |
位运算符
位运算符适用于位并进行逐位操作。&, |, 和 ^ 的真值表如下:
p | q | p & q | p | q | p ^ q |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
假设,如果A =60;且B =13;现在以二进制格式它们将如下:
A = 0011 1100
B = 0000 1101
-----------------
A&B = 0000 1100
A|B = 0011 1101
A^B = 0011 0001
通过Tcl语言支持位运算符列在下表中。假设变量A=60和变量B=13,则:
运算符 | 描述 | 例子 |
---|---|---|
& | 二进制和操作符副本位的结果,如果它存在于两个操作数。 | (A & B) = 12, 也就是 0000 1100 |
| | 二进制或操作拷贝位,如果它存在一个操作数中。 | (A | B) = 61, 也就是 0011 1101 |
^ | 二进制异或操作符的副本,如果它被设置在一个操作数而不是两个比特。 | (A ^ B) = 49, 也就是 0011 0001 |
<< | 二进制左移位运算符。左边的操作数的值向左移动由右操作数指定的位数。 | A << 2 = 240 也就是 1111 0000 |
>> | 二进制向右移位运算符。左边的操作数的值由右操作数指定的位数向右移动。 | A >> 2 = 15 也就是 0000 1111 |
三元运算符
运算符 | 描述 | 示例 |
---|---|---|
? : | Ternary | 条件为真 ? X : 否则Y |
Tcl运算符优先级
运算符优先级决定术语的表达分组。这会影响一个表达式是如何进行计算。某些运算符的优先级高于其他运算符;例如,乘法运算符的优先级比所述加法运算高。
例如:x =7 + 3* 2;这里,x被赋值13,而不是20,因为运算符 * 优先级高于+,所以它首先被乘以3 * 2,然后加上 7。
这里,具有最高优先级的操作出现在表格上方,那些具有最低出现在底部。在一个表达式中,更高的优先级运算符将首先计算。
分类 | 运算符 | 关联 |
---|---|---|
Unary | + - | Right to left |
Multiplicative | * / % | Left to right |
Additive | + - | Left to right |
Shift | << >> | Left to right |
Relational | < <= > >= | Left to right |
Bitwise AND | & | Left to right |
Bitwise XOR | ^ | Left to right |
Bitwise OR | | | Left to right |
Logical AND | && | Left to right |
Logical OR | || | Left to right |
Ternary | ?: | Right to left |
Tcl算术运算符
下表列出了所有Tcl语言支持的算术运算符。假设变量A=10,变量B=20,则:
运算符 | 描述 | 例子 |
---|---|---|
+ | 两个数相加 | A + B = 30 |
- | 第一个操作数减去第二个操作数 | A - B = -10 |
* | 两个操作数相乘 | A * B = 200 |
/ | 分子(B)除以分母(A) | B / A = 2 |
% | 模运算和整数除法后的余数 | B % A = 0 |
例子
试试下面的例子就明白了所有Tcl语言中可用的算术运算符:
#!/usr/bin/tclsh
set a 21
set b 10
set c [expr $a + $b]
puts "Line 1 - Value of c is $c\n"
set c [expr $a - $b]
puts "Line 2 - Value of c is $c\n"
set c [expr $a * $b]
puts "Line 3 - Value of c is $c\n"
set c [expr $a / $b]
puts "Line 4 - Value of c is $c\n"
set c [expr $a % $b]
puts "Line 5 - Value of c is $c\n"
当编译和执行上面的程序,它会产生以下结果:
Line 1 - Value of c is 31
Line 2 - Value of c is 11
Line 3 - Value of c is 210
Line 4 - Value of c is 2
Line 5 - Value of c is 1
Tcl关系运算符
下表列出了所有Tcl语言支持的关系运算符。假设变量A=10,变量B=20,则:
操作符 | 描述 | 例子 |
---|---|---|
== | 检查两个操作数的值是否相等,如果是的话那么条件为真。 | (A == B) 不为 true. |
!= | 检查两个操作数的值是否相等,如果值不相等,则条件变为真。 | (A != B) 为 true. |
> | 检查左边的操作数的值是否大于右操作数的值,如果是的话那么条件为真。 | (A > B) 不为 true. |
< | 检查左边的操作数的值是否小于右操作数的值,如果是的话那么条件为真。 | (A < B) 为 true. |
>= | 如果左操作数的值大于或等于右操作数的值,如果是的话那么条件检查为真 | (A >= B) 不为 true. |
<= | 检查左边的操作数的值是否小于或等于右操作数的值,如果是的话那么条件为真。 | (A <= B) 为 true. |
例子
试试下面的例子就明白了所有的Tcl语言版本的关系运算符:
#!/usr/bin/tclsh
set a 21
set b 10
if { $a == $b } {
puts "Line 1 - a is equal to b\n"
} else {
puts "Line 1 - a is not equal to b\n"
}
if { $a < $b } {
puts "Line 2 - a is less than b\n"
} else {
puts "Line 2 - a is not less than b\n"
}
if { $a > $b } {
puts "Line 3 - a is greater than b\n"
} else {
puts "Line 3 - a is not greater than b\n"
}
# Lets change value of a and b
set a 5
set b 20
if { $a <= $b } {
puts "Line 4 - a is either less than or equal to b\n"
}
if { $b >= $a } {
puts "Line 5 - b is either greater than or equal to b\n"
}
当编译和执行上面的程序,会产生以下结果:
Line 1 - a is not equal to b
Line 2 - a is not less than b
Line 3 - a is greater than b
Line 4 - a is either less than or equal to -b
Line 5 - b is either greater than or equal to a
Tcl逻辑运算符
下表列出了所有Tcl语言支持的逻辑运算符。假设变量A=1和变量B=0,则:
运算符 | 描述 | 例子 |
---|---|---|
&& | 所谓逻辑与运算符。如果两个操作数都非零,则条件变为真。 | (A && B) 为 false. |
|| | 所谓的逻辑或操作。如果任何两个操作数是非零,则条件变为真。 | (A || B) 为 true. |
! | 所谓逻辑非运算符。使用反转操作数的逻辑状态。如果条件为真,那么逻辑非运算符为假。 | !(A && B) 为 true. |
示例
试试下面的例子就明白了所有Tcl语言提供的逻辑运算符:
#!/usr/bin/tclsh
set a 5
set b 20
if { $a && $b } {
puts "Line 1 - Condition is true\n"
}
if { $a || $b } {
puts "Line 2 - Condition is true\n"
}
# lets change the value of a and b
set a 0
set b 10
if { $a && $b } {
puts "Line 3 - Condition is true\n"
} else {
puts "Line 3 - Condition is not true\n"
}
if { !($a && $b) } {
puts "Line 4 - Condition is true\n"
}
当编译和执行上面的程序,会产生以下结果:
Line 1 - Condition is true
Line 2 - Condition is true
Line 3 - Condition is not true
Line 4 - Condition is true
Tcl位运算符
通过Tcl语言支持位运算符列在下表中。假设变量A=60和变量B=13,则:
运算符 | 描述 | 例子 |
---|---|---|
& | 二进制和操作符副本位的结果,如果它存在于两个操作数。 | (A & B) = 12 也就是 0000 1100 |
| | 二进制或操作拷贝位,如果它存在一个操作数中。 | (A | B) = 61 也就是 0011 1101 |
^ | 二进制异或操作符的副本,如果它被设置在一个操作数而不是两个比特。 | (A ^ B) = 49 也就是 0011 0001 |
<< | 二进制左移位运算符。左边的操作数的值向左移动由右操作数指定的位数。 | A << 2 = 240 也就是 1111 0000 |
>> | 二进制向右移位运算符。左边的操作数的值由右操作数指定的位数向右移动。 | A >> 2 = 15 也就是 0000 1111 |
示例
试试下面的例子就明白了所有Tcl语言中可用的位运算符:
#!/usr/bin/tclsh
set a 60 ;# 60 = 0011 1100 set b 13 ;# 13 = 0000 1101
set c [expr $a & $b] ;# 12 = 0000 1100
puts "Line 1 - Value of c is $c\n"
set c [expr $a | $b;] ;# 61 = 0011 1101
puts "Line 2 - Value of c is $c\n"
set c [expr $a ^ $b;] ;# 49 = 0011 0001
puts "Line 3 - Value of c is $c\n"
set c [expr $a << 2] ;# 240 = 1111 0000
puts "Line 4 - Value of c is $c\n"
set c [expr $a >> 2] ;# 15 = 0000 1111
puts "Line 5 - Value of c is $c\n"
当编译和执行上面的程序,会产生以下结果:
Line 1 - Value of c is 12
Line 2 - Value of c is 61
Line 3 - Value of c is 49
Line 4 - Value of c is 240
Line 5 - Value of c is 15
Tcl三元运算符
在Tcl中一个重要的运算符是三元运算符。
运算符 | 描述 | 示例 |
---|---|---|
? : | 条件表达式 | 条件为真 ? 那么值为 X : 否则值为 Y |
示例
试试下面的例子来理解Tcl语言的三元运算符:
#!/usr/bin/tclsh
set a 10;
set b [expr $a == 1 ? 20: 30]
puts "Value of b is $b\n"
set b [expr $a == 10 ? 20: 30]
puts "Value of b is $b\n"
当编译和执行上面的程序,会产生以下结果:
Value of b is 30
Value of b is 20
Tcl运算符优先级
运算符优先级决定术语的表达分组。这会影响一个表达式是如何进行计算。某些运算符的优先级高于其他运算符;例如,乘法运算符的优先级比所述加法运算高。
例如x= 7+ 3 *2;这里,x被赋值13,而不是20,因为运算符 * 优先级高于+,所以它首先被乘以 3 * 2,然后加上7。
这里,具有最高优先级的操作出现在表格上方,那些具有最低出现在底部。在一个表达式,更高的优先级运算符将首先计算。
分类 | 操作符 | 关联 |
---|---|---|
Unary | + - | Right to left |
Multiplicative | * / % | Left to right |
Additive | + - | Left to right |
Shift | << >> | Left to right |
Relational | < <= > >= | Left to right |
Equality | == != | Left to right |
Bitwise AND | & | Left to right |
Bitwise XOR | ^ | Left to right |
Bitwise OR | | | Left to right |
Logical AND | && | Left to right |
Logical OR | || | Left to right |
Ternary | ?: | Right to left |
示例
试试下面的例子来理解Tcl语言可供选择的运算符优先级:
#!/usr/bin/tclsh
set a 20
set b 10
set c 15
set d 5
set e [expr [expr $a + $b] * $c / $d ] ;# ( 30 * 15 ) / 5
puts "Value of (a + b) * c / d is : $e\n"
set e [expr [expr [expr $a + $b] * $c] / $d] ;# (30 * 15 ) / 5]
puts "Value of ((a + b) * c) / d is : $e\n"
set e [expr [expr $a + $b] * [expr $c / $d] ] ;# (30) * (15/5)
puts "Value of (a + b) * (c / d) is : $e\n"
set e [expr $a + [expr $b * $c ] / $d ] ;# 20 + (150/5)
puts "Value of a + (b * c) / d is : $e\n"
当编译和执行上面的程序,会产生以下结果:
Value of (a + b) * c / d is : 90
Value of ((a + b) * c) / d is : 90
Value of (a + b) * (c / d) is : 90
Value of a + (b * c) / d is : 50
文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。
原文链接:reborn.blog.csdn.net/article/details/85158292
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)