compiler-errors - 在编译时进行全类型检查

标签 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。在研究了两个主题之后,我仍然很困惑如何得出以下答案。任何帮助将非常感激。

最佳答案

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

类型检查器确定A,D有效并且B无效(假定没有隐式转换),因此类型检查器可以确定这三个语句的有效性。

但是,对于C和E,有效性​​取决于j的实际值(例如,当j == 1时有效,而当j == 100时无效)。因此,类型检查器无法确定C和E是否有效(因为“数组的下标范围被认为是其类型的一部分”)。

请注意,这些答案基于以下假设:类型检查器无法确定/不在乎j的值范围。诸如AdaPascal之类的某些语言支持“范围”类型,因此这些类型检查器原则上可以静态检查C(要求类型为jint range 1:30)和E(要求类型为jint range 1:29)是否有效。

关于compiler-errors - 在编译时进行全类型检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37032719/

相关文章:

asp.net-mvc-4 - 编译asp.net MVC 4 View /在编译时出错,不仅在第一次访问时

c++ - 错误 - 不能重载仅返回类型不同的函数。 C++

dictionary - 在 Julia 中检查复杂类型时规范不足

c++ - 删除时堆损坏[]

c - 浮点:invalid error turbo C

c++ - 如何只允许具有特定 value_type 的迭代器?

generics - java-8 中有界通配符的规则改变?

java - 如何将类型为byte []的对象转换为字符串

python - 属性错误: 'module' object has no attribute 'locals'

swift - MailComposeViewController 错误 : unexpectedly found nil