【delphi11】delphi基础探索【二、 Delphi 的基本语法:变量声明、数据类型、控制语句】

一、变量声明

        在 Delphi 中,变量声明是一个重要的概念。变量可以在程序的不同部分声明,例如在全局范围、局部范围或在类的定义中。以下是 Delphi 中各种变量声明方式的详细介绍:

1. 全局变量声明

        全局变量在程序的单元(Unit)中声明,位于 interface 部分或 implementation 部分的 var 关键字之后。全局变量在整个单元中都可见。

unit UnitName;

interface

var
  globalVar1: Integer;
  globalVar2: String;

implementation

var
  globalVar3: Boolean;

end.

2. 局部变量声明

        局部变量在程序的特定部分(如过程或函数)内声明。它们只在声明它们的代码块内可见。

procedure MyProcedure;
var
  localVar1: Integer;
  localVar2: String;
begin
  // 这里可以使用 localVar1 和 localVar2
end;

3. 类型变量声明

        在定义类时,可以在类的定义中声明变量。这些变量作为类的属性存在。

type
  TMyClass = class
    private
      classVar1: Integer;
    public
      classVar2: String;
  end;

4. 记录(Record)变量声明

        在 Delphi 中,可以使用记录(Record)类型来声明复合变量。

type
  TPerson = record
    Name: String;
    Age: Integer;
  end;

var
  personVar: TPerson;

 

5. 数组变量声明

        数组是存储一系列同类型数据的变量。

var
  arrayVar: array[1..10] of Integer;

6. 动态数组变量声明

        动态数组的大小可以在运行时改变。

var
  dynamicArrayVar: array of Integer;

7. 枚举类型变量声明

        枚举类型允许声明一组命名的常量。

type
  TDays = (Mon, Tue, Wed, Thu, Fri, Sat, Sun);

var
  today: TDays;

8. 指针变量声明

        指针变量用于存储内存地址。

var
  ptrVar: ^Integer;

9. 集合类型变量声明

        集合类型用于存储不重复的元素集合。

type
  TNumbers = set of 1..10;

var
  numberSet: TNumbers;

10. 文件类型变量声明

        文件类型用于文件操作。

var
  fileVar: File;

11. Variant 类型变量声明

        Variant 类型是一种特殊的类型,可以存储不同类型的数据

var
  variantVar: Variant;

总结

        变量类型:

  1. 整型 (Integer, ShortInt, LongInt, Byte 等)

    • Integer:常用的整数类型,占用 4 个字节。
    • ShortInt:较小的整数,占用 1 个字节。
    • LongInt:较大的整数,占用 4 个字节。
    • Byte:无符号的小整数,占用 1 个字节。
  2. 浮点型 (Real, Double, Extended 等)

    • Real:单精度浮点数。
    • Double:双精度浮点数。
    • Extended:扩展精度的浮点数。
  3. 字符串类型 (String, Char)

    • String:字符串类型,用于存储文本。
    • Char:字符类型,存储单个字符。
  4. 布尔型 (Boolean)

    • Boolean:布尔类型,表示真 (True) 或假 (False)。
  5. 其他类型Variant, Array 等。

二、控制语句 

If 语句

if 条件表达式 then
begin
  // 条件为真时执行的代码
end
else
begin
  // 条件为假时执行的代码
end;

Case 语句 

case 变量 of
  值1: 执行语句1;
  值2: 执行语句2;
  ...
  else 执行默认语句;
end;

For 循环 

 

for 变量 := 初始值 to 结束值 do
begin
  // 循环体
end;

While 循环 

 

while 条件表达式 do
begin
  // 循环体
end;

Repeat-Until 循环 

repeat
  // 循环体
until 条件表达式;

总结 

        控制结构分为if类型和循环体结构,其中if判断控制有  if else  、 case等。而循环结构大致有五种下面为实例代码:

program LoopExample;

{$APPTYPE CONSOLE}

uses
  SysUtils, Generics.Collections;

var
  numbers: array[1..5] of Integer = (2, 4, 6, 8, 10);
  total, i, threshold: Integer;
  number: Integer;
  reversedNumbers: TList<Integer>;

