Pascal 编程/变量和常量
与所有编程语言一样,Pascal 提供了一些修改内存的方法。这个概念被称为变量。变量是命名的内存块。你可以用它们来存储你无法预测的数据。
另一方面,常量是命名的数据块。你不能在运行时修改它们,但它们是硬编码到已编译的可执行程序中的。常量不一定占用任何专用的唯一内存空间,但有助于编写干净且易于理解的源代码。
在 Pascal 中,在你甚至被允许使用任何变量或常量之前,你必须声明它们,就像 Pascal 中几乎所有符号一样。声明使某个符号对编译器已知,并可能指示它为其有效使用做必要的准备,这意味着——在变量的上下文中——为某个内存块预留一些空间。
声明始终是一个二元组 ,更具体地说,变量的声明方式为 ,而常量的声明方式为 元组。元组是有序集合。你不能在不使元组变为不同的情况下反转或重新排列其项目。
| 在你声明一个标识符来表示一个事物后,你不能重新声明同一个标识符来表示另一个(或同一个)事物(“阴影”可能适用,但稍后会详细介绍)。 |
标识符是表示常量、类型、边界、变量、过程和函数的名称。它们必须以字母开头,后面可以跟任何组合和数字的字母和数字。标识符的拼写对其整个长度都具有重要意义。对应的大写字母和小写字母被认为是等效的。[1]
字母指的是现代拉丁字母,即你在书写英语单词时使用的所有字母,而数字是西阿拉伯数字。
正如你从引言的最后一句话中推断出的那样,字母的大小写无关紧要:Foo 和 fOO 都是同一个标识符,只是表示方式不同。
标识符的使用很简单,只需在合适的位置写出来即可。
在 Pascal 开发的时代,计算机内存是一种宝贵的资源。然而,为了构建一个有效的编译器,引入了重要字符的概念。标识符的重要字符是区分两个标识符的字符。
一些编程语言有 8(八)个字符的限制。这导致了非常神秘的标识符。然而,如今,重要字符的限制主要受可用性的影响:程序员最终必须自己输入这些字符,除非 IDE 支持某种自动完成功能。例如,FPC 的限制是 127 个字符
标识符包含
1到127个重要字符(字母、数字和下划线字符),其中第一个必须是字母(a‑z或A‑Z),或下划线(_)。[2]
| 你仍然可以编写长度超过 127 个字符的标识符,但是,编译器只查看前 127 个字符,并丢弃其余字符,因为它们与编译器无关。 |
请注意,允许使用 _ 也是 ISO 10206(“扩展 Pascal”)的扩展,但是——与 FPC 不同——它规定标识符既不能以下划线开头也不能以下划线结尾,也不允许两个下划线彼此相邻。
变量是在专用部分中声明的,即 var 部分。
program varDemo(input, output);
var
number: integer;
begin
write('Enter a number: ');
readLn(number);
writeLn('Great choice! ', number, ' is awesome.');
end.
当编译器处理 var 部分时,它将为其关联的数据类型分配尽可能多的内存。在这里,我们指示编译器为一个 integer 预留空间。一个 integer 是一种编程语言的一部分的数据类型,因此,无论使用哪个编译器,它都保证存在。它存储 ℤ 的一个子集,即整数集,例如 42、1337 或 -1。
数据类型指的是允许的值范围和对该范围的值的允许操作的组合。Pascal 将一些基本数据类型定义为语言的一部分。除了 integer 之外,还有
char- 一个字符,比如拉丁字母或西阿拉伯数字,但也包括空格和其他字符。
real- ℚ 的一个子集,即由于计算机的二进制性质,有理数的集合。例如
0.015625(2−6) 或73728.5(216 + 213 + 2−1)。 布尔值- 布尔值,即
false或true。
每个数据类型定义了数据在内存中的布局方式。在诸如 Pascal 之类的更高级语言中,程序员无需关心数据的具体存储方式,但处理器(即在大多数情况下为编译器)必须定义它。
我们将在后面重新讨论所有数据类型。
如您所见,上面的示例包含 readLn(number) 以及程序头也列出了 input。 ReadLn 将(尝试)从(可选命名的)源读取数据并将(解释的)值存储到提供的参数中,丢弃所有行尾字符。如果没有指定源,就像这里一样,将假定为 input,因此 readLn(number) 等效于 readLn(input, number),但更短。
当程序运行时,它将停止并等待用户输入一个数字,即可以转换为参数数据类型的字面量。
Enter a number: I want cookies!
./a.out: sign or digit expected (error #552 at 402ac3)
writeLn 没有执行。现在很明显 I want cookies! 不是可以转换为 integer 值(即 number 的数据类型)的字面量。作为参考,此错误消息是使用使用 GPC 编译的程序生成的。使用不同编译器编译的程序可能会发出不同的错误消息。您必须在程序的附带文档(即用户手册)中说明用户何时何地需要输入数据。稍后我们将学习如何处理错误输入,但这目前太复杂了。
可以根据需要创建任意数量的 var 部分,但它们不能为空。还有一种用于声明多个相同类型的变量的简写语法
var
foo, bar, x: integer;
这将声明 *三个* 独立变量,它们都是 integer 数据类型。但是,*不同* 的类型必须出现在不同的声明中
var
x: integer;
itIsSunnyInPhiladelphia: Boolean;
program constDemo(output);
const
answer = 42;
begin
writeLn('The answer to the Ultimate Question of ',
'Life, the Universe, and Everything, is: ',
answer);
end.
如引言中所述,常量永远不会改变其值,但您必须修改源代码。因此,常量的名称不能出现在赋值语句的左侧。
有一些预定义的常量
maxInt- 这是
integer变量可以假定的最大integer值。没有 *最小整数* 常量,但保证integer变量至少可以存储值-maxInt。 maxChar- 同样,这是
char变量可以假定的最大char值,其中 *最大* 指的是使用内置的ord函数的序数值。 maxReal、minReal和epsReal- 由“扩展 Pascal”标准定义。
false和true- 指的是布尔值。
Pascal 的设计初衷是为了使它能够在一遍中从上到下编译:原因是为了使编译变得快速简单。区分变量和常量允许处理器简单地将常量标识符的任何出现替换为其值。因此,常量不需要像变量一样进行特殊处理,但允许程序员重用重复出现的数据。
Zähler(意为“计数器”/“枚举器”)构成有效的标识符吗?
1direction (1D) 是允许的标识符吗?
write 和 writeLn 之间有什么区别?writeLn 在打印完所有参数后将光标移到下一行。
参考文献
- ↑ Jensen, Kathleen; Wirth, Niklaus. Pascal – user manual and report (4th revised ed.). doi:10.1007/978-1-4612-4450-9. ISBN 978-0-387-97649-5.
{{cite book}}: no-break space character in|title=at position 7 (help) - ↑ Michaël Van Canneyt (2017年9月). "§1.4". Free Pascal 参考手册. version 3.0.4. p. 15. ftp://ftp.freepascal.org/pub/fpc/docs-pdf/ref.pdf. 检索于 2019-12-14.