初识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

 

 

你可能感兴趣的:(#,区)