2017-03-06 80 views
1

我正在大学攻读Ada。今天,我的教授向我们提出了一个问题。在下面的代码中有三个类型声明。第三个不会编译错误“缺少新的”。Ada类型声明语义

我假设的“类型”关键字让编译器知道我们即将定义的存储类,所以我的问题是:

哪些声明之间的语义差别?
如果省略关键字Integer,那么Ada在指定范围时是否采用通用整数类型?这似乎是一个明显而合乎逻辑的结果。此外,当“范围”之前的关键字“整数”是新的,那么是否需要?

我希望这不是模棱两可的,我做了一些研究,但似乎无法找到确切的答案,或者我很想与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

关于'Integer'的更多单词:回答时,调用'Integer'关键字可能有点混乱,因为它只是一个名称,而关键字通常保留用于语法本身,或者除了命名之外的其他特殊用途。 **类型**和**结束**属于这种类型。 Integer是Ada库中定义的完美正常子类型的名称。这个'Integer'类型通常用于其他库子程序。所以,像'def'这样定义类型就是正确的。 – B98

回答

5

在第一个声明,您声明一个新的类型,从Integer不同,但是从它继承几个属性(基本功能和运营商,例如,这不是问题)。

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

在这种情况下,您不能真正考虑范围的边界类型,但如果存在基本类型,它们必须满足在基本类型范围内的约束条件。

现在xyz只是不正确的,Integer在这里并不意味着什么。这可能意味着两件事之一:

  • 你真的想声明一个从整数派生的新类型。在这种情况下,你错过了新的关键字。
  • 你想声明一个整型的子类型。就名称解析和静态类型匹配而言,子类型基本上等同于其基本类型,但在执行时会有不同的约束。

此外,当关键字'整数'之前'范围'是新的然后需要?

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

type A is Integer range 1 .. 10; 

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

+0

感谢您花时间解释这一点以及清理。我在同一时间误解了几件事情,所以这很有帮助。 –

+0

没问题:)很高兴帮助! –