首页 文章

Ada类型声明语义

提问于
浏览
1

我在大学读Ada . 今天我的教授向我们提出了一个问题 . 在下面的代码中有三种类型声明 . 第三个没有编译错误'缺少新' .

我假设'Type'关键字让编译器知道我们要定义一个存储类,所以我的问题是:

声明之间的语义差异是什么?
如果省略关键字Integer,Ada会在指定范围时采用通用整数类型吗?这似乎是一个明显而合乎逻辑的结果 . 此外,当关键字'Integer'在'range'之前是新的然后是必需的?

我希望这不是模棱两可的,我做了一些研究,但似乎无法找到一个确切的答案,或者我可能与Ada的新手很多,以了解我发现了什么 . 我真的很想了解下面发生的事情 .

with Ada.Text_IO; use ada.Text_IO;
    procedure any is
    type abc is new Integer range 1..10;
    num : abc;
    type def is range 1..10;
    num2 : def;
    type xyz is Integer range 1..10;
    num3 : xyz;
      begin
      num := 5;
      num2 := 6;
      num3 := 7;
 end any;

1 回答

  • 5

    在第一个声明中,您声明了一个与 Integer 不同的新类型,但是继承了它的一些属性(例如,原始函数和运算符,并不重要) .

    对于每个实际问题,类型 abcdef 在这种情况下在语义上是等效的 . 但是,如果您对基类型进行了原始操作,则会有所不同 .

    在这种情况下,您无法真正考虑范围的边界具有类型,但如果存在基本类型,则它们必须满足基本类型范围内的约束 .

    现在 xyz 只是不正确,而Integer在这里没有任何意义 . 它可能意味着两件事:

    • 你真的想声明一个从整数派生的新类型 . 在这种情况下,您错过了新关键字 .

    • 您想声明一个整数的子类型 . 就名称解析和静态类型匹配而言,子类型基本上等同于其基类型,但在执行时将具有不同的约束 .

    此外,当关键字'Integer'在'range'之前是新的然后是必需的?

    Integer 不是关键字,它是标准包中定义的类型 . 在这个宣言中

    type A is Integer range 1 .. 10;
    

    Integer 是对Ada不期望的类型的引用 . 它期望一个类型定义,或者一个基本类型 .

相关问题