符号和基本语法

转载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; 

原文地址:https://www.cnblogs.com/jshchg/p/2171680.html