在Pascal中使用TYPE关键字
我试图理解pascal中关键字在Pascal中使用TYPE关键字,pascal,Pascal,我试图理解pascal中关键字TYPE的定义。我知道C中的typedef只是给类型起了一个新名称(alasing)。但据我所知,Pascal中的TYPE并不是这样工作的。它将创建一个新的唯一类型 我试图搜索并创建一个简单的示例,显示TYPE的机制。我试图创建一个创建一些类型和函数的示例。之后,每次它都将其中一个类型传递给该函数。它应该失败,因为函数应该只获得一个类型,这证明了这些类型不仅仅是别名。由于我缺乏帕斯卡语法的知识,我每次都失败了 你能分享一个简单的简短程序来证明类型的威力吗 编辑: 我
TYPE
的定义。我知道C中的typedef
只是给类型起了一个新名称(alasing)。但据我所知,Pascal中的TYPE
并不是这样工作的。它将创建一个新的唯一类型
我试图搜索并创建一个简单的示例,显示TYPE
的机制。我试图创建一个创建一些类型和函数的示例。之后,每次它都将其中一个类型传递给该函数。它应该失败,因为函数应该只获得一个类型,这证明了这些类型不仅仅是别名。由于我缺乏帕斯卡语法的知识,我每次都失败了
你能分享一个简单的简短程序来证明类型的威力吗
编辑:
我创建了以下示例:
program Check;
TYPE
Meters = Real; Seconds = Real;
VAR
m: Meters; s: Seconds;
Procedure PRINT_SEC(s: Seconds);
Begin
WriteLn(s, ' sec');
end;
Begin
PRINT_SEC(s);
PRINT_SEC(m);
end.
输出:
0.0000000000000000E+000 sec
0.0000000000000000E+000 sec
但为什么它没有失败呢?我通过了m
哪个类型的Meters
否?另外,如何初始化这些变量?像m
和s
这样的变量是由类型定义的。在这种情况下,这两种类型都源自real
类型。这称为类型别名
。它们作为类型和赋值都是兼容的
如果需要不同的类型(在Freepascal和delphi中),请定义:
type Seconds = type real;
这将使打印过程只接受Seconds
type参数。请注意,声明为不同类型的Seconds
和Meters
变量仍然与赋值兼容
要初始化变量,只需指定一个值:
s := 42.0;
注意:大多数类型都以T
开头命名。如t秒
。只是为了将它们与变量区分开来。这是一种常见的约定(在pascal中)。首先,在pascal中,关键字类型不创建类型。关键字TYPE必须出现在类型定义之前,但可以创建类型的是类型定义。并非所有类型定义都创建类型
Pascal标准规定如下:
A type-definition shall introduce an identifier to denote a type.
这意味着类型定义引入(即创建或重新定义)一个标识符,该标识符表示(即是)一个类型的别名
Pascal标准将类型定义定义为:
type-definition = identifier '=' type-denoter
type-denoter = type-identifier | new-type
new-type = new-ordinal-type | new-structured-type | new-pointer-type
这意味着类型定义是一个标识符,后跟等边,后跟类型表示符。类型表示器是类型标识符或新类型
因此,类型标识符引入一个标识符,该标识符表示(即是)另一个类型标识符或新类型。只有在类型表示器是新类型的情况下,才会创建类型
在你的例子中:
TYPE
Meters = Real; Seconds = Real;
两种类型定义中的类型表示器都是类型标识符Real,因此米和秒都是Real的别名
是的,在Pascal中,Real不是一个类型,它是Real类型的内置类型标识符
帕斯卡标准说
所需类型标识符real应表示实际类型
因此,real实际上是一个类型标识符,而不是一个类型。似乎存在一个不可见的类型定义
TYPE
Real = real-type;
其中实型就是实型。@MartynA我正在学习PLs的概念。我只是想理解TYPE
的概念,以及为什么它不是alasing
@MartynA请查看我的示例。请注意,pascal中的类型系统比C演化得多。碰巧你触发了一个简便的“别名”,但试着定义一个真正不同的类型,如(红心、黑桃、钻石、梅花)
(这是一个枚举).ISTM表示,typeA=typeB;
不适用于所有Pascal。仅适用于、AFAIK、Delphi和FreePascal。t前缀约定也适用于Delphi/FreePascal,而不适用于Pascal。后来Turbo Pascal至少在任何地方都有t符号。可能是因为Turbo Vision与C进行了移植/代码共享。@Marco:Turbo Pascal不是general Pascal。除了Turbo Pascal、Delphi或FreePascal或compatibles(PascalScript等)之外,还有其他Pascal实现。我知道(FPC-Miso,记得吗?)。只是想确保包含TP,因为即使是现在,它的使用可能仍然比其他组合的要小。