活动服务器页面/表达式
在本节中,您将学习如何在活动服务器页面中构建表达式。在学习本节之后,您将学习如何构建表达式,以及如何在组合中组合变量和字符串文字来操作数据。
表达式是由文字和变量组成的,这些文字和变量使用运算符以结构化的格式组织在一起。表达式最好的例子是数学表达式,例如x + 3。
表达式由一系列数学运算符、比较运算符、按位运算符和逻辑运算符以及文字值和 ASP 变量组成,这些运算符、文字值和变量被放在一起供 ASP 解释器求值。表达式求值后,可以将其赋值给变量,用作 ASP 过程的参数或输出在 ASP 页面上。
在 ASP 中,您可以执行的最基本语句之一是赋值。这实际上是求值一个表达式并将结果放到一个变量中。等号 (=) 将获取结果的变量(位于左侧)与构建结果的表达式(位于右侧)隔开。
<%
Dim nX, dX, sName, bIsAdmin
' assign literal values
nX = 13
dX = 7645.34
sName = "Barney Google"
bIsAdmin = True
' or you can assign complex expressions like
Dim dDateTime
dDateTime = Now()
nX = 13 + 23 - 10
dx = (5 * nX) / 2.0
sName = "Barney is " & CStr(nX)
%>
不要过分担心本例中的一些更复杂的表达式。本章后面会解释所有这些内容。您应该注意,表达式左侧始终是变量。您只能在等号左侧放置一个 ASP 变量。
表达式求值的方式取决于运算符优先级。优先级是分配给运算符的一种重要性。优先级最高的运算符首先求值,优先级最低的运算符最后求值。当存在两个优先级相同的运算符时,运算符从左到右求值。
以以下表达式为例
dX = 6 - 3 * 4 + 2
在本例中,您将看到我们有三个不同的运算符。"+" 和 "-" 运算符具有相同的优先级,而乘法运算符 (*) 具有更高的优先级。在这种情况下,乘法首先发生,将表达式简化为
dX = 6 - 12 + 2
现在有两个具有相同优先级的表达式。在这种情况下,我们首先对最左侧的表达式求值。经过两次进一步简化后,我们得到最终结果
dX = -6 + 2
dx = -4
您还应注意,如果我们从另一个方向对表达式求值,我们将得到完全不同的结果。这种求值顺序遵循与数学中使用的相同方法(如果您记得您的基本代数)。
如果您想覆盖表达式求值(优先级)的默认顺序,可以在括号中对应该首先求值的表达式进行分组。您可以将其视为嵌入在另一个表达式中的表达式或“子表达式”。
如果您记得上一节中的示例,我们可以对其进行修改以更改求值顺序,如下所示
dX = (6 - 3) * 4 + 2
就像在代数中一样,我们知道我们必须首先对这些子表达式求值。因此,简化这种表达式的第一步是对子表达式求值
dX = 3 * 4 + 2
最终简化将得出结果为 14,这与我们之前得到的完全不同。请注意您对表达式进行分组的方式。这会导致很多问题,并增加代码的复杂性。如果您想使代码更简单,可以始终创建新的变量来存储子表达式的结果。
' Using variables to evaluate sub-expressions
Dim dX, dY
dY = 6 - 3
dX = dY * 4 + 2
下表列出了所有二元数学运算符。它们是“二元”的,因为它们需要两个参数。第一个参数在左侧,第二个参数在右侧。因此,表达式“5 + 6”中的运算符“+”具有二元参数“5”和“6”。
符号 | 运算符 | 示例 |
---|---|---|
+ | 加法 | nX + 5 |
- | 减法 | nX - 5 |
* | 乘法 | dX * 1.5 |
/ | 除法 | dX / -1.5 |
\ | 整数除法 | dX \ 6 |
% | 模(余数) | nX % 6 |
下表列出了所有一元数学运算符。一元运算符只有一个参数要作用于。
符号 | 运算符 | 示例 |
---|---|---|
- | 否定 | -nX |
当然,您可以在一个表达式中组合二元运算符和一元运算符。一个二元运算的结果可以作为一元运算的参数。
' combining the binary "+" with the unary "-"
dX = -(nX + nY)
还有许多高级数学函数可用于执行复杂的算术运算,我们将在后面讨论。本章将不介绍这些内容。
在处理字符串时,活动服务器页面提供了大量用于操作字符串的函数。但由于我们只讨论表达式中可能使用的运算符,因此我们在这里只处理一个字符串运算符:字符串连接运算符。
字符串连接意味着您要将一个字符串附加到另一个字符串。此操作是二元操作,这意味着它需要两个参数:左侧是您要附加的字符串,右侧是要附加的字符串。
Dim sFirst, sLast, sFullName
sFirst = "Bill"
sLast = "Gates"
sFullName = sFirst & " " & sLast
如上面的示例所示,我们使用字符串连接运算符将三个字符串值连接在一起:“Bill”、“ ”和“Gates”。两个字符串存储在变量中,而空格字符只是一个字符串文字。
您可以使用字符串连接运算符将任意多个变量连接在一起。事实证明,活动服务器页面下的字符串连接效率非常低。因此,如果您的页面运行缓慢,并且您有很多字符串连接,您应该寻找消除它们的方法。
顾名思义,比较运算符用于比较两个不同的表达式并返回“真”或“假”的值。在大多数情况下,被比较的两个表达式将求值为数字,但也可以比较字符串值、日期和布尔值。
下表列出了二元比较运算符。这些运算符需要两个表达式参数:一个在运算符左侧,一个在右侧。就像数学表达式一样,您可以将两个或多个这样的表达式组合在一起。在下一节中,我们将解释如何使用逻辑运算符将这些表达式组合在一起。
符号 | 运算符 | 示例 |
---|---|---|
= | 相等 | nX = 5 |
<> | 不相等(不等于) | nX <> nY |
< | 小于 | nX < 5 |
> | 大于 | nX > -5 |
<= | 小于或等于 | nX <= 5 + nY |
>= | 大于或等于 | nX >= dY * 5.0 - 2 |
这些运算符最常用于If Then语句中,该语句将根据表达式的布尔结果采取操作。除非您已经将布尔值存储在 ASP 变量中,否则您需要编写以下表达式
If nX >= 60 Then Response.Write "You Passed!"
If nX < 60 Then Response.Write "You Failed"
当然,您的表达式可以像您想要的那样复杂,只要它求值为布尔值即可。
数学表达式用于操作数字,而逻辑运算符用于处理两个布尔值“真”和“假”。这些运算符始终用于组合两个导致布尔值的表达式。
符号 | 意义 | 示例 |
---|---|---|
并且 | 只有当两个参数都为真时才为真,否则为假 | nX > 5 And nX < 10 |
或者 | 如果任一参数为真,则为真;仅当两个参数均为假时,才为假。 | nX < 5 或 nX > 10 |
除了这些二元运算符之外,还有一个一元运算符。
符号 | 意义 | 示例 |
---|---|---|
非 | 否定,真变假,假变真 | 非 (nX > 5) |
否定运算符基本上会给你表达式的相反值。因此,如果表达式计算结果为“真”,并且你对其执行**非**运算,则它将变为“假”。相反,当应用**非**时,“假”将变为“真”。
因此,使用这些逻辑运算符,我们可以将许多比较表达式组合在一起,以创建非常复杂的表达式,如下所示
' example of a complex expression with four comparisons)
If (nX = 2) Or (nX < 10 And nX < 20) And Not (nY * 5.0 - 2 <= 17.0) Then
Response.Write "Yes"
End If
第一个比较 (nX = 2) 看起来就像一个赋值。你永远不能在这样的表达式中放入赋值。赋值只发生在表达式的开头,其中第一个符号是 ASP 变量,后面跟着赋值 (=) 运算符。
你会注意到我们使用圆括号来对表达式进行分组。即使在某些情况下不需要圆括号,但有时当你将它们放在那里时,会使你的表达式更容易阅读。
对于高级编程,Active Server Pages 有操作单个“位”的运算符。“位”是二进制数系统中使用的数字,由“二进制数字”的缩写而来。它只能具有两种不同的值之一:“0”和“1”。
在计算机的早期,程序员在存储方面受到严格限制,必须充分利用可用的存储空间。他们实现这一点的一种方法是将多个变量组合成一个“字节”。这已经延续到现代计算机系统中,这就是我们为什么需要按位运算符的原因。
在计算机术语中,我们谈论的是“字节”。一个字节由 8 个“位”组成,因此可以有 2 ^ (乘方) 8 或 256 种可能的值。一个整数由两个字节组成,因此它可以有 256 ^ 2 或 65536 种可能的值。
The 8 bits from a byte and their integer equivalents +-------------------------------------------------------+ | Bit7 | Bit6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1 | Bit0 | +------+------+------+------+------+------+------+------+ | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | +-------------------------------------------------------+
对于所有已设置的位(等于 1),你需要将它们的整数等效值加起来以确定结果的字节值。因此,如果位 6、4、1 和 0 已设置,则等效的字节值将为:64 + 16 + 2 + 1 = 83。
反过来,我们可以将一个整数转换为二进制。我们只需取整数的值并减去我们可以减去的最大二进制值,并记下相应的位。我们继续执行此减去二进制值的运算,直到我们得到结果位串。
' convert integer value (221) to binary
221 - 128 = 93 (binary 0x10000000)
93 - 64 = 29 (binary 0x11000000)
29 - 16 = 13 (binary 0x11010000)
13 - 8 = 5 (binary 0x11011000)
5 - 4 = 1 (binary 0x11011100)
1 - 1 = 0 (binary 0x11011101)
在使用按位运算符时,有时我们必须像这样在二进制和整数之间进行转换,反之亦然。
在 Active Server Pages 中,按位运算符仅用于数字表达式以操作单个位。数字表达式可以计算结果为整数、长整数、单精度或双精度数字。在计算按位运算后,结果值将与原始参数兼容。
以下按位运算符需要两个参数:一个在运算符的左侧,一个在右侧。
符号 | 意义 | 示例 |
---|---|---|
& | 按位与 | nX & 5 |
| | 按位或 | nX | 48 |
^ | 按位异或 | nX ^ 48 |
<< | 左移位 | nX << 2 |
>> | 右移位 | nX >> 1 |
以下运算符是“一元”运算符,这意味着它们只需要一个参数。单个表达式参数必须位于此运算符的右侧。
符号 | 意义 | 示例 |
---|---|---|
~ | 按位取反 | ~ nX |
真值表按位显示二元运算符的结果。你可以认为参数中的每个位都被逐个评估。位根据它们在字节中的位置进行匹配。因此,对于 16 位整数,每个位都将被单独操作,结果位将按相同顺序串联起来以生成结果数字。
在查看这些表格时,请在心中思考“当执行按位与 (&) 时,参数 1 中的位 0 和参数 2 中的位 0 被与在一起,结果为 X。下一个参数 1 中的位 1 和参数 2 中的位 1 被与在一起,结果为 Y”。并继续对参数中的所有位执行此操作。
与 (&) 运算符真值表 | ||
---|---|---|
参数 #1 | 参数 #2 | 结果 |
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
或 (|) 运算符真值表 | ||
---|---|---|
参数 #1 | 参数 #2 | 结果 |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
异或 (^) 运算符真值表 | ||
---|---|---|
参数 #1 | 参数 #2 | 结果 |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
取反 (~) 运算符真值表 | ||
---|---|---|
参数 #1 | 结果 | |
1 | 0 | |
0 | 1 |
ASP 有一些内置函数可以操作日期时间值。虽然严格来说不是运算符,但我们在此处为了完整性而提到它们,因为日期时间是一种有效的数据类型,而且经常需要计算日期和时间。
日期和时间函数 | |
---|---|
函数 | 目的 |
日期 | 获取根据本地计算机的当前日期 dNow = 日期() |
时间() | 获取根据本地计算机的当前时间,作为日期时间值 dTime = 时间() |
现在() | 获取根据本地计算机的当前日期和时间 dNow = 现在() |
DateAdd(间隔, 数字, 日期 | 将特定数字的间隔添加到提供的日期 DateAdd("d", 3, 现在()) |
DateDiff(间隔, 日期 1, 日期 2) | 计算日期 1和日期 2之间间隔的差异数量 dDaysLeft = DateDiff("d", 现在(), dBirthDay) |
DatePart(间隔, 数字, 日期) | 检索日期的特定部分,例如小时或月份 DatePart("yyyy", 现在()) |
DateSerial(年, 月, 日) | 从年、月和日组件构造一个日期时间值 dBirthday = DateSerial(1998, 12, 23) |
TimeSerial(小时, 分钟, 秒) | 构造一个反映时间组件的日期时间值。 dNapTime = TimeSerial(14, 0, 0) |
DateValue(日期时间) | 将日期字符串转换为日期时间值。 DateValue("12/23/1998") |
TimeValue() | 将时间字符串转换为有效的日期时间对象。 dTime = TimeValue("10:51:43 PM) |
日(日期) | 为特定日期时间值检索月的第几天 (0-31) 日(现在()) |
月(日期) | 为特定日期时间值检索月份 (1-12) nMonth = 月(dBirthDay) |
年(日期) | 为特定日期时间值检索年份。 年(现在()) |
小时(日期时间) | 检索日期时间值的小时(以 24 小时制军用时间格式 [0-23] 表示) 小时(现在()) |
分钟(日期时间) | 为特定日期时间值检索分钟(0-59)组件 nMinute = 分钟(dBirthDay) |
秒(日期时间) | 为特定日期时间值检索秒(0-59)。 秒(现在()) |
FormatDateTime(日期时间) | 以标准化格式格式化指定的日期时间值 FormatDateTime(现在(), vbLongDate) |
有关这些函数的可选参数和有效间隔类型的信息将在后面的章节中讨论。请注意,没有一个数学运算符适用于日期时间值。你必须使用上述各种转换和计算函数来操作日期。
如果你在 ASP 中有一行非常长的行,你想将其拆分为两行,可以使用续行运算符。这是一个下划线 (_),它放在行的末尾,告诉 ASP 解释器语句或表达式在下一行继续。
if ((bDaysLeft < DateDiff("d", Now(), dBirthDay)) Or _ (bDaysLeft > DateDiff("d", Now(), dChristMas)) Then Response.Write "Hooray!" End If
在上例中,我们使用续行来继续一个布尔表达式。你可以使用它来继续任何类型的表达式或语句。为了可读性,将长行拆分是有意义的。只是要注意你如何拆分行,以便不会使行更难阅读。
ASP 中有八种不同的运算符类型
- 赋值运算符
- 数学运算符
- 字符串运算符
- 比较运算符
- 逻辑运算符
- 按位运算符
- 分组运算符
- 续行运算符
除赋值运算符外,所有运算符都可以用于构建表达式。运算符根据优先级和分组运算符进行评估。如果两个运算符具有相同的优先级,则从左到右评估运算符。
所有日期和时间值都必须使用函数进行操作。数学运算符在日期时间值上无效。
- 赋值运算符的左侧必须是什么?
- 赋值运算符的右侧必须是什么?
- 八种主要的运算符类型是什么?
- 运算符优先级是什么意思?
- 哪个运算符用于对表达式进行分组?
- 日期时间值如何在表达式中使用?
- 编写条件表达式以测试变量 (nSpeed) 是否小于或等于速度限制 (nSpeedLimit)
- 编写表达式以将温度从华氏度转换为摄氏度,反之亦然
- 创建一个函数,该函数计算从现在到圣诞节的天数。
- 创建一个页面,该页面输入用户的生日,然后计算该人的年龄。