2.1.2 什么是变量
随便找一本计算机程序设计专业教材,都可以看到“变量”的学术定义,比如:
变量是指一个包含部分已知或未知的数值或信息(一个“值”)的内存单元,以及一个与之对应的符号名称(标识符)[1]。
如果读者从未学过程序设计,想必看到这段文字时会觉得不知所云。没关系,下面我们用通俗的语言解释一下变量的含义,虽然不完全精确,但足以帮助大家理解。
其实在执行案例2-1中的VBA程序时,计算机也是分解步骤并记住中间结果的。比如在执行“Cells(4,5)=Cells(4,3)* Cells(4,4)* 0.2”这一语句时,会先计算出 Cells(4,3)* Cells(4,4)的结果,再将其与0.2相乘。
那么计算机是用哪个“部件”记住这个结果的呢?就是大家经常听到的“内存(Memory,直译为‘记忆体’)”这个部件。我们可以把内存想象成由很多个“小房子”排在一起组成的“城市”,每个“小房子”里面都可以存放一个数值。在执行代码时,中间结果就存放在某个“小房子”中,如图2.2所示。
图2.2 内存空间分配示意。图中上方是一个常见的内存条照片,下方是对内存空间的极简示意,每个方格就是一个“小房子”,可以存放一个数据
不过问题在于,当计算机执行完“Cells(4,5)=Cells(4,3)* Cells(4,4)* 0.2”这一语句,得到最终结果1000(5000×0.2)并写入E5单元格之后,就自然而然地认为“5000”这个数字已经无用。所以马上就把它从内存中清除掉,腾出空间以便执行后面的计算。
因此,如果想“记住”5000这个会反复用到的重要数字,必须在内存中指定一个“房子”作为“长期居所”。这种房子的特点是:不允许计算机执行完一行代码就自作主张地把它清空,而是要保持记忆。
申请到“长期居所”后,就把程序计算出的“5000”保存到其中,并且在需要的时候直接把它调取出来使用。此外,鉴于一个程序中可能需要指定很多“长期居所”,为了便于区分,我们还要给每个“长期居所”起一个独一无二的名字。
内存中这种由我们亲自命名的“长期居所”就是“变量”。对应到前面那个专业的术语定义中就是:有标识符(起了名字)的内存单元(房子)。
理解了变量的概念,就可以修改案例2-1的代码。假如我们把保存数字5000的这个房子命名为“x”,就可以把上述代码改成下面这样:
这段程序中的“x”就是一个变量。计算机执行第一行代码时发现这是一条赋值语句,并要求用到一个名为“x”的变量,于是就先在内存中指定某个“房子”为“长期居所”,并且将其命名为“x”;然后计算等号右边的部分,得到结果“5000”,并将其保存到这个名为“x”的“房子”中。
在执行接下来的三行代码时,每当在代码中看到“x”变量,计算机就会到内存中找到名为“x”的“房子”,并将其内容(5000)取出用于计算。如此逐条执行代码,直到遇见“End Sub”,结束整个程序。
需要注意的是:“长期居所”不等于“永久居所”,当这个程序全部执行结束时,计算机还是会自动清空在它里面指定的所有变量(如x)。因为没有了程序保留这些变量也无用,所谓“皮之不存,毛将焉附”。