2016-05-04 94 views
0

我很難理解這個問題的答案。在編譯時檢查完整類型

給下面的代碼:

int: size, size2, j; 
float: x; 
array[1:30] of int: nums; 

對於下面的每個賦值語句,循環能或不能說是否能或不能完全在編譯時類型檢查。假設一個數組的下標範圍被認爲是它的類型的一部分。假定數字溢出不被視爲類型錯誤。

A. size = size2 + 1; --> Answer: CAN 
B. x = size; --> Answer: CAN 
C. nums[j] = 33; --> Answer: CANNOT 
D. nums[3] = nums[4]; --> Answer: CAN 
E. nums[j] = nums[j+1]--> Answer: CANNOT 

現在,編譯程序被轉換成機器代碼的程序的執行期間發生的運行時間錯誤,其中當發生時間錯誤。我還閱讀了關於編譯與運行時錯誤的以下堆棧溢出問題:Runtime vs Compile time。在研究了這兩個主題之後,我仍然對如何得出以下答案感到困惑。任何幫助將非常感激。

回答

0

我相信問題是否問題在編譯時詢問類型檢查器「can」/「can not」是否捕獲邏輯錯誤。

類型檢查器肯定知道A,D是有效的,B是無效的(假設沒有隱式轉換),所以類型檢查器可以確定這三個語句的有效性。

但是,對於C和E,有效性​​取決於j的實際值(例如,它們在j == 1時有效且在j == 100時無效)。所以類型檢查器不能確定C和E是否有效(因爲「數組的下標範圍被認爲是其類型的一部分」)。


注意,這些答案都是基於這樣的假設類型檢查不能確定/不關心的j的取值範圍。一些語言如AdaPascal支持「範圍」類型,因此這些類型檢查器原則上可以靜態檢查C(要求j的類型爲int range 1:30)和E(要求的j的類型爲int range 1:29)是否有效。