我很难理解这个问题的答案。
提供以下代码:
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。在研究了两个主题之后,我仍然很困惑如何得出以下答案。任何帮助将非常感激。
最佳答案
我相信这个问题会问类型检查器“can”/“cannot”是否在编译时捕获逻辑错误。
类型检查器确定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
)是否有效。
关于compiler-errors - 在编译时进行全类型检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37032719/