1. 程式人生 > >工控隨筆_12_西門子_WinCC的VBS指令碼_03_變數型別

工控隨筆_12_西門子_WinCC的VBS指令碼_03_變數型別

  說到程式語言,總是繞不開資料型別,因為資料型別決定了資料可以進行什麼樣的操作。同時資料型別

從廣義上來說是一種資料結構,在程序式程式設計的過程中,曾經有過這樣一種說法:

程式 = 資料結構 + 演算法

  可見資料型別的重要性。大體來說,程式語言有三種: 強型別語言, 弱型別語言,介於兩者之間的語言。

強型別語言要求變數定義的時候必須明確資料型別,弱型別語言不要求在變數定義時明確資料型別。

一、強型別語言、弱型別語言

  我們所知的C語言系的語言都要求變數定義時明確資料型別,例如C語言、C++、Java語言等都是強型別

語言。 而VBS等指令碼語言,則是弱型別的語言。 這就決定了vbs定義變數時不需要明確資料型別。

  下面是各種語言定義變數時的語法。

//我是C語言,我是強型別語言

//定義變數時確定資料型別
int  nAge;   

 

//我是C++, 我也是強型別語言

class A
{

};

//類例項化的時候需要指定物件的型別
A  objectA;

 

//我是Delphi的Pascal, 我也是強型別語言

//定義變數需要指定型別
var 
    nPage:integer;

 

'我是vbs,我是弱型別語言

'定義變數不需要指定資料型別
Dim varTest

 

二、vbs的資料型別

  這篇文章我們簡單的來描述一下vbs中資料型別的相關內容。

