2016-05-04 59 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)是否有效。