Types Ada类型声明语义

Types Ada类型声明语义,types,compiler-errors,declaration,ada,subtype,Types,Compiler Errors,Declaration,Ada,Subtype,我在大学里学艾达。今天我的教授向我们提出了一个问题。在下面的代码位中,有三个类型声明。第三个未编译,错误为“缺少新的” 我假设'Type'关键字让编译器知道我们要定义一个存储类,所以我的问题是: 声明之间的语义差异是什么? 如果省略关键字Integer,指定范围时Ada是否采用通用整数类型?这似乎是一个显而易见且合乎逻辑的结果。此外,如果关键字“Integer”在“range”之前是新的,那么是否需要 我希望这不是模棱两可的,我做了一些研究,但似乎找不到确切的答案,或者也许我是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;

在第一个声明中,您声明了一个新类型,与Integer不同,但是从它继承了一些属性,例如基本函数和运算符,这并不重要

对于每一个实际问题,在本例中abc和def类型在语义上是等价的。但是,如果在基类型上有基元操作,则会有所不同

你不能真正地认为,在这种情况下,范围的边界是有类型的,但是如果有一个基类型,它们必须满足在基类型范围内的约束。

现在xyz是不正确的,整数在这里没有任何意义。这可能意味着两件事之一:

您确实想要声明一个从integer派生的新类型。在这种情况下,您缺少新关键字。 您想要声明integer的子类型。就名称解析和静态类型匹配而言,子类型基本上等同于其基类型,但在执行时会有不同的约束。 此外,如果关键字“Integer”在“range”之前是新的,那么是否需要

Integer不是关键字,它是标准包中定义的类型。在本声明中

type A is Integer range 1 .. 10;

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

在第一个声明中,您声明了一个新类型,与Integer不同,但是从它继承了一些属性,例如基本函数和运算符,这并不重要

对于每一个实际问题,在本例中abc和def类型在语义上是等价的。但是,如果在基类型上有基元操作,则会有所不同

你不能真正地认为,在这种情况下,范围的边界是有类型的,但是如果有一个基类型,它们必须满足在基类型范围内的约束。

现在xyz是不正确的,整数在这里没有任何意义。这可能意味着两件事之一:

您确实想要声明一个从integer派生的新类型。在这种情况下,您缺少新关键字。 您想要声明integer的子类型。就名称解析和静态类型匹配而言,子类型基本上等同于其基类型,但在执行时会有不同的约束。 此外,如果关键字“Integer”在“range”之前是新的,那么是否需要

Integer不是关键字,它是标准包中定义的类型。在本声明中

type A is Integer range 1 .. 10;

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

感谢您花时间解释这一点并进行清理。我同时误解了一些事情,所以这很有帮助。没问题:很高兴它有帮助!感谢您花时间解释这一点,以及清理。我同时误解了一些事情,所以这很有帮助。没问题:很高兴它有帮助!关于Integer还有几句话:正如所回答的,将Integer称为关键字可能会有点混乱,因为它只是一个名称,而关键字通常是为语法正确或命名以外的其他特殊用途保留的。类型和结束是这种类型的。Integer是Ada库中定义的完全正常子类型的名称。此整数类型通常用于其他库子程序。所以,像您那样定义def这样的类型是正确的。关于Integer,再多说几句话:如您所回答的,将Integer称为关键字可能会有点混乱,因为它只是一个名称,而关键字通常是为语法正确或命名以外的其他特殊用途保留的。类型和结束是这种类型的。Integer是Ada库中定义的完全正常子类型的名称。此整数类型通常用于其他库子程序。所以,像您那样定义def这样的类型是正确的。