6.表达式
在Visual FoxPro系统中,表达式是由常量、变量、函数及其他数据容器单独或与运算符组成的有意义的运算式子。运算符是对数据对象进行加工处理的符号,根据其处理数据对象的数据类型,运算符分为算术(数值)运算符、字符运算符、日期时间运算符、逻辑运算符和关系运算符五类,相应的,表达式也分为算术表达式、字符表达式、日期时间表达式、逻辑表达式和关系表达式五类。
在一个表达式中可能包含多个由不同运算符连接起来的、具有不同数据类型的数据对象,但任何运算符两侧的数据对象必须具有相同数据类型,否则运算将会出错;由于表达式中有多种运算,不同的运算顺序可能得出不同结果,甚至出现运算错误,因此当表达式中包含多种运算时,必须按一定顺序施行相应运算,才能保证运算的合理性和结果的正确性、惟一性。用户也可以通过给表达式加圆括号的方式,改变其默认运算顺序。在Visual FoxPro 系统中,各类运算的优先顺序如下:
圆括号>算术和日期运算>字符串运算>关系运算>逻辑运算同一类运算符也有一定的运算优先顺序,这在各类表达式中分别介绍。如果多个同一级别的运算,则按在表达式中出现的先后顺序进行运算。
(1)算术表达式
算术表达式又称数值表达式,其运算对象和运算结果均为数值型数据。数值运算符的功能及运算优先顺序,如表所示。表中运算符按运算优先级别从高到低顺序排列。
表
算术运算符 |
运算符 |
功能 |
表达式举例 |
运算结果 |
优先级别 |
( ) |
圆括号 |
(2-5)*(3+2) |
-15 |
最高 |
- |
取相反数 |
-(3-8) |
5 |
|
**、^ |
乘幂 |
2**5、3^2 |
32、9 |
|
*、/ |
乘、除 |
2*10、25/5 |
20、5 |
|
% |
取余数 |
20%5 |
0 |
|
+、- |
加、减 |
36+19、29-47 |
55、-18 |
最低 |
(2).字符表达式
字符表达式是由字符运算符将字符型数据对象连接起来进行运算的式子。字符运算的对象是字符型数据对象,运算结果是字符常量或逻辑常量。
"+"与 "-"都是字符连接运算符,都将两字符串顺序连接,但“+”是直接连接,“-”则将串1尾部所有空格移到串2尾部后再连接;“$”运算实质上是比较两个串的包含关系,因此有些书籍中将其归于关系运算,其作用是比较、判断串1 是否为串2的子串,如果串1是串2的子串,运算结果为“真”,否则为“假”。
所谓子串,如果串1中所有字符均包含在串2中、且与串1中排列方式与顺序完全一致,则称串1为串2的子串。
表
字符运算符 |
运算符 |
功能 |
表达式举例 |
运算结果 |
+ |
串1+串2:两串顺序相连接 |
’12 ‘+’56’ |
’12 56’ |
- |
串1-串2:串1尾空格移到串2尾后再顺序相连接 |
’12 ‘-‘56’ |
‘1256 ‘ |
$ |
串1$串2:串1是否为串2子串 |
‘1234’$ ‘12345’ ‘ 1234’$‘34512’ |
.T. .F. |
两个连接运算的优先级别相同,但高于$的比较运算。
例: LEN1=”Visual FoxPro6.0 ” LEN2=”数据库教程” ?
LEN1+LEN2 &&结果为:Visual FoxPro6.0 数据库教程 ?
LEN1-LEN2 &&结果为:Visual FoxPro6.0数据库教程
? len(LEN1-LEN2) && 结果为:28
(3).日期表达式
由日期运算符将一个日期型或日期时间型数据与一个数值型数据连接而成的运算式称为日期表达式。日期运算符分为“+”和“-”两种,其作用分别是在日期数据上增加或减少一个天数,在日期时间数据上增加或减少一个秒数。两个运算的优先级别相同。
日期时间操作符有:
+:添加一个天数或秒数
-:减少一个天数或秒数
例如:
? {^2003-09-04}+10 &&结果为:09/14/03
? {^2003-11-30}-15 &&结果为:11/15/03
? {^2003-08-04 10:10a}+10 &&结果为:08/04/03 10:10:10 AM
? {^2003-08-04 10:35p}-10 &&结果为: 08/04/03 10:34:50 PM
注意:日期和日期、日期时间和日期时间只能相减,不能相加。(p64)
(4).关系表达式
由关系运算符连接两个同类数据对象进行关系比较的运算式称为关系表达式。关系表达式的值为逻辑值,关系表达式成立则其值为“真”,否则为“假”。
表
关系运算符 |
运算符 |
功能 |
表达式举例 |
结果 |
< |
小于 |
15<4*6 |
.T. |
> |
大于 |
‘A’ > ‘1’ |
.T. |
= |
等于 |
2+4 = 3*5 |
.F. |
<>、#、!= |
不等于 |
5 <> -10 |
.T. |
关系运算符的优先级别相同。关系表达式运算时,就是比较同类两数据对象的“大小”,对于不同类型的数据,其“大小”或者是值的大小,或者是先后顺序。日期或日期时间数据以日期或时间的先后顺序为序。在Visual FoxPro系统中,字符型数据的比较相对复杂,默认规则为:
1)单个字符
单个字符的比较是以字符ASCII码的大小,作为字符的“大小”,也就是先后顺序;
2)汉字
系统默认按汉字的拼音排列汉字的顺序,也就是以汉字的拼音顺序比较“大小”
3)字符串
两个字符串进行比较的基本原则是从左到右逐个字符进行比较。
当两串做“==”和“=”比较时,运算结果与SET EXACT ON/OFF的设置有关。默认是OFF状态。
● 精确比较:用运算符==进行两串的精确比较时,只有当两串长度相同,字符相同,排列一致时才成立;(EXACT ON或OFF)
● 相等比较:用运算符=进行两串比较,当处于OFF状态时,只要右边的字符串与左边字符串的前部分内容相匹配,结果就为真.T.。例如:“abc”=“abd”为假, “abc”=“abcde”为假,“abcde”=“abc”为真;当处于ON状态时,先在较短字符串的尾部加上若干个空格,使两个字符串长度相等,然后再进行比较。例如: “abc”=“abcde”为假,“ab”=“ab ”为真;
● 大小比较:用运算符< 或 >进行两串比较时,比较到第1个不相同字符为止,否则,长度较长的串较“大”;
● 其他比较:除上述运算符之外的其他运算符<>、<=和>=的比较,均可看作是两个运算符以逻辑“或”的关系构成的复合运算;