'vbs中的資料型別
'vbs指令碼中的資料只有一種資料型別,就是variant
'可以將vbs變數看成一個具有AI功能的容器,可以識別不同的資料型別
'更準確的是:
'1、vbs只有一種資料型別variant
'2、vbs變數的資料型別都對應一個子型別
'3、可以將variant看成一個基類,子資料型別看成派生類,
'4、vbs是具有OOP特性的一種指令碼程式語言
'5、vbs變數在同一時刻,只能表示一種資料型別,或者說只能儲存一種
'   資料型別的資料; 不能既儲存Long型又同時儲存string型字串
'6、vbs變數可以自動為儲存的資料選擇合適的資料型別 '7、這裡需要說道賦值運算,當一個變數第一次賦值的時候,vbs就假定 ' 這個變數的資料型別為賦值時的子型別。除非再一次賦值,否則就一直 ' 保持第一次賦值的子型別不變 'vbs中的資料型別檢測函式 '1、vartype 函式, 這個函式返回資料型別的常量資訊 '2、typename 函式,這個函式返回資料型別的字串資訊 Dim var var = 10 MsgBox VarType(var) MsgBox TypeName(var) var = "volcanol" MsgBox VarType(var) MsgBox TypeName(var) '關於輸入對話方塊InputBox的輸入處理 'InputBox輸入對話方塊返回的是字串 Dim strDataType MsgBox TypeName(InputBox("請輸入最大年齡的數值","最大年齡","150")) '這裡需要注意isnumeric函式檢查輸入的變數是否都是數字 '如果都是由 0-9 之間的數字組成的,那麼返回True,否則返回false '這一點需要注意 If IsNumeric(InputBox("測試輸入的值是否是數值","輸入數值")) Then MsgBox "測試isnumeric函式的作用" End If '在vbs中也有與C語言中一樣的型別轉換:強制型別轉換、隱式型別轉換 '強制型別轉換通過函式實現 '隱式型別轉換vbs會自動完成 '再看下面的例子,因為nMaxAge要進行算術減法,所以vbs指令碼引擎會將 'nMaxAge解釋為一個int型資料 Dim nMaxAge Dim nMinAge Dim nDiffAge '第一次賦值的時候,nMaxAge是string型別 nMaxAge = InputBox("請輸入最大年齡的數值","最大年齡","200") '第一次賦值的時候 nMinAge = 0 MsgBox "第一次賦值後 nMinAge的型別是:" & TypeName(nMinAge) '這個地方要進行計算,- 需要的是數字型別,這個地方表示式中 '會將 nMaxAge 的 string型別隱式型別轉換為 double 型別, '然後再與nMinAge 進行計算. 需要注意的是隱式型別時的要點。 nDiffAge = nMaxAge - nMinAge MsgBox nDiffAge MsgBox "nDiffAge資料型別是:" & TypeName(nDiffAge) '下面表示式的型別是integer MsgBox "1 + 2 表示式的型別是: " & TypeName(1+2) '日期和時間型別 MsgBox Date() MsgBox TypeName(Date()) MsgBox Time() MsgBox TypeName(Time()) '注意日期型別常量的使用兩個##符號引用起來的一個字串, '就和下面的例子一樣 MsgBox TypeName(#2018/11/23#) MsgBox "日期的數值是:" & CLng(#2018/11/23#) MsgBox "數字65535對應的日期是:" & CDate(65535) MsgBox "數字0對應的日期是:" & CDate(0) MsgBox #1970/1/1# '注意時間的常量與日期常量的不同 MsgBox TypeName("14:19:29") '前面我們說過 & 和 + 都可以進行字串的連線 '因為 + 符號還可以作為加法運算子,因此這裡需要注意在 '使用過程中的隱式型別轉換 '例如我們想輸出一個 100234 的字串 Dim strTest Dim nTest strTest = CStr(100) nTest = 234 '不能輸出字串 MsgBox strTest + nTest '可以輸出字串 MsgBox strTest & nTest '******************************************* ' + 符號的規則 ' 1、如果兩邊都是數字,按照數字計算 ' 2、如果一邊是數字型別,則看另一邊是否能隱式型別轉換為數字 ' 如果能隱式型別轉換,則按照數字計算加法求和, 否則就報錯 ' ' 3、如果兩邊都是字串,那麼就連線字串 ' ' 4、字串型別最好用 & 進行連線 'Empty 和 NULL '如果一個變數未進行初始化則其型別為Empty Dim varEmpty MsgBox TypeName(varEmpty) '下面的函式呼叫也進行了隱式型別轉換,將empty型別的變數轉換為string型別 MsgBox varEmpty If IsEmpty(varEmpty) Then MsgBox "varEmpty變數未初始化" End If '這裡還需要注意的是empty這個常量, varEmpty = Empty If IsEmpty(Empty) Then MsgBox "varEmpty = Empty 賦值後,已經初始化" Else MsgBox "varEmpty = Empty賦值後,已經初始化,這一段不執行" End If If varEmpty = Empty Then MsgBox "varEmpty = Empty 後,其值就是Empty,執行這一段" Else MsgBox "varEmpty = Empty後,其值是Empty,邏輯結果為真,這一段不執行" End If Dim varNull varNull = Null MsgBox TypeName(varNull) '下面的語句不能執行,這個地方就是NULL和empty的區別 '而且一般只有顯示的給變數賦值為NULL,變數的值才是NULL 'MsgBox varNull If IsNull(varNull) Then MsgBox "varNull變數的值是NULL" End If If IsEmpty(varNull) Then MsgBox "varNull變數沒有初始化" Else MsgBox "varNull變數已經初始化" End If

 

三、Tips

  雖然vbs是一種弱型別的語言,但是這並不妨礙我們編寫出合格的健壯的程式碼。 這裡有幾個要點可以

提高程式碼健壯性。

  1、一個變數只用來做一件事。

  2、利用匈牙利命名法來實現程式碼的自描述,通過增加字首來說明變數的型別。

  3、變數在初始化的時候儘量進行強制型別轉換。

  4、注意vbs的隱式型別轉換規則

  5、注意各種型別的區別。

 

--------------------------------------------------------------分割線---------------------------------------------------------------

1、文章均為個人原創,歡迎轉載,轉載請保留出處:https://www.cnblogs.com/volcanol/

2、獲取工控PLC、變頻器、HMI、計算機、Windows、Linux、嵌入式資料點選:獲取資料

3、如果您覺得文章對您有幫助可轉至頁面上半部分打賞,或移步:打賞 

4、或者在頁面右下角點推薦喲!!!

--------------------------------------------------------------分割線------------------------------------------------------------