转自 http://www.cnblogs.com/Bubalus/archive/2011/03/01/2013713.html
空格(#32)和控制符(#0 到#31,其中#13 叫回车符或行的结束符)被称为空白符(blank)。
特殊符号是非文字和数字字符,或这类字符的组合,它们有固定的意义。
‘[’相当于‘(.’,‘]’相当于‘.)’;‘(*’和‘*)’分别相当于‘{’和‘}’(表示注释)。
,!(惊叹号)、 ”(双引号)、 %(百分号)、 ?(问号)、 \(反斜杠)、 _(下划线)、 |(通道)和 ~(破折
号)不是特殊符号
$前缀表示一个16 进制数字,比如$8F
标签是一个不超过4 位的阿拉伯数字序列,也就是从0 到9999,打头的0 没有意义
。若单引号中没有内容(’’),它被称为空串(null string)。在一个引用串中,两个连续的单引号(’’)表示一个字 符,也就是单引号本身(’)控制串由一个或多个控制字符(控制符)所组成,每个控制符包含一个#,后跟一个无符号整数(10
进制或16 进制),整数的范围从0 到255,表示相应的ASCII 字符。下面的控制串
#89#111#117
就相当于引用串
’You’
运算符包括:@ not ^ * / div mod and shl shr as + - or xor = > < <> <= >= in 和 is。
一些运算符的行为因为传给它们的数据类型不同而不同。比如,not 运算符用于整数时,是对它的
位进行求反运算,而对布尔类型进行逻辑非运算。
除了 ^ ,is 和 in,其它运算可应用在Variant 类型上。
• 不管x 和y 的类型是什么,x/y 的结果总是扩展类型(extended);对其它运算符,只要有一个
运算数是实数类型,它的结果就是扩展类型;另外,只要有一个运算数是Int64 类型,它的结果就是Int64 类型;否则
,结果就是整数类型。如果一个运算数是整数的子界类型,它就像整数类型一样被对待。
• x div y 的值取整数,也就是取得x/y 的值,然后以0 的方向取得最近的整数。
• mod 运算返回对运算数进行整数除后得到的余数。换句话说,就是x mod y = x - (x div y)*y。
布尔运算符not、and、or 和xor 作用于任何布尔类型的运算数,并返回一个布尔类型的值。
使用 $B 编译器指示字控制计算方式,默认状态是 {$B-},它采用部分计算。要在局部进行完全计
算,在代码中使用 {$B+} 指示字。你也可以在Compiler Options 对话框中选择Complete Boolean
Evaluation 选项,此时在整个项目范围使用完全计算。
<Leo>///部分计算 equals 短路计算 in C++/C#
若任何一个运算数是variant 类型,编译器总是进行完全计算(即使在 {$B-} 状态下)
Logical (bitwise) operators(位逻辑运算符):not and or xor shl shr
• 位反(not)运算的返回类型和运算数相同;
• 若and、or 或xor 的运算数都是整数类型,则它的返回类型是包含运算数所有可能的值、且范围最小的预定义(内置)整数类型;• 运算 x shl y 和 x shr y 把 x 的值向左或向右移 y 个位,也就等同于 x 乘或除以 2^y(2的 y 次方),返回类型 和 x 相同。比如,若 N 存储的是01101(10 进制的13),那么 N shl 1 返11010(10 进制26)。注意,y 的值被解释为对 x 所属类型大小(位数)进行模运算,比如,若 x 是一个integer,x shl 40 被解释为 x shl 8,因为integer的大小是32 位(4字节),40 mod 32 等于8。
关系运算符 =、<>、<、>、<= 和 >= 都能对字符串进行操作 + 运算符连接两个字符串
• + 运算符的运算数可以是字符串、packed string(packed arrays of type Char)或字符。但是,若其中一个运算数
是宽字符(WideChar)类型,其它运算数必须是长字符串。
• + 运算符的返回结果和任何字符串类型是兼容的。但是,若运算数都是短字符串或字符,并且它们的组合长度大于255
,则返回结果取前面的255 个字符。
关系运算符 <、>、<= 和 >= 能对PChar 类型进行操作。其它的指运算符:+- 指针加减 ^ 取得指针所指的内容 = <>
等于 不等于
对于Pointer 类型,在dereference 之前必须进行类型转换。
• 若I 是一个整数,P 是一个字符指针,那么P + I 是把P 的地址加上I,也就是一个指向P 后面
第I 个字符处的指针(表达式I + P 等同于P + I);P ? I 是把P 的地址减去I,也就是一个指向P
前面第I 个字符处的指针。
• 若P 和Q 都是字符指针,那么P ? Q 计算P 的地址(高地址)和Q 地址(低地址)之差,也就
是返回一个表示P 和Q 之间字符数目的整数。P + Q 没有意义。
Set operators(集合运算符):
+并集 - 差集 * 交集 <= 小于等于(子集)>= 大于等于(超集) =等于 <>不等于 in 成员关系
以下规则适用于 +、? 和 * 运算符:
• 当且仅当序数(集合基础类型中的一个值)O 属于集合X 或集合Y(或同时属于X 和Y)时,
O 属于X + Y;当且仅当O 属于X 但不属于Y 时,O 属于X ? Y;当且仅当O 同时属于X 和Y
时,O 属于X * Y。
• +、? 和 * 的运算结果属于集合类型set of A..B,这里A 是结果中的最小序数,B 是结果中的
最大序数。
以下规则适用于 <=、>=、=、<> 和 in 运算符:
• 只有当X(集合)中的每个成员也是Y(集合)中的成员时,X <= Y 才为真;Z >= W 等同于
W <= Z;只有当U(集合)和V(集合)正好拥有相同的成员时,U = V 才为真,否则U <> V
为真;
• 对于序数O 和集合S,只有当O 是S 的一个成员时,O in S 才为真。
• 除了实数和整数能一起比较外,两个运算数必须是兼容的类型;
• 对字符串进行比较,是依据它的每个字符在扩展ASCII 字符集中的顺序,字符类型被当作长度
为1 的字符串;
• 两个packed string 要进行比较,它们必须具有相同数目的元素;一个具有n 个元素的packed string
与一个字符串比较时,它被看作长度为n 的字符串;
• 只有当两个PChar 指针都指向同一个字符数组的范围内时,<、>、<= 和 >= 运算符才能作用
于它们;
• 运算符 = 和 <> 能以类或类引用类型作为运算数。当用于类类型时,= 和 <> 的计算规则与
指针一样,只有当C 和D 指向同一个实例对象时,C = D 为真,否则C <> D 为真;当用于类
引用时,只有当C 和D 表示同一个类时,C = D 为真,否则C <> D 为真。
as 和 is 运算符使用类和对象(实例)作为运算数,as 也用于接口类型。
@ 运算符返回一个变量、函数、过程或方法的地址,也就是说,@ 运算符构建一个指向运算数的
指针。
• 若X 是一个变量,@X 返回X 的地址(当X 是一个过程类型的变量时有特殊的规则,请参考语
句和表达式中的过程类型)。若默认的编译器指示字 {$T?} 在起作用,则@X 的类型是
Pointer(通用指针);在 {$T+} 状态下时,@X 的类型是 ^T,这里T 是X 的类型;
• 若F 是一个例程(一个函数或过程),@F 返回F 的入口点,@F 的类型总是Pointer;
• 当 @ 作用于类的方法时,必须使用类名来限定方法名。比如
@TMyClass.DoSomething
它指向TMyClass 的DoSomething 方法。
Set constructors(集合构造器)
[5, 6, 7, 8]
[ 5..8 ]
[red, green, MyColor]
[1, 5, 10..K mod 12, 23]
[’A’..’Z’, ’a’..’z’, Chr(Digit + 48)]
集合构造器[]表示空集
字符串、数组、数组属性以及指向字符串或数组的指针能被索引。比如:FileName[21]
强制类型转换的语法是
typeIdentifier(expression)
若表达式是一个变量,结果被称为variable typecast(变量转换);否则,结果是一个value typecast(值转换)。虽
然它们的语法相同,但它们有不同的转换规则。
在值转换中,类型标志符和转换的表达式必须都是有序类型或指针类型。值转换的例子包括
Integer(’A’)
Char(48)
Boolean(0)
Color(2)
Longint(@Buffer)
声明的语法以及声明的位置取决于要定义的标志符的种类。通常,声明只能出现在块(block)的开始处,
以及单元的接口或实现部分的开始处(在uses 子句之后)。
Hint 指示字platform、deprecated 和library 能附加在任何声明之后。在声明过程或函数的情况下,应
使用分号把hint 指示字和声明的其它部分分开。比如:
procedure SomeOldRoutine; stdcall; deprecated;
var VersionNumber: Real library;
type AppError = class(Exception)
...
end platform;
当源代码在{$HINTS ON} {$WARNINGS ON}状态下编译时,对使用上述指示字声明的标志符的每个引
用都将产生一个适当的提示或警告。使用platform 标记一个条目和特定的操作系统(比如Windows 和
Linux)相关;使用deprecated 表示条目已经废弃或支持它仅为了向后兼容性;使用library 表示依赖于
特定的库或组件框架(比如VCL 或CLX)。
赋值语句的格式如下
variable := expression
这里,variable 是任何变量引用,包括变量、变量类型转换、解除引用的指针,或者一个结构变量的组
成部分;expression 是任何一个赋值兼容的表达式。(在函数块中,variable 能被函数名取代,参考Procedures
and functions。
当启用扩展语法时({$X+}),调用函数也可以像调用过程那样 当这样调用函数时,它的返回值被忽略。
goto label
label: statement
label label;
label label1, ..., labeln;
• 复合语句或with 语句只是简单地执行一系列语句;
• 条件语句,也就是if 或case 语句,根据指定的标准,最多执行一个分支;
• 循环语句,包括repeat、while 和for 循环,重复执行一系列语句;
• 一组特殊的语句,包括raise、try...except 和try...finally 结构,用来创建和处理异常。
with 语句的语法是
with obj do statement
或
with obj1, ..., objn do statement
if 语句有两种形式:if...then 和if...then...else
比如,
if J = 0 then
Exit
else
Result := I/J;
if J <> 0 then
begin
Result := I/J;
Count := Count + 1;
end
else if Count = Last then
Done := True
else
Exit;
Case Statements(Case 语句):
case selectorExpression of
caseList1: statement1;
...
caseListn: statementn;
else
statements;
end
case I of
1..5: Caption := ’Low’;
6..9: Caption := ’High’;
0, 10..99: Caption := ’Out of range’;
else
Caption := ’’;
end;
selectorExpression 是任何一个有序类型的表达式(字符串无效),和C++一样的。
。Object Pascal 有三种循环:repeat 语句、while 语句和for 语句。
使用Break 和Continue 过程来控制repeat、while 或for 语句的流程。
repeat 语句的语法是
repeat statement1; ...; statementn; until expression
比如:
repeat
Write(’Enter a value (0..9): ’);
Readln(I);
until (I >= 0) and (I <= 9);
while 语句的语法是
while expression do statement
比如:
while I > 0 do
begin
if Odd(I) then Z := Z * X;
I := I div 2;
X := Sqr(X);
end;
for 语句的语法是
for counter := initialvalue to finalvalue do statement
或
for counter := initialvalue downto finalvalue do statement
比如:for C := Red to Blue do Check(C);
一个块包含一系列的声明,后面跟一个符合语句。所有的声明必须一起出现在块的开始处,所以,块的
形式是
declarations;
begin
statements;
end;
比如:
function UpperCase(const S: string): string;
var
Ch: Char;
L: Integer;
Source, Dest: PChar;
begin
...
end;