在编译时检查完全类型

时间:2016-05-04 15:57:52

标签: compiler-errors runtime-error typechecking

我很难理解这个问题的答案。

提供以下代码:

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

对于下面的每个赋值语句,circle可以或不可以说是否可以在编译时对其进行完全类型检查。假设数组的下标范围被认为是其类型的一部分。假设数字溢出不被视为类型错误。

 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。在研究了这两个主题之后,我仍然对如何得出以下答案感到困惑。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我相信这个问题会询问类型检查器是否“可以”/“无法”在编译时捕获逻辑错误。

类型检查器确定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}有效。