begin
  // For 循环
  WriteLn('For 循环输出:');
  for i := 1 to Length(numbers) do
    WriteLn('numbers[', i, '] = ', numbers[i]);

  // While 循环
  threshold := 5;
  i := 1;
  WriteLn('While 循环,找到第一个大于 ', threshold, ' 的数字:');
  while (i <= Length(numbers)) and (numbers[i] <= threshold) do
    Inc(i);
  if i <= Length(numbers) then
    WriteLn('找到的数字: ', numbers[i]);

  // Repeat-Until 循环
  i := 1;
  total := 0;
  repeat
    total := total + numbers[i];
    Inc(i);
  until i > Length(numbers);
  WriteLn('Repeat-Until 循环,数组总和: ', total);

  // For-In 循环
  WriteLn('For-In 循环,翻倍数组元素:');
  for number in numbers do
    WriteLn(number * 2);

  // Foreach 循环(类似于 For-In)
  reversedNumbers := TList<Integer>.Create;
  try
    for number in numbers do
      reversedNumbers.Insert(0, number);
    WriteLn('Foreach 循环,逆序输出数组元素:');
    for number in reversedNumbers do
      WriteLn(number);
  finally
    reversedNumbers.Free;
  end;

  ReadLn;  // 等待用户按键
end.

        if和case的程序实例:

program MenuSystem;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  choice: Integer;

begin
  repeat
    // 显示菜单
    WriteLn('菜单系统');
    WriteLn('1. 打印消息');
    WriteLn('2. 检查数字');
    WriteLn('3. 退出');
    Write('请输入您的选择 (1-3): ');
    ReadLn(choice);

    // 主菜单逻辑
    case choice of
      1: 
        begin
          WriteLn('您选择了打印消息。');
          // 可以添加更多的 if 逻辑
        end;
      2: 
        begin
          Write('请输入一个数字: ');
          ReadLn(choice);
          // 嵌套 if 语句
          if choice < 0 then
            WriteLn('这是一个负数。')
          else if choice = 0 then
            WriteLn('数字是零。')
          else
            WriteLn('这是一个正数。');

          // 在 if 中使用 case
          if choice >= 0 then
          begin
            case choice of
              0: WriteLn('零是一个特殊的数字。');
              1..10: WriteLn('这个数字位于 1 到 10 之间。');
              else WriteLn('这个数字大于 10。');
            end;
          end;
        end;
      3: WriteLn('退出程序。');
    else
      WriteLn('无效选择,请输入 1 到 3 之间的数字。');
    end;
  until choice = 3;

  WriteLn('程序结束。');
  ReadLn;
end.

三、数据类型

标准类型

  1. 整数类型

    • ShortInt: 8 位有符号整数。大小:1 字节(32 位和 64 位)。
    • Byte: 8 位无符号整数。大小:1 字节(32 位和 64 位)。
    • SmallInt: 16 位有符号整数。大小:2 字节(32 位和 64 位)。
    • Word: 16 位无符号整数。大小:2 字节(32 位和 64 位)。
    • Integer: 32 位有符号整数。大小:4 字节(32 位和 64 位)。
    • Cardinal: 32 位无符号整数。大小:4 字节(32 位和 64 位)。
    • LongInt: 与 Integer 相同。大小:4 字节(32 位和 64 位)。
    • LongWord: 与 Cardinal 相同。大小:4 字节(32 位和 64 位)。
    • Int64: 64 位有符号整数。大小:8 字节(32 位和 64 位)。
    • UInt64: 64 位无符号整数。大小:8 字节(32 位和 64 位)。
  2. 浮点类型

    • Real: 与 SingleDouble 相同,根据平台和编译器设置而定。
    • Single: 单精度浮点数。大小:4 字节(32 位和 64 位)。
    • Double: 双精度浮点数。大小:8 字节(32 位和 64 位)。
    • Extended: 扩展精度浮点数。大小:10 字节(32 位),16 字节(64 位)。
    • Comp: 64 位浮点数。大小:8 字节(32 位和 64 位)。
    • Currency: 固定小数点,用于财务计算。大小:8 字节(32 位和 64 位)。
  3. 字符类型

    • Char: 16 位字符。大小:2 字节(32 位和 64 位)。
    • WideChar: 与 Char 相同。
    • AnsiChar: 8 位字符。大小:1 字节(32 位和 64 位)。
  4. 字符串类型

    • String: Unicode 字符串。大小:32 位系统中为 4 字节(指针大小),64 位系统中为 8 字节。
    • AnsiString: 非 Unicode 字符串。大小:与 String 相同。
    • WideString: 宽字符串,使用 COM。大小:与 String 相同。
    • ShortString: 长度有限的字符串。最大长度 255 字节。
  5. 布尔类型

    • Boolean: 布尔值。大小:1 字节(32 位和 64 位)。
    • ByteBool: 与 Byte 相同。
    • WordBool: 与 Word 相同。
    • LongBool: 与 LongInt 相同。
  6. 变体类型

    • Variant: 任何类型的数据。大小:16 字节(32 位),24 字节(64 位)。
    • OleVariant: 类似于 Variant,用于 OLE 自动化。大小与 Variant 相同。
  7. 指针类型

    • Pointer: 通用指针类型。大小:32 位系统中为 4 字节,64 位系统中为 8 字节。
  8. 其他类型

    • TDateTime: 日期和时间类型。大小:8 字节(32 位和 64 位)。

