程序首部的参数Input和Output是什么意思?
它们代表默认输入输出设备,但它们只在老式的Pascal语言中有存在意义。在Borland/Turbo Pascal和Free Pascal中,程序首部不需要任何参数,但为了兼容旧式的Pascal程序,编译器会忽略程序首部的所有参数。
如何获得函数返回值的地址?
在Borland/Turbo Pascal中,只能通过函数名来设置函数返回值,编译器并不提供获取函数返回值地址的方法。虽然也可以通过底层的方法来获得函数返回值的地址,但该方法不适合在信息学奥林匹克中使用。在Free Pascal中,如果使用Turbo Pascal语法,则和Borland/Turbo Pascal一样,如果使用Object Pascal语法,则可以通过使用标识符Result来像变量一样访问函数返回值,@Result返回的就是函数返回值地址。
数值参数、变量参数和常量参数有什么区别?
数值参数、变量参数和常量参数代表三种不同传递方式的子程序参数类型,它们分别用于不同的场合,使用不同的参数类型会产生不同的子程序调用执行速度、栈空间占用量和传递效果。
子程序在调用时会在栈中为数值参数分配一块新的空间,并把实际参数的值赋给数值参数,然后数值参数就可以像局部变量一样使用。子程序结束后,数值参数所占用的栈空间会自动释放,数值参数的值的改变不会影响到实际参数。数值参数可接受的实际参数为:常量、表达式和变量。
子程序在调用时会在栈中为变量参数分配四个字节的空间,并把实际参数的地址赋给这四个字节,对变量参数的访问就是通过该四个字节组成的指针来对实际参数进行访问,其访问速度比数值参数慢一些。子程序结束后,这四个字节的空间就会自动释放,变量参数的值的改变等价于实际参数的值的改变。变量参数可接受的实际参数为:变量。
对于常量参数,子程序在调用时会根据其数据类型和大小来决定是分配一块新的空间来存放实际参数的值还是分配四个字节来存放实际参数的地址,其决定根据与实际参数是否变量无关。常量参数的访问类似于常量,只能获取它的值而不能进行赋值,唯一的例外是可以使用@操作符来获得常量参数的地址。常量参数可接受的实际参数为:常量、表达式和变量。
注意,由于文件类型比较特殊,文件类型的参数只能作为变量参数传递。
如何使两个子程序可以互相调用?
Pascal要求每个标识符在使用前必须预先定义,如果两个子程序要互相调用,那么就至少有一个子程序必须在其实现之前预先声明,即预定义子程序,这可以用保留字forward完成。forward用于预定义子程序,把它放在子程序首部的后面,那么这个子程序首部就预定义了一个子程序,而其具体的实现部分可以在其它地方给出。下面是一个简单的样例:
procedure ProcA; forward;
procedure ProcB;
begin
ProcA;
end;
procedure ProcA;
begin
ProcB;
end;
注意,forward不能用于预定义单元中已在接口部分声明的子程序。