活動伺服器頁面/表示式
在本節中,您將學習如何在活動伺服器頁面中構建表示式。在學習本節之後,您將學習如何構建表示式,以及如何在組合中組合變數和字串文字來操作資料。
表示式是由文字和變數組成的,這些文字和變數使用運算子以結構化的格式組織在一起。表示式最好的例子是數學表示式,例如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)
- 編寫表示式以將溫度從華氏度轉換為攝氏度,反之亦然
- 建立一個函式,該函式計算從現在到聖誕節的天數。
- 建立一個頁面,該頁面輸入使用者的生日,然後計算該人的年齡。