工控随笔_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、或者在页面右下角点推荐哟!!!

--------------------------------------------------------------分割线------------------------------------------------------------

猜你喜欢

转载自www.cnblogs.com/volcanol/p/10009628.html