所谓表达式(Expression)是变量、操作符、常量、字段名、控件以及属性的组合,每一个表达式都有一个返回值。表达式和常数一样具有数据类型的数据(求值之后),所以表达式各项必须具有相同的类型。
算术表达式(expN)由数值类型字段、内存变量和常量等组成,互相之间由数值表达式操作符连接。其算术运算符和表达式见表4-1。
表4-1 算术运算符和表达式
运 算 符 |
说 明 |
例 子 |
结 果 |
+ |
加法运算 |
23+333 |
356 |
- |
减法运算 |
12-1 |
11 |
* |
乘法运算 |
2*13 |
26 |
/ |
除法运算 |
13/2 |
6.50 |
**或^ |
乘方运算 |
2**3或2^3(2的3次方) |
8.00 |
% |
模运算(求余数) |
11%4 |
3.00 |
日期时间表达式(expD)由日期运算符、日期时间型常量、时间日期型内存变量和数组、返回时间日期型数据的函数组成,返回日期时间型常量。
日期时间表达式要求两个操作数,第一个为日期型或日期时间型,第二个为数值型,由日期运算操作符连接。基于优先级从高到低的日期操作符如下。
(1)():子表达式分界符。
(2)+:加(秒或天数)。如果第一个操作数为日期时间型,则第二个操作数(数值型)表示秒数,结果为增加秒数之后的日期时间型数据。如果第一个操作数为日期型,则第二个操作数(数值型)表示天数,结果为增加天数之后的日期型数据。
例如,{^2007/12/01 10:38:20AM}+30的结果为{^2007/12/01 10:38:50AM};而{^2007/12/01}+30的结果为{^2007/12/31}。
(3)-:减(秒或天数),其操作同上。
字符型表达式(expC)由字符型字段、内存变量、常量等组成,由字符操作符连接。字符操作符基于优先级从高到低的次序如下所示。
(1)():子表达式分界符。
(2)+:用于连接两个字符表达式,结果为将两个字符型数据首尾相接的字符型数据。
(3)-:用于连接两个字符表达式,同时删除第一个字符串的尾部空格。
(4)$:用于两个字符表达式之间的比较,判断第一个字符数据是否完全包含在第二个字符型数据中。其用法为<expC1> $ <expC2>。如果<expC2>中包含有<expC1>,则表达式值为真(.T),否则为假(.F.)。
可以使用字符运算符+、-与$进行连接和比较,见表4-2。
表4-2 字符运算符和表达式
运算符 |
说 明 |
例 子 |
结 果 |
+ |
字符串连接 |
"xyz "+"abcd" |
"xyz abcd" |
- |
将前一个字符串的空格删除后再进行字符串连接 |
"xyz "-"abcd" |
"xyzabcd" |
$ |
如果$前面的字符串包含在$后面的字符串中,则结果为.T.,否则为.F. |
"abc"$"abcdef" "abcdef"$"abcdef" "ijk"$"abcdedg" |
.T. .T. .F. |
关系表达式(expR)由关系运算符和字符表达式、算术表达式和时间日期表达式组成。返回值为逻辑型常量。关系表达式用于比较两个操作数的大小,其两个操作数必须为同一数据类型,运算结果为逻辑型。其关系运算符和表达式见表4-3。
表4-3 关系运算符和表达式
运 算 符 |
说 明 |
例 子 |
结 果 |
< |
小于 |
? 1<40 |
.T. |
> |
大于 |
? 4>12 |
.F. |
= |
等于 |
? 3=8 |
.F. |
<>、#、! |
不等于 |
? .T. <> .F. |
.T. |
<= |
小于等于 |
? '帮助'<='Help' |
.F. |
>= |
大于等于 |
? 11>=11 |
.T. |
== |
字符串比较 |
? 'ABC'== 'abc' |
.F. |
注意:(1)SET EXACT ON|OFF是FoxPro状态设置命令,它规定了两个不等长的字符串的比较规则。当程序设定为SET EXACE ON时,如果字符串的尾部是空格,则忽略这些空格,在长度较短的字符串尾部加上空格直至与较长的字符串的长度相等,然后再进行比较;当为SET EXACT OFF时,只是逐个字符地比较,直到等号(=)右边字符串的最后一个字符比较完毕为止。(2)在对日期或日期时间类型的数据进行运算时,必须使用严格日期格式{^yyyy/mm/dd/}或{^yyyy-mm-dd}。
逻辑表达式(expL)由逻辑运算符和逻辑型常量、逻辑型内存变量、逻辑型数组、返回逻辑型数据的函数和关系表达式组成。返回值为逻辑型常量。
逻辑型操作符按优先级从高到低的次序如下。
(1)():子表达式分界符。
(2)NOT(或)!(非):单目运算,结果将操作数取相反值。
(3)AND(与):只有两个操作数的值同时为.T.,结果才为.T.,其他情况下结果均为.F.。
(4)OR(或):两个操作数的值只要有一个为.T.,结果就为.T.;两个操作数均为.F.,结果才为.F.。其逻辑运算符和表达式见表4-4。
表4-4 逻辑运算符和表达式
运 算 符 |
说 明 |
例 子 |
结 果 |
AND |
与运算 |
.F. AND .T. |
.F. |
OR |
或运算 |
.F. OR .T. |
.T. |
NOT或! |
非运算 |
(1)NOT.T. (2)!.F. |
(1).F. (2).T. |
名称表达式(expN)是用户给命令或函数定义的一个名字,用于保存内存变量和数组元素中的命令和函数名,用户可以通过间接引用或宏替换两种操作方法完成。名称表达式是由圆括号括起来的一个字符表达式,可以用来替换命令和函数中的名称,如字段名、变量名、窗口名、菜单名、文件名和对象名等。
例如,
store "xsda.dbf" to name
use(name) &&间接引用
LIST
store "? 5^2" to expR1
? &expR1 &&宏替换
宏替换与名称表达式具有相似的作用,可使用宏替换的方法用内存变量替换名称。使用宏替换时,将连字符(&)放在变量前。格式为:
&<字符内存变量>
宏替换与名称表达式的区别如下:
(1)含有名称表达式的命令或函数的运行速度比含有宏替换的运行速度要快。
(2)宏替换可以替换整个命令,而名称表达式不行。
(3)宏替换可以用以构成表达式,而名称表达式不能作为其他表达式的组成部分。
(4)在某些命令和函数中不能使用名称表达式。
将自然语言描述的问题用表达式描述,需要很多的数理逻辑知识,如果不能正确地书写表达式,就不可能得到正确的结果。为了提高书写表达式的速度,系统提供了一个工具,称之为表达式生成器。启动表达式生成器是通过GETEXPR命令来完成的。
例如,将12*8+7+ABS(-35)表达式赋给内存变量T,在命令窗口中输入:
GETEXPR "数值表达式" TO T TYPE "N"
此时系统弹出如图4-2所示的“表达式生成器”对话框。在“表达式”文本框中输入“12*8+7+ABS(-35)”之后,单击“确定”按钮,就已将该表达式存到T变量中。在命令窗口中输入“? T”后,得到“12*8+7+ABS(-35)”表达式。
图4-2 “表达式生成器”对话框