其他常用类型

  1. 集合类型

    • Set of [EnumType]: 枚举类型的集合。大小取决于枚举类型中元素的数量,最多可以有 256 个布尔值(最大 32 字节)。
  2. 枚举类型

    • EnumType: 用户定义的枚举。大小通常为 1 字节,但可能更大,取决于枚举值的数量。
  3. 记录(Record)类型

    • Record: 用户定义的复合类型,大小取决于包含的字段。
  4. 动态数组

    • Array of [Type]: 动态数组。数组指针的大小在 32 位系统中为 4 字节,在 64 位系统中为 8 字节,数组元素的总大小取决于元素类型和数量。
  5. 静态数组

    • Array [Range] of [Type]: 静态数组,大小取决于元素类型和数量。
  6. 文件类型

    • File, TextFile, BinaryFile: 文件操作类型。大小不固定,取决于文件内容和文件系统。
  7. 接口类型

    • Interface: COM 接口。指针大小在 32 位系统中为 4 字节,在 64 位系统中为 8 字节。
  8. 类类型

    • Class: 用户定义的类。类实例的大小取决于其字段和方法。
  9. 方法指针类型

    • Procedure/Function of object: 方法指针。大小通常在 32 位系统中为 8 字节,在 64 位系统中为 16 字节。
  10. 变体数组

    • Variant array: 动态变体类型的数组。大小取决于数组元素的数量和类型。
  11. GUID 类型

    • TGUID: 全局唯一标识符。大小固定为 16 字节。

总结:查看每种类型占用大小

program DataTypeSizes;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  TMyEnum = (meOne, meTwo, meThree);
  TMySet = set of TMyEnum;
  TMyRecord = record
    IntValue: Integer;
    StrValue: String;
  end;
  TMyArray = array[1..10] of Integer;
  TMyDynArray = array of Integer;

var
  ShortIntVar: ShortInt;
  ByteVar: Byte;
  SmallIntVar: SmallInt;
  WordVar: Word;
  IntegerVar: Integer;
  CardinalVar: Cardinal;
  LongIntVar: LongInt;
  LongWordVar: LongWord;
  Int64Var: Int64;
  UInt64Var: UInt64;
  SingleVar: Single;
  DoubleVar: Double;
  ExtendedVar: Extended;
  CompVar: Comp;
  CurrencyVar: Currency;
  CharVar: Char;
  WideCharVar: WideChar;
  AnsiCharVar: AnsiChar;
  StringVar: String;
  AnsiStringVar: AnsiString;
  WideStringVar: WideString;
  ShortStringVar: ShortString;
  BooleanVar: Boolean;
  ByteBoolVar: ByteBool;
  WordBoolVar: WordBool;
  LongBoolVar: LongBool;
  VariantVar: Variant;
  OleVariantVar: OleVariant;
  PointerVar: Pointer;
  DateTimeVar: TDateTime;
  MyEnumVar: TMyEnum;
  MySetVar: TMySet;
  MyRecordVar: TMyRecord;
  MyArrayVar: TMyArray;
  MyDynArrayVar: TMyDynArray;
  FileVar: File;
  TextFileVar: TextFile;
  BinaryFileVar: File of Byte;
  InterfaceVar: IInterface;
  ClassVar: TObject;
  MethodPointerVar: TMethod;
  VariantArrayVar: array of Variant;
  GUIDVar: TGUID;

