2017-03-06 84 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

沒問題:)很高興幫助! –