一、注释
每个语言都有注释,Pascal的注释有三种
{
这里是注释
可以是多行注释
}
// 这里是单行注释,C语言的风格
(* 括号加星号包围的也是注释 *)
--------
有一种特殊情况,在编译器里经常看到 {$system..},大括号加美元符号,这叫做编译指令。
尽管{$system + 我是注释} 也行,但是不建议这样写。
二、使用大写字母
1. pascal不区分大小写,无论大小写还是混写都是同一个,这是优点之一,但是为了美观,我们统一建议使用大驼峰写法,即:MyName,这也是Pascal官方的标准写法。
2. 空格的多少,不影响编译结果,可以随意空格,除了单词别换行,我们只要遵循代码可读性,在适当时候换行,在适当时候空格。
3. 坚持每条语句用分号结束;
三、优化版面
参见以下代码:
if .... then statement; if .... then begin statement01; statement02; end;if .... then begin if ... then statement; statement; end;
四、使用代码模板
Delphi中如果你经常重复输入一段语句的话,可以使用代码模板,例如你输入arrayd,然后按Ctrl+J,Delphi编译器就会把你的文本扩展为:
array [0..] of ;
由于同一种代码结构在预定义的代码模板中通常有多种样式,所以模板中的缩略形式一般加有一个后缀字母,以便你选用,此外你也可以只输入前面几个字母,如arr,然后再按Ctrl+J,然后会弹出下拉列表,供你选择。
模板可以定制,在编写的过程中,可以自定义自己想要的代码模板,也就是代码片段的意思。
五、编程语句之关键词
Pascal中有很多保留字不可以做为变量标识符,应做保留,Pascal中的保留关键词表格如下:
表2.1:面向对象Pascal语言中的关键字及保留字
关键字 | 作用 |
---|---|
absolute | 指令 (变量) |
abstract | 指令 (方法) |
and | 运算符 (布尔) |
array | 类型 |
as | 运算符 (RTTI) |
asm | 语句 |
assembler | 向后兼容 (汇编) |
at | 语句 (异常处理) |
automated | 访问类别符 (类) |
begin | 块标记 |
case | 语句 |
cdecl | 函数调用协定 |
class | 类型 |
const | 声明或指令(参数) |
constructor | 特殊方法 |
contains | 运算符 (集合) |
default | 指令 (属性) |
destructor | 特殊方法 |
dispid | dispinterface 界面类别符 |
dispinterface | 类型 |
div | 运算符 |
do | 语句 |
downto | 语句 (for) |
dynamic | 指令 (方法) |
else | 语句 (if 或 case) |
end | 块标记 |
except | 语句 (异常处理) |
export | 向后兼容 (类) |
exports | 声明 |
external | 指令 (函数) |
far | 向后兼容 (类) |
file | 类型 |
finalization | 单元结构 |
finally | 语句 (异常处理) |
for | 语句 |
forward | 函数指令 |
function | 声明 |
goto | 语句 |
if | 语句 |
implementation | 单元结构 |
implements | 指令 (属性) |
in | 运算符 (集合) - 工程结构 |
index | 指令 (dipinterface界面) |
inherited | 语句 |
initialization | 单元结构 |
inline | 向后兼容 (见 asm) |
interface | 类型 |
is | 运算符 (RTTI) |
label | 声明 |
library | 程序结构 |
message | 指令 (方法) |
mod | 运算符 (数学) |
name | 指令 (函数) |
near | 向后兼容 (类) |
nil | 数值 |
nodefault | 指令 (属性) |
not | 运算符 (布尔) |
object | 向后兼容 (类) |
of | 语句 (case) |
on | 语句 (异常处理) |
or | 运算符 (布尔) |
out | 指令 (参数) |
overload | 函数指令 |
override | 函数指令 |
package | 程序结构 (控件包) |
packed | 指令 (记录) |
pascal | 函数调用协定 |
private | 访问类别符 (class) |
procedure | 声明 |
program | 程序结构 |
property | 声明 |
protected | 访问类别符 (类) |
public | 访问类别符 (类) |
published | 访问类别符 (类) |
raise | 语句 (异常处理) |
read | 属性类别符 |
readonly | dispatch 界面类别符 |
record | 类型 |
register | 函数调用协定 |
reintroduce | 函数指令 |
repeat | 语句 |
requires | 程序结构 (控件包) |
resident | 指令 (函数) |
resourcestring | 类型 |
safecall | 函数调用协定 |
set | 类型 |
shl | 运算符 (数学) |
shr | 运算符 (数学) |
stdcall | 函数调用协定 |
stored | 指令 (属性) |
string | 类型 |
then | 语句 (if) |
threadvar | 声明 |
to | 语句 (for) |
try | 语句 (异常处理) |
type | 声明 |
unit | 单元结构 |
until | 语句 |
uses | 单元结构 |
var | 声明 |
virtual | 指令 (方法) |
while | 语句 |
with | 语句 |
write | 属性类别符 |
writeonly | dispatch 界面类别符 |
xor | 运算符 (布尔) |
六、运算符及其优先级
如果你以前写过程序,那么你已经知道表达式是什么了。这里我专门讲一下Pascal 运算符的特殊部分:运算符的优先级。
表2.2中按优先级分组列出了Pascal语言的运算符。
与大多数编程语言相反,Pascal语言中and和or运算符的优先级比关系运算符高。因此,如果你的代码为a < b and c < d,编译器首先会编译and运算符,由此导致编译出错。为此你应该把每个 < 表达式用小括号括起来: (a < b) and (c < d)。
同一种运算符用于不同数据类型时它的作用不同。例如,运算符 + 可以计算两个数字的和、连接两个字符串、求两个集合的并集、甚至给PChar 指针加一个偏移量。然而,你不能象在C语言中那样将两个字符相加。
另一个特殊的运算符是 div。在Pascal 中,你能用 / 计算两个数字(实数或整数)的商,而且你总能得到一个实型结果。如果计算两个整数的商并想要一个整型结果,那么就需要用 div 运算符。
表 2.2: Pascal语言中的运算符及其优先级
单目运算符 (最高优先级) | |
---|---|
@ | 取变量或函数的地址(返回一个指针) |
not | 逻辑取反或按位取反 |
乘除及按位运算符 | |
* | 相乘或集合交集 |
/ | 浮点相除 |
div | 整数相除 |
mod | 取模 (整数相除的余数) |
as | 程序运行阶段类型转换 (RTTI运算符) |
and | 逻辑或按位求和 |
shl | 按位左移 |
shr | 按位右移 |
加减运算符 | |
+ | 相加、集合并集、字符串连接或指针增加一个偏移量 |
- | 相减、集合差集或指针减少一个偏移量 |
or | 逻辑或按位或运算 |
xor | 逻辑或按位异或运算 |
关系及比较运算符(最低优先级) | |
= | 判断是否相等 |
<> | 判断是否不相等 |
< | 判断是否小于 |
> | 判断是否大于 |
<= | 判断是否小于或等于,或是否是一个集合的子集 |
>= | 判断是否大于或等于,或是否是一个集合的父集 |
in | 判断是否是集合成员 |
is | 判断对象是否类型兼容 (又一个RTTI运算符) |
七、集合运算符
集合运算符包括并(+)、差(-)、交(*)、成员检测(in),及一些关系运算符。要把一个元素添加到集合中,你可以采用集合并运算。下面是一个选择字体的Delphi 例子:
Style := Style + [fsBold]; Style := Style + [fsBold, fsItalic] - [fsUnderline];
另一种方法是利用标准过程Include 和Exclude,它们效率更高(但不能用于控件的集合类型属性,因为只能操纵一个元素):
Include (Style, fsBold);
从上面内容我们已经了解了Pascal 程序的基本布局,下面开始探究它的细节。先从预定义和自定义数据类型开始,然后是利用关键词组织编程语句。