begin
  // 初始化动态数组
  SetLength(MyDynArrayVar, 10);
  SetLength(VariantArrayVar, 10);

  // 打印各类型的大小
  WriteLn('ShortInt: ', SizeOf(ShortIntVar), ' bytes');
  WriteLn('Byte: ', SizeOf(ByteVar), ' bytes');
  WriteLn('SmallInt: ', SizeOf(SmallIntVar), ' bytes');
  WriteLn('Word: ', SizeOf(WordVar), ' bytes');
  WriteLn('Integer: ', SizeOf(IntegerVar), ' bytes');
  WriteLn('Cardinal: ', SizeOf(CardinalVar), ' bytes');
  WriteLn('LongInt: ', SizeOf(LongIntVar), ' bytes');
  WriteLn('LongWord: ', SizeOf(LongWordVar), ' bytes');
  WriteLn('Int64: ', SizeOf(Int64Var), ' bytes');
  WriteLn('UInt64: ', SizeOf(UInt64Var), ' bytes');
  WriteLn('Single: ', SizeOf(SingleVar), ' bytes');
  WriteLn('Double: ', SizeOf(DoubleVar), ' bytes');
  WriteLn('Extended: ', SizeOf(ExtendedVar), ' bytes');
  WriteLn('Comp: ', SizeOf(CompVar), ' bytes');
  WriteLn('Currency: ', SizeOf(CurrencyVar), ' bytes');
  WriteLn('Char: ', SizeOf(CharVar), ' bytes');
  WriteLn('WideChar: ', SizeOf(WideCharVar), ' bytes');
  WriteLn('AnsiChar: ', SizeOf(AnsiCharVar), ' bytes');
  WriteLn('String: ', SizeOf(StringVar), ' bytes');
  WriteLn('AnsiString: ', SizeOf(AnsiStringVar), ' bytes');
  WriteLn('WideString: ', SizeOf(WideStringVar), ' bytes');
  WriteLn('ShortString: ', SizeOf(ShortStringVar), ' bytes');
  WriteLn('Boolean: ', SizeOf(BooleanVar), ' bytes');
  WriteLn('ByteBool: ', SizeOf(ByteBoolVar), ' bytes');
  WriteLn('WordBool: ', SizeOf(WordBoolVar), ' bytes');
  WriteLn('LongBool: ', SizeOf(LongBoolVar), ' bytes');
  WriteLn('Variant: ', SizeOf(VariantVar), ' bytes');
  WriteLn('OleVariant: ', SizeOf(OleVariantVar), ' bytes');
  WriteLn('Pointer: ', SizeOf(PointerVar), ' bytes');
  WriteLn('TDateTime: ', SizeOf(DateTimeVar), ' bytes');
  WriteLn('TMyEnum: ', SizeOf(MyEnumVar), ' bytes');
  WriteLn('TMySet: ', SizeOf(MySetVar), ' bytes');
  WriteLn('TMyRecord: ', SizeOf(MyRecordVar), ' bytes');
  WriteLn('TMyArray: ', SizeOf(MyArrayVar), ' bytes');
  WriteLn('TMyDynArray: ', SizeOf(MyDynArrayVar), ' bytes');
  WriteLn('File: ', SizeOf(FileVar), ' bytes');
  WriteLn('TextFile: ', SizeOf(TextFileVar), ' bytes');
  WriteLn('BinaryFile: ', SizeOf(BinaryFileVar), ' bytes');
  WriteLn('Interface: ', SizeOf(InterfaceVar), ' bytes');
  WriteLn('Class: ', SizeOf(ClassVar), ' bytes');
  WriteLn('MethodPointer: ', SizeOf(MethodPointerVar), ' bytes');
  WriteLn('VariantArray: ', SizeOf(VariantArrayVar), ' bytes');
  WriteLn('TGUID: ', SizeOf(GUIDVar), ' bytes');

  ReadLn;
