Ada - 是否有任何已定义的递增超出范围的行为?

Ada - Any defined behavior for incrementing past end of range?

如果我将 ADA 中的范围定义为从 1 .. 1000,如果我递增超过 1000,ADA 规范是否有定义的行为?

例如:

type Index is range 1..1000;

idx : Index := 1;

procedure Increment is 
begin
  idx := idx + 1;
end

当我用 idx = 1000 调用 Increment 后,我​​应该期望发生什么?

您的程序将失败并显示 CONSTRAINT_ERROR。但是,这并不是因为您最终尝试将 idx 设置为 1001。而是它的初始值 0 也不在您预定义的范围内。值得庆幸的是,编译器会在编译时就此事实向您发出警告。

如果您已将 idx 设置为允许的值,然后以编译器无法静态检测的方式将其递增到超过其上限,将再次引发 CONSTRAINT_ERROR(但不会在编译时有任何提示)。 这个错误在技术上是一个 exception,您可以像该语言中的任何其他异常一样处理它。

注意:我特意链接到上面古老的 Ada '83 规范,以表明这种行为从一开始就是语言的一部分。