跳转到内容

Delphi 编程/数据类型

来自维基教科书,开放的书籍,开放的世界

首先,让我们定义一个类型

在 Delphi 中,像在 CVB 以及与 PHPPython 或其他现代语言不同的是,一个变量是类型化的,并且只能包含此类型的值。为了简单起见,类型是变量的一个属性。

基本类型

[编辑 | 编辑源代码]

Delphi 在这方面非常完善。存在许多预定义类型,您也可以创建自己的类型(我们将在后面看到)。以下是一张包含最有用基本类型(也称为原始类型)的表格

类型 描述 大小
boolean boolean 1 位 True/False
char 字符 1 字节 ASCII 表(或 ANSI)中的一个项
string 字符序列 取决于其字符数 ASCII 表(或 ANSI)项的动态表
integer 正整数或负整数 4 字节 -2147483648 2147483647
cardinal 无符号整数 4 字节 0 4294967295
real(等效于 double) 实数 8 字节 5.0 x 10^-324 1.7 x 10^308
备注:以上仅是最流行的预定义类型。仅针对整数类型就有数十种其他类型(smallint、longint、int64...),它们的用途满足非常具体的需要(例如我们将放入的数据的大小),从而优化了内存使用。有关此方面的更多信息,请参阅 Delphi 帮助内容中的文档。

一个 char(一个字符)类似于 '#', 'A', '2', ';', '.', '?' 等等。它在 char 库(ASCII)中有一个数字。在 Delphi 中,char 用两个单引号括起来。如果给定的字符是单引号本身,则应将该字符加倍,换句话说,您必须输入四个单引号。

var
  a, b: char;

begin
  a := 'H';  // a = "H"
  b := 'i';  // b = "i"
  WriteLn(a);  // Display "H"
  WriteLn(a, b);  // Display "Hi"
  WriteLn(a, b, '!');  // Display "Hi!"
end.

您已经在上一章中使用过字符串,例如 'Hello World' 或 'Hi there' 等等。字符串是 char 的序列。

 var
   text1: string;
   character1: char;

然后在 begin 和 end 之间写入

 character1 := 'H';
 text1 := 'ello World!';
 WriteLn(character1, text1);

如果要在字符串中写入单引号,最佳方法是键入两个连续的单引号

 text1 := 'I''m John Doe.';

字符串的行为类似于表格。可以使用索引访问字符

 text := 'Hello World!';
 WriteLn(text[1]); // Only print "H".

第一个索引是 1(而不是 0)。

文本表达式

[编辑 | 编辑源代码]

可以使用 + 运算符链接字符串

 firstWord := 'Hello';
 secondWord := 'World';
 WriteLn(firstWord + ' ' + secondWord + '!');
 wholeText := firstWord + ' ' + secondWord + '!';

+ 运算符可以与不同类型的变量一起使用。根据类型,结果将具有不同的类型

  • string + string → string
  • string + char → string
  • char + char → string
  • char + string → string
  • string + number → 错误
  • number + string → 错误
  • number + number → number
  • number + char → 错误
  • char + number → 错误

整数是偶数,您可以编写

 a: Integer;

浮点数

[编辑 | 编辑源代码]

浮点数是十进制数。它们使用 浮点。您可以编写

 c: Real;   // Real is normally the same like Single
 a: Single;
 b: Double;
 d: Extended;

Extended 比 Real 更精确,但需要更多的主存储空间。

布尔值

[编辑 | 编辑源代码]

布尔值是一个逻辑值。它可以是 'True' 或 'False'。编写

 var
   a: Boolean;
 begin
   a := True;
   // or
   a := False;

但是,只有在您了解下一章中的条件结构时,布尔值才有意义。

数组是字符串、浮点数、整数或任何数据类型的集合。它也可以包含一个数组。在这种情况下,我们有一个具有多个维度的数组。您可以说

 a: array [from..to] of data_type;
  a: array [1..3] of string;

对于一维。对于二维

 a: array [fX..tX] of
    array [fY..tY] of data_type;

等等。数组的一个元素例如是

 a[1] := 'Hello '
 a[2] := 'World'
 a[3] := '!';
WriteLn(a[1],
         a[2],
         a[3]);

记录(在其他语言中也称为结构)表示一组异构数据。每个项目都是一个字段。记录类型声明指定每个字段的名称和类型。按照惯例,记录类型的名称以 "T" 开头。记录类型声明具有以下语法

type recordTypeName= record
listField1: type1;
 ...
listFieldn: typen;
end

例如,以下声明创建了一个名为 TDateRec 的记录类型。

type
  TDateRec = record
    Year: Integer;
    Month: (Jan, Feb, Mar, Apr, May, Jun,
            Jul, Aug, Sep, Oct, Nov, Dec);
    Day: 1..31;
  end;

每个 TDateRec 包含三个字段:一个名为 Year 的整数值、一个名为 Month 的枚举值以及另一个介于 1 和 31 之间的名为 Day 的整数值。标识符 Year、Month 和 Day 是 TDateRec 字段的名称,其行为类似于变量。但是,TDateRec 类型声明不会为 Year、Month 和 Day 字段分配内存。当您实例化一个记录时,内存将被分配,您需要执行以下操作

var Record1, Record2: TDateRec;

变量声明创建了两个 TDateRec 实例,分别称为 Record1 和 Record2。

可以使用记录名称限定字段名称来访问记录字段

Record1.Year := 1922;
Record1.Month := Nov;
Record1.Day := 26;

或者使用 with 指令

with Record1 do
begin
  Year := 1922;
  Month := Nov;
  Day := 26;
end;

以下示例提出一个问题,获取答案并打印答案

 var
 _Input, _Linkage: string;
 begin
   WriteLn('Hello, what is your name?');
   ReadLn(_Input);
   _Linkage := 'Hello, ' + _Input;
   WriteLn(_Linkage);
 end.

ReadLn(_Input) 表示应用程序等待用户输入文本,然后将文本保存在变量 _Input 中。

以下另一个示例获取 ASCII 中字符的数字

 var
   number: Integer; // Declare number as an integer
   _Input: string;
   _Char1: char;
 begin
   WriteLn('Enter a char!');
   ReadLn(_Input);
   _Char1 := _Input[1];
   number := Ord(_Char1);
   WriteLn('ASCII is: ', number);
 end.

使用 _Input[1] 获取 _Input 的第一个字符。第一个字符是字符 1(不是像 C++ 中的字符 0!)

华夏公益教科书