end.

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/242701.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2 接口测试实战演示

上一篇&#xff1a;1 接口测试介绍-CSDN博客 拿到开发提供的接口文档后&#xff0c;结合需求文档开始做接口测试用例设计&#xff0c;下面用最常见也最简单的注册功能介绍整个流程。 说明&#xff1a;以演示接口测试流程为主&#xff0c;不对演示功能做详细的测试&#xff0c;…

Jenkins离线安装部署教程简记

前言 在上一篇文章基于Gitee实现Jenkins自动化部署SpringBoot项目中&#xff0c;我们了解了如何完成基于Jenkins实现自动化部署。 对于某些公司服务器来说&#xff0c;是不可以连接外网的&#xff0c;所以笔者专门整理了一篇文章总结一下&#xff0c;如何基于内网直接部署Jen…

TDengine Kafka Connector将 Kafka 中指定 topic 的数据(批量或实时)同步到 TDengine

教程放在这里&#xff1a;TDengine Java Connector&#xff0c;官方文档已经写的很清晰了&#xff0c;不再赘述。 这里记录一下踩坑&#xff1a; 1.报错 java.lang.UnsatisfiedLinkError: no taos in java.library.pathat java.lang.ClassLoader.loadLibrary(ClassLoader.j…

SE考研真题总结(三)

继续更新&#xff0c;今天准备连出两期该系列~ SE考研真题总结&#xff08;二&#xff09;https://blog.csdn.net/jsl123x/article/details/134857052?spm1001.2014.3001.5501 目录 一.简答题 二.代码大题 一.简答题 1.工程和科学的区别 科学是关于事物的基本原理和事实的…

102基于matlab的PCA+ELM和PCA+PSO-ELM的费用估计

基于matlab的PCAELM和PCAPSO-ELM的费用估计&#xff0c;输出输出两者的预测误差并进行比较&#xff0c;输出优化后的迭代曲线。数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运行。 102matlab PCAPSOELM (xiaohongshu.com)

第16章 网络io与io多路复用select/pool/epool

第16.1节 写一个服务端代码 服务端代码 #include <stdio.h> #include <errno.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h>#include <fcntl.h>int main() {//openint sockfd sock…

大数据技术之Storm的安装与配置

大数据技术之Storm的安装与配置 这篇文章深入研究了大数据技术中实时计算系统 Apache Storm 的安装与配置过程。首先&#xff0c;文章介绍了 Apache Storm 在大数据处理中的重要性&#xff0c;强调其在实时数据处理领域的关键作用。随后&#xff0c;详细阐述了如何在系统中进行…

掌握Web、DNS、FTP、DHCP服务器的配置。掌握简单网络方案的规划和设计

1、Web服务器配置 2、综合设计 配置完后,所有的终端主机都要能够访问外网服务器,并进行测试。(本题可以自行选题,自行设计,但必须包含路由器、服务器(web、dns、DHCP、)、交换机及防火墙)。 3.做好规划并搭建拓扑图: 4.给PC机与服务器配置好IP,网关 5.给每个交换机…

【Spring】02 Bean 的命名

文章目录 1. 定义2. 使用优势3. 如何命名4. 注解驱动5. 最佳实践1&#xff09;使用明确的业务名词2&#xff09;避免缩写和首字母缩略词2&#xff09;不要过度使用别名 结语 在 Spring 框架中&#xff0c;Bean 是应用程序中的主要组件&#xff0c;负责承载和管理应用的核心功能…

bugku -- eval

<?phpinclude "flag.php";$a $_REQUEST[hello];eval( "var_dump($a);");show_source(__FILE__); ?> //这段代码包含了一个PHP脚本。首先&#xff0c;它包含了一个名为"flag.php"的文件。然后&#xff0c;它定义了一个变量$a&#xff0c…

SpringBootWeb入门、HTTP协议、Web服务器-Tomcat

目录 一、SpringBootWeb入门 二、HTTP协议 HTTP-请求协议 HTTP-响应协议 HTTP-协议解析 三、Web服务器-Tomcat 服务器概述 Tomcat 一、SpringBootWeb入门 直接基于SpringFramework进行开发&#xff0c;存在两个问题&#xff1a;配置繁琐、入门难度大 通过springboot就…

MATLAB读写txt文件数据与进制转换

文章目录 前言读txt文件读txt中的十进制数据到MATLAB读txt数据的其他进制数据转为十进制到MATLAB读txt内容到MATLAB 写txt文件总:将MATLAB生成的10进制数据转换成十进制和radix进制写入txt分:将MATLAB中十进制数据以radix进制数据格式写入txt文件分:将MATLAB中十进制数据写入tx…

gRPC-Gateway:高效转换 RESTful 接口 | 开源日报 No.105

grpc-ecosystem/grpc-gateway Stars: 16.4k License: BSD-3-Clause gRPC-Gateway 是一个遵循 gRPC HTTP 规范的 gRPC 到 JSON 代理生成器。它是 Google 协议缓冲编译器 protoc 的插件&#xff0c;可以读取 protobuf 服务定义并生成反向代理服务器&#xff0c;将 RESTful HTTP…

linux下配置vscode中的ros的c++调试

第一步 这块是launch.json {"version": "0.2.0","configurations": [{"name": "g - 生成和调试活动文件","type": "cppdbg","request": "launch","program": "${wo…

Facebook运营技巧详解,Facebook多店铺如何运营?

在前不久的文章中就讲过Facebook养号和广告的投放技巧&#xff0c;今天东哥就趁热打铁来接着讲讲Facebook的运营技巧&#xff0c;现在做外贸和跨境电商的人基本上都用过Facebook&#xff0c;像在流量这么庞大的平台上想要抓住更多机遇&#xff0c;懂得一些运营技巧是必不可少的…

解决前端VUE前端框架报错Error: error:0308010C:digital envelope routines::unsupported的几种方法

一、报错信息&#xff1a; Error: error:0308010C:digital envelope routines::unsupportedat new Hash (node:internal/crypto/hash:67:19)at Object.createHash (node:crypto:135:10)at module.exports (E:\Projects\platform-code\platform-cloud\ruoyi-ui\node_modules\we…

鸿蒙开发之页面与组件生命周期

一、页面间的跳转 创建文件的时候记得选择创建page文件&#xff0c;这样就可以在main->resources->profile->main_pages.json中自动形成页面对应的路由了。如果创建的时候你选择了ArkTS文件&#xff0c;那么需要手动修改main_pages.json文件中&#xff0c;添加相应的…

缓存雪崩问题与应对策略

目录 1. 缓存雪崩的原因 1.1 缓存同时失效 1.2 缓存层无法应对高并发 1.3 缓存和后端系统之间存在紧密关联 2. 缓存雪崩的影响 2.1 系统性能下降 2.2 数据库压力激增 2.3 用户请求失败率增加 3. 应对策略 3.1 多级缓存 3.2 限流与降级 3.3 异步缓存更新 3.4 并发控…

OpenHarmony应用开发——更改应用名称和图标

一、前言 相比其他&#xff0c;可能学者更希望学到的就是更改应用名称和图标&#xff0c;当一个自己的程序运行在手机上的时候&#xff0c;或许更有成就感...... 二、详细步骤 首先&#xff0c;我们要先找到声明应用图标和应用名称的地方。如下图所示&#xff0c;在entry ->…

互联网,我们的虚拟世界

同学们&#xff0c;你们知道互联网是干什么的吗&#xff1f;它就像一个虚拟的世界&#xff0c;让我们能够连接到任何地方&#xff0c;获取任何信息&#xff0c;就像你现在正在通过互联网阅读我的文章一样。 互联网 你们有没有想过&#xff0c;如果没有互联网&#xff0c;我们的…