第3章 變數、資料型別與運算子 3-1 變數與資料型別的基礎 3-2 變數的命名與宣告 3-3 資料型別 3-4 運算式與運算子 3-5 資料型別的轉換
3-1 變數與資料型別的基礎-說明 電腦程式在執行時常常需要記住一些資料,所以在程式語言會提供一個地方,用來記得執行時的一些資料,這個地方就是「變數」(Variables)。 例如:去商店買東西時,為了比較價格,我們會記下商品價格,同樣的,程式是使用變數儲存這些執行時需記住的資料,也就是將這些值儲存至變數,當變數擁有儲存值後,就可以在需要的地方取出變數值,例如:執行數學和比較運算等。
3-1 變數與資料型別的基礎- 變數是儲存在哪裡 問題是,這些需記住的資料是儲存在哪裡,答案就是電腦的「記憶體」(Memory),變數是一個名稱,用來代表電腦記憶體空間的一個位址,如下圖所示:
3-1 變數與資料型別的基礎- 變數的基本操作 變數只有兩種操作,如下所示: 在變數存入新值:指定變數成為一個全新值,我們並不能如同盒子一般,只取出部分金額。因為變數只能指定成一個新值,如果需要減掉一個值,其操作是先讀取變數值,在減掉後,再將變數指定成最後運算結果的新值。 讀取變數值:取得目前變數的值,而且,讀取變數值並不會更改變數目前儲存的值。
3-1 變數與資料型別的基礎- 變數與資料型別(圖例) 在程式語言的「變數」(Variables)可以視為是一個擁有名稱的盒子,能夠暫時儲存程式執行時所需的資料,如下圖所示:
3-1 變數與資料型別的基礎- 變數與資料型別(圖例說明) 盒子名稱分別是變數名稱name和height,在盒子中儲存的資料"VB程式"和100,稱為「字面值」(Literals)或「常數值」(Constants),也就是數值、字元或字串等數值,如下所示: 100 15.3 "Visual Basic程式" 盒子形狀和尺寸決定儲存資料的種類,對比程式語言來說,形狀和尺寸就是變數的資料型別(Data Types)。
3-2 變數的命名與宣告 3-2-1 Visual Basic的命名規則 3-2-2 變數的宣告 3-2-3 指定敘述 ViLLE – 1.1 指定敘述與輸出變數值 3-2-4 Option指令敘述 3-2-5 符號常數的使用 3-2-6 列舉資料型別Enumeration
3-2 變數的命名與宣告 對於高階程式語言來說,程式是由資料(Data)和指令(Instructions)組成,如下所示: 資料部分:變數(Variables)和資料型別(Data Types)。 指令部分:運算子、第5和6章的流程控制(Control Structures)和第7章的副程序(Subroutines)。 在程式碼除了程式語言的「關鍵字」(Keywords,或稱保留字)外,大部分都屬於程式設計者自訂的元素名稱,稱為「識別字」(Identifier),例如:變數、程序、函數和物件名稱等。
3-2-1 Visual Basic的命名規則- 命名規則 名稱必須是英文字母或底線"_"開頭,如果以底線開頭,至少需要一個其他英文字母或數字。 名稱長度不可超過16383個字元,不區分英文字母大小寫,COUNT和count代表相同的名稱。 名稱中間不能有句點"."、運算子(例如:+-*/^等)或空白,只能是英文字母、數字和底線。 在宣告的有效範圍內必須唯一,有效範圍請參閱第7章的程序和函數。
3-2-1 Visual Basic的命名規則- 命名範例 def, no_123, size1, _123, _abc, Car, count, height, s1, s2 一些不合法名稱的範例和說明,如下表所示: 不合法名稱 說明 1、2、12、250、123abc 使用數字開頭 _ 只有底線 Long.name、hello World 在識別字中擁有「.」和空白字元 Dim、As、If、Then 使用Visual Basic語言關鍵字
3-2-1 Visual Basic的命名規則- 匈牙利命名法 匈牙利命名法是將變數的前3個字元視為資料型別,依不同資料型別加上字首字串,如下表所示:
3-2-1 Visual Basic的命名規則- CamelCasing命名法
3-2-2 變數的宣告-說明 程式語言的變數是儲存程式執行中的一些暫存資料,程式設計者只需使用變數名稱就可以存取記憶體位址的資料。 簡單的說,它就是使用有意義的名稱來代表數字的位址。
3-2-2 變數的宣告-屬性 程式的變數擁有一些屬性,可以用來描述變數的組成元素,如下表所示: 屬性名稱 說明 名稱(Name) 變數名稱是一個標籤,可以在程式中識別出它是一個變數 位址(Address) 在記憶體中儲存此變數的記憶體位址 尺寸(Size) 變數佔用的記憶體尺寸,以位元組為單位 型別(Type) 變數儲存資料的資料型別 值(Value) 變數值,也就是在記憶體位址中儲存的資料 壽命(Lifetime) 在執行程式時,變數存在的期間,有些變數是在整個執行過程中都存在;有些變數是在執行期間才自動或由程式碼建立 範圍(Scope) 在程式碼的哪些程式敘述可以存取此變數
3-2-2 變數的宣告-變數的宣告 Visual Basic變數使用Dim關鍵字宣告,如下所示: Dim length 程式碼宣告變數length,因為沒有指定資料型別,預設資料型別是Object。如果有指定資料型別,需要使用As關鍵字宣告資料型別,如下所示: Dim height, width As Integer 程式碼宣告2個整數資料型別的變數height和width。如果在同一列的2個變數分別屬於不同資料型別,可以分別宣告其資料型別,如下所示: Dim author As String, price As Integer
3-2-2 變數的宣告-變數的初值 如果需要,在宣告變數的同時可以指定初值,如下所示: Dim author As String, price = 500 Dim title As String = "Visual Basic程式設計" 上述程式碼宣告字串變數author和title,並且指定字串變數title的初值。 變數price沒有指定型別;但有指定初值500,舊版2005版本的預設型別是Object;2008之後版本會自動以初值來指定資料型別為整數。
3-2-2 變數的宣告-Visual Basic專案 Visual Basic專案:Ch3-2-2 在主控台應用程式宣告6個變數,分別指定變數初值後顯示變數值,如下圖所示:
3-2-3 指定敘述-說明 Visual Basic在宣告變數的同時可以指定初值外,也可以使用指定敘述在之後更改或指定變數值,即"="等號運算子,如下所示: Dim depth, height, width As Integer Dim name As String height = 35 width = 57 name = "陳會安" 上述程式碼宣告整數和字串型別的變數後,使用指定敘述指定變數值。
3-2-3 指定敘述-圖例 在指定敘述“=”等號左邊的變數稱為「左值」(Lvalue),指的是變數的位址(Address)屬性,如果變數在等號的右邊稱為「右值」(Rvalue),這是變數的值(Value)屬性。 目前變數的記憶體圖例,如下圖所示:
3-2-3 指定敘述-Visual Basic專案 Visual Basic專案:Ch3-2-3 在主控台應用程式宣告數個變數後,使用指定敘述來指定變數值,如下圖所示:
ViLLE – 1.1 指定敘述與輸出變數值 請啟動ViLLE,在【一. 變數與運算子】目錄下,選【1. 指定敘述與輸出變數值】,按【Run】鈕模擬執行此範例程式,如下圖所示:
3-2-4 Option指令敘述-1 Option Explicit:設定程式變數是否一定需要事先宣告,Off表示不用宣告;強迫宣告需設為On,此為VS Express for Desktop的預設值,如下所示: Option Explict On Option Strict:指定程式是否使用嚴格的型別檢查,例如:當執行型別轉換進行嚴格檢查,預設值Off表示不嚴格檢查。如果需要嚴格檢查,請設為On,如下所示: Option Strict Off
3-2-4 Option指令敘述-2 Option Compare:指定字串比較方式是使用二進位或文字比較,可以是Binary(預設值)或Text,如下所示: Option Compare Binary Option Infer:如果指定Option Explict Off設定程式變數不需事先宣告時,我們可以再指定Option Infer為On(預設值),讓Visual Basic編譯器依變數第1次指定的值來自動決定最佳的資料型別;值如果為Off,此時的資料型別為Object,如下所示: Option Explict Off Option Infer On
3-2-4 Option指令敘述- Visual Basic專案 Visual Basic專案:Ch3-2-4 在主控台應用程式將VS Express for Desktop專案的Option Explicit設為Off,和Option Infer為On後,就可以不宣告變數,隨時在程式碼中使用變數,讓Visual Basic編譯器自動決定最佳的資料型別,如下圖所示:
3-2-5 符號常數的使用-說明 「符號常數」(Symbolic Constants或Named Constants)是在程式碼使用名稱來取代固定數字或字串,與其將符號常數視為變數,不如說它是名稱轉換,將一些數值的值使用有意義名稱來取代。 Visual Basic語言本身就擁有一些內建符號常數,例如:vbTab、vbNewLine等,不過使用者可以自行使用Const關鍵字建立符號常數,請注意!符號常數在宣告時需要指定其值,如下所示: Const MAX_WIDTH = 150 Const PI = 3.1415926
3-2-5 符號常數的使用- Visual Basic專案 Visual Basic專案:Ch3-2-5 在主控台應用程式宣告符號常數,並且在運算式使用符號常數來計算圓面積,如下圖所示:
3-2-6 列舉資料型別Enumeration-說明 如同符號常數使用名稱取代固定數值,「列舉常數」(Enumerations)是使用一組名稱來取代一組整數資料型別的數值。它是使用Enum/End Enum程式敘述來進行宣告,如下所示: Enum Color As Integer White = 1 Red Blue = 5 Green Black = Green End Enum
3-2-6 列舉資料型別Enumeration- Visual Basic專案 Visual Basic專案:Ch3-2-6 在主控台應用程式宣告列舉常數Color,然後顯示各列舉常數成員的對應值,如下圖所示:
3-3 資料型別 3-3-1 Visual Basic的基本資料型別 3-3-2 整數資料型別 3-3-3 浮點數資料型別 3-3-4 布林資料型別 3-3-5 字串資料型別 3-3-6 字元資料型別 3-3-7 日期/時間資料型別
3-3 資料型別 Visual Basic語言的資料型別是指變數的記憶體位址儲存的資料種類,Visual Basic資料型別可以分為「數值型別」(Value Types)和「參考型別」(Reference Types)兩種資料型別,如下所示: 數值型別:變數值儲存的是字面值,它是記憶體儲存的內容。Visual Basic語言提供Byte、Short、Integer、Long、Single、Double、Char和Boolean等基本資料型別。 參考型別:變數值並不是記憶體內容,而是記憶體位址。例如:Module、Class、String和Array陣列等,在第8章說明陣列Array;附錄A說明Class。
3-3-1 Visual Basic的基本資料型別- 說明 在宣告Visual Basic變數時不一定需要指定資料型別,如果沒有指定資料型別,預設資料型別是Object。 Object是所有Visual Basic資料型別的基礎資料型別,換句話說,這個變數可以儲存各種不同資料型別的資料。
3-3-1 Visual Basic的基本資料型別-種類1 說明 位元組 範圍 Boolean 布林值 2 True或False Byte 正整數 1 0~255 SByte 整數 -128~127 Char 字元 0~65535 Short 短整數 -32,768~32,767 UShort 正短整數 0~65,535 Integer 4 -2,147,483,648~2,147,483,647 UInteger 0~4,294,967,295 Long 長整數 8 -9,223,372,036,854,775,808~9,223,372,036,854,775,807 ULong 正長整數 0~18,446,744,073,709,551,615
3-3-1 Visual Basic的基本資料型別-種類2 說明 位元組 範圍 Single 單精度的浮點數 4 負值範圍為-3.4028235E+38~-1.401298E-45,正值的範圍為1.401298E-45~3.4028235E+38 Double 雙精度的浮點數 8 負值範圍為-1.79769313486231570E+308~-4.94065645841246544E-324,正值範圍為4.94065645841246544E-324~1.79769313486231570E+308 Decimal 數值 16 0~+/-79,228,162,514,264,337,593,543,950,335沒有小數,0~+/-7.9228162514264337593543950335帶28位小數,最小的非零值為+/-0.0000000000000000000000000001(+/-1E-28) Date 日期 0001年1月1日~9999年12月31日 String 字串 依平台 0~2百萬Unicode字元 Object 物件 物件型別變數可以儲存各種資料型別的值
3-3-2 整數資料型別-說明 「整數資料型別」(Integral Types)是指變數儲存的資料是整數沒有小數點。依整數資料長度的不同(即佔用的記憶體位元數),可以分為Byte、SByte、Char、Short、UShort、Integer、UInteger、Long和Ulong等整數資料型別。 Byte、Ushort、Uinteger和Ulong型別是正整數,其他可以是正整數或負整數,程式設計者能夠依照整數範圍決定宣告的變數型別。
3-3-2 整數資料型別- 十、八和十六進位 在程式碼如果直接使用「整數字面值」(Integral Literals),包含0、正整數和負整數都可以使用十進位、八進位和十六進位來表示,其預設型別是Integer,如果太長是Long型別。 整數字面值以“&O”開頭且每個位數的值為0~7整數時,表示是八進位;“&H”開頭的數值,位數值為0~9或A~F是十六進位。
3-3-2 整數資料型別-範例 如果想指定整數字面值的資料型別,可以在整數字面值後加上型別字元(Type Characters),19S是Short、19I是Integer,19L是Long,19US是UShort、19UI是UInteger和19UL是ULong。 一些整數字面值的範例,如下表所示:
3-3-3 浮點數資料型別-說明 「浮點數資料型別」(Floating Point Types)是指數值是整數再加上小數,例如:3.1415、102.567等,依長度不同(即佔用的記憶體位元數)分為:Single、Double和Decimal三種浮點數的資料型別。
3-3-3 浮點數資料型別-浮點數值 程式設計者可依浮點數值範圍來決定宣告的變數型別。如果在程式碼直接使用「浮點數字面值」(Floation-Point Literals),預設是Double型別,可以使用“E”符號代表10為底的指數。 如果浮點數字面值需要指定資料型別,型別字元"F"是Single資料型別,Double資料型別請使用"R",Decimal使用"D"。一些浮點數字面值的範例,如下表所示:
3-3-4 布林資料型別 「布林資料型別」(Boolean Type)只有兩個值True和False,對應「真」或「偽」狀態。
3-3-5 字串資料型別 「字串資料型別」(String Type)的資料是字串,字串是0或多個依序的Char資料型別的字元,以雙引號括起的文字內容,即「字串字面值」(String Literals),如下所示: Dim str1 As String = “Visual Basic程式設計” Dim str2 As String = “Hello World!” Dim str3 As String = _ ”\\localhost\download\joe”
3-3-6 字元資料型別 「字元資料型別」(Char Type)是單一Unicode字元,如果是數值,可以儲存「無符號」(Unsigned)16位元整數。 在Visual Basic程式使用「字元字面值」(Character Literals)是以雙引號括起的單一字元,如下所示: Dim a As Char = "A"C
3-3-7 日期/時間資料型別 「日期/時間資料型別」(Date Type)可以儲存日期/時間資料,「日期/時間字面值」(Date Literals)的日期時間資料需要使用"#"括起,如下所示: Dim tday As Date = #12/30/2015 12:00:00 AM# 上述日期/時間值的年份有4位數,時間部分可以是12或24小時制,如果沒有AM或PM是24小時制,忽略分或秒的預設值為0。
3-3 資料型別-Visual Basic專案 Visual Basic專案:Ch3-3 在主控台應用程式宣告各種資料型別的變數後,測試各種資料型別的字面值,如下圖所示:
3-4 運算式與運算子 3-4-1 運算式的基礎 3-4-2 運算子的優先順序 3-4-3 算術運算子 3-4-4 字串連接與Like運算子 ViLLE – 1.3 數學公式建立運算式 3-4-4 字串連接與Like運算子 3-4-5 指定運算子
3-4-1 運算式的基礎-圖例 「運算式」(Expressions)是由一序列「運算子」(Operators)和「運算元」(Operands)組成,可以在程式中執行所需的運算任務,運算式是「150+100」,「+」加號是運算子;150和100是運算元,在執行運算後,可以得到運算結果250,其說明如下所示: 運算子:執行運算處理的加、減、乘和除等符號。 運算元:執行運算的對象,可以是字面值、變數或其他運算式。
3-4-1 運算式的基礎-範例 運算式是由運算元和運算子組成,在指定敘述的運算式一定在等號右邊,如下所示: C1 = A + B – 1 C2 = (A >= B) C3 = A & B C4 = (A < B And A > 1) 上述運算式的變數A、B和數值1是運算元,+、-、<、>=和>為運算子,變數C1~C4是左值,也就是運算式將計算結果存入變數C1~C4。
3-4-2 運算子的優先順序-說明 Visual Basic提供多種運算子,如果在同一個運算式使用多種運算子,為了讓運算式能夠得到相同結果,運算式是使用運算子預設的優先順序進行運算。 Visual Basic運算式預設依其出現順序,由左到右依序的執行運算。
“( )”括號內比括號外先執行,括號是為了推翻現有優先順序,在括號內是依照正常優先順序。 3-4-2 運算子的優先順序-規則1 “( )”括號內比括號外先執行,括號是為了推翻現有優先順序,在括號內是依照正常優先順序。 當運算式擁有多種運算子時,算術運算子最先,接著關係運算子,最後是邏輯運算子,如下: 算術運算子 > 關係運算子 > 邏輯運算子 關係運算子擁有相同的優先順序。
算術運算子加和減法優先順序相同,乘和除法擁有相同的優先順序,不過乘除高於加減,如下: 3-4-2 運算子的優先順序-規則2 算術運算子加和減法優先順序相同,乘和除法擁有相同的優先順序,不過乘除高於加減,如下: ^指數 > (-)負號 > */乘除 > \整數除法 > Mod > +-加減 > & 邏輯運算子的優先順序,如下所示: Not > And, AndAlso > Or, OrElse > Xor
3-4-3 算術運算子-說明 算術運算子+-也可以是「單運算元」(Unary)運算子的正負號。各種算術運算子的說明,如下表所示:
3-4-3 算術運算子-數學運算式 如果使用變數,可以建立更複雜的數學運算式,如下所示: f = X^2-2*X+3 f = (X+Y)^2+5 已知數學公式,例如:華氏(Fahrenheit)和攝氏(Celsius)溫度的轉換,攝氏轉華氏的公式如下所示: F = (9.0 * C) / 5.0 + 32.0 華氏轉攝氏的公式,如下所示: C = (5.0 / 9.0 ) * (F - 32)
3-4-3 算術運算子-Visual Basic專案 Visual Basic專案:Ch3-4-3 在主控台應用程式計算上述數學運算式的值,和轉換攝氏或華氏溫度,如下圖所示:
ViLLE – 1.3 數學公式建立運算式 請啟動ViLLE,在【一. 變數與運算子】目錄下,選【3. 數學公式建立運算式】,按【Run】鈕模擬執行此範例程式,如下圖所示:
使用範本的萬用字元來進行字串比較,如果符合傳回布林值True;否則為False 3-4-4 字串連接與Like運算子-說明 對於String資料型別,Visual Basic語言提供兩種運算子,可以連接字串內容和進行字串的範本比較,如下所示: 運算子 說明 運算式範例 & 字串連接 "abc" & "de" = "abcde" Like 字串比較 使用範本的萬用字元來進行字串比較,如果符合傳回布林值True;否則為False
3-4-4 字串連接與Like運算子-範本字串 Like運算子的第1個運算元是欲比較字串,第2個運算元是範本字串,這是使用特殊符號字元組成的字串,如下表所示:
3-4-4 字串連接與Like運算子-範本字串範例
3-4-4 字串連接與Like運算子-Visual Basic專案 Visual Basic專案:Ch3-4-4 在主控台應用程式測試字串連接和比較運算子Like,如下圖所示:
3-4-5 指定運算子 指定運算子除了使用前述指定敘述"="外,指定運算子還可以配合其他運算子來簡化運算式,建立更簡潔的算術運算式,如下表所示:
3-5 資料型別的轉換 3-5-1 隱含型別轉換 3-5-2 明顯型別轉換
3-5 資料型別的轉換 「資料型別轉換」(Type Conversions)是因為同一個運算式可能有多個不同資料型別的變數或字面值。例如:在運算式擁有整數和浮點數的變數或字面值時,就需要執行型別轉換。 資料型別轉換是指轉換變數儲存的資料,而不是變數本身的資料型別,因為不同型別佔用的位元組數不同,在進行資料型別轉換時。例如:Double轉換成Single,變數資料就有可能損失資料或精確度。
3-5-1 隱含型別轉換-說明 「隱含型別轉換」(Implicit Conversions)並不需要特別語法,在運算式或指定敘述兩端,如果有不同型別的變數,就會將儲存資料自動轉換成相同的資料型別。 一些運算式範例,如下表所示:
3-5-1 隱含型別轉換-Visual Basic專案 Visual Basic專案:Ch3-5-1 在主控台應用程式建立運算式來測試隱含型別轉換,如下圖所示:
3-5-2 明顯型別轉換-說明 隱含型別轉換對於程式設計者來說,並不需要任何額外處理。不過,因為是自動轉換,有時可能造成未知的型別轉換錯誤。例如:上一節範例程式,如果準備將字串轉換成整數後再相加,運算式num=str1+str2結果的值應該是375,而不是250125。 「明顯型別轉換」(Explicit Conversions)是在進行運算前,自行使用轉換函數轉換成相同資料型別。
3-5-2 明顯型別轉換-轉換函數 在本節範例程式只使用幾個轉換函數,更多轉換函數說明請參閱第7-4-3節,如下表所示:
3-5-2 明顯型別轉換-Visual Basic專案 Visual Basic專案:Ch3-5-2 在主控台應用程式建立運算式來測試明顯型別轉換,對於不同型別變數,我們需要自行使用型別轉換函數來轉換型別,如下圖所示:
End