我很难理解这个问题的答案。
提供以下代码:
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。在研究了这两个主题之后,我仍然对如何得出以下答案感到困惑。任何帮助将不胜感激。
答案 0 :(得分:0)
我相信这个问题会询问类型检查器是否“可以”/“无法”在编译时捕获逻辑错误。
类型检查器确定A,D有效且B无效(假设没有隐式转换),因此类型检查器可以确定这三个语句的有效性。
但是,对于C和E,有效性取决于j
的实际值(例如,它们在j == 1
时有效,在j == 100
时无效)。所以类型检查器无法确定C和E是否有效(因为“数组的下标范围被认为是其类型的一部分”)。
请注意,这些答案基于类型检查器无法确定/不关心j
的值范围的假设。某些语言(如Ada和Pascal)支持“范围”类型,因此这些类型的检查器原则上可以静态检查C(需要j
类型int range 1:30
)和E(要求j
类型int range 1:29
}有效。