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 后,我应该期望发生什么?
- 环绕 (idx = 1)
- 超出范围异常
- 未定义的行为
- 还有别的吗?
您的程序将失败并显示 CONSTRAINT_ERROR
。但是,这并不是因为您最终尝试将 idx
设置为 1001。而是它的初始值 0 也不在您预定义的范围内。值得庆幸的是,编译器会在编译时就此事实向您发出警告。
如果您已将 idx
设置为允许的值,然后以编译器无法静态检测的方式将其递增到超过其上限,将再次引发 CONSTRAINT_ERROR
(但不会在编译时有任何提示)。
这个错误在技术上是一个 exception,您可以像该语言中的任何其他异常一样处理它。
注意:我特意链接到上面古老的 Ada '83 规范,以表明这种行为从一开始就是语言的一部分。
如果我将 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 后,我应该期望发生什么?
- 环绕 (idx = 1)
- 超出范围异常
- 未定义的行为
- 还有别的吗?
您的程序将失败并显示 CONSTRAINT_ERROR
。但是,这并不是因为您最终尝试将 idx
设置为 1001。而是它的初始值 0 也不在您预定义的范围内。值得庆幸的是,编译器会在编译时就此事实向您发出警告。
如果您已将 idx
设置为允许的值,然后以编译器无法静态检测的方式将其递增到超过其上限,将再次引发 CONSTRAINT_ERROR
(但不会在编译时有任何提示)。
这个错误在技术上是一个 exception,您可以像该语言中的任何其他异常一样处理它。
注意:我特意链接到上面古老的 Ada '83 规范,以表明这种行为从一开始就是语言的一部分。