谁希望成为脚本专家?

每周脚本测验题

*

脚本测验题答案:2006 年 1 月 20 日:2 + 2 难道不等于 4 吗?

这个问题很有趣。从我们收到的电子邮件来看,显然很多人都能发现这个问题:VBScript 将这些值当作字符串而不是数字来处理。然而,不是每个人都知道如何解决该问题。嘿,但这正是“脚本专家”的作用!

如果您未做上周的测验,不妨可以在这里试一下;您也可以继续阅读,让我们告诉您答案。不要忘了,本周我们又给出了一道新测验题。请试一试,看看您的答案会是什么。

返回页首返回页首

2006 年 1 月 20 日答案

正如我们注意到的,这里的问题与数据类型有关:我们键入数字 (2 + 2),而 VBScript 却当我们键入的是字符串(即,twotwo)。通常,在合并字符串(或者如我们夸张的脚本专家所称,叫“连接”字符串)时,会使用“与”符号,就像这样:

a = "two"
b = "two"
Wscript.Echo a & b

相当简明。然而(或许糟糕的是)VBScript 同样允许使用加号来连接字符串:

a = "two"
b = "two"
Wscript.Echo a + b

这就是您不会收到任何错误消息的原因:在 VBScript 中,使用加号将两个字符串“相加”是完全合法的。(然而,不能反过来使用“与”符号将两个数字相加。)

不过,这些您都已知道了,对吧?毕竟,大多数人都能找出问题所在,只是想不出该如何解决问题。别紧张,下面就告诉您怎样解决该问题:

intNumber1 = InputBox("Please enter the first number:")
intNumber2 = InputBox("Please enter the second number:")
intNumber3 = CInt(intNumber1) + CInt(intNumber2)
Wscript.Echo intNumber3

正如您所看到的,脚本大部分都没变。我们所做的只是取出每个变量,然后通过 CInt 函数运行该变量。使用 VBScript 时,您很少会遇到数据类型方面的问题,究其原因是因为 VBScript 非常擅长推测您使用的是何种数据。(而且,与编程语言不同,它还很擅长根据需要在不同数据类型之间进行转换。)然而,VBScript 并非绝对可靠:它偶尔也会猜错。意识到这一点,VBScript 的创造者们在其中加入了许多诸如 CInt 的函数,这些函数允许您为变量指定相应的数据类型。(该处理方法有时称为强制数据类型,有时称为类型转换。只要您理解其具体作用,怎么称呼都无所谓。)

利用 CInt(character-to-integer(字符到整数)的简称),您可以取一个字符串值,强迫脚本将其当作数字来使用。(当然,对此有一些例外是显而易见的:您决不会让 VBScript 接受 dog 作为数字。)这正是我们用下面这行代码所做的事情:

intNumber3 = CInt(intNumber1) + CInt(intNumber2)

我们在此所做的就是告诉 VBScript,“留意,取出变量 intNumber1 的值,将其由字符串转换为整数。对变量 intNumber2 进行同样的操作,然后将这两个整数加起来,并将和存储在变量 intNumber3 中。”VBScript 就是 VBScript,它会严格按照我们的要求去做,即将两个数字相加(而不是连接两个字符串)。

顺便说一下,我们不知道为什么 VBScript 会将“输入框”中所键入的任何内容都当作字符串处理,似乎它就是这样设计的。幸亏对于作为命令行参数传递的或硬编码到脚本中的变量,不会出现这种情况。例如,以下脚本不必进行任何类型转换或数据强制就能正确运行。

intNumber1 = 2
intNumber2 = 2
intNumber3 = intNumber1 + intNumber2
Wscript.Echo intNumber3

当然,您想要的可能并不是整数。采用我们修改后的脚本,2 + 2 将等于 4,然而,2.2 + 2.2 同样也将等于 4。这是因为 CInt 函数会将变量变成整数,也就是说丢弃小数点后面的数字。但是没关系:VBScript 还有许多其他转换函数。您需要处理小数点吗?那么,就请使用 CDbl 函数,它会将字符串值转换为双精度,这种数据类型允许使用小数点:

intNumber1 = InputBox("Please enter the first number:")
intNumber2 = InputBox("Please enter the second number:")
intNumber3 = CDbl(intNumber1) + CDbl(intNumber2)
Wscript.Echo intNumber3

这种情况有点不可思议:在现实生活中,2 + 2 几乎从来不会等于 22。不过,至少它很容易解决。

返回页首返回页首

我们是如何知道这些的呢?

对于“我们是如何知道这些的呢?”这一问题,这次我们会给出一个令人满意的答案。毕竟,上期 Sesame 脚本专栏讨论的就是数据类型,甚至还解释了如何将某种特定数据类型“强加”给某个变量。如果您每个月都照常阅读 Sesame 脚本,那么很容易就能找到答案。

呃,是的,我们知道:Sesame 脚本主要是针对初学者。但是,许多人发现,在未努力弄清楚事情真相之前,他们都以为自己是一个相当有经验的脚本编写者,从没有在像数据类型这样的事情上出过纰漏。因此,以防万一,看一看“脚本中心”的新文章决不会有什么坏处。(当然,Microsoft Windows 2000 Scripting Guide(英文)也包含了有关数据类型的讨论。但考虑到该书重约 750 磅这样一个事实,天知道其中究竟包含了什么样的讨论?!?)

不可否认,如果您对数据类型和类型转换并不熟悉,那么您修正这个脚本会有些困难。最好的做法是尽力尝试隔离问题。例如,不要只尝试 2 加 2,就认定这是一个数据类型问题;毕竟,有时脚本只对某些数字才会出问题。(原因也许是错误处理代码写得不好。)试一试 48 加 48,再试试 3.827 加 5.3622。接着,试一试 dogcat。确保您确实知道问题在于:您的数字进行了连接而不是求和。它本身可能解决不了任何问题,但它将会向您提供足够的信息,到新闻组中去解释发生的情况。运气好的话,别人要么能解决您的问题,要么能指点您去访问可能有助于解决问题的资源。是的,就像 Sesame 脚本专栏。


返回页首返回页首