Ada - 用于递增范围结束的任何已定义行为?

Cas*_*all 2 ada range

如果我将ADA中的范围定义为1 ... 1000,那么如果我增加超过1000,ADA规范是否存在已定义的行为?

例如:

type Index is range 1..1000;

idx : Index := 1;

procedure Increment is 
begin
  idx := idx + 1;
end
Run Code Online (Sandbox Code Playgroud)

一旦我用idx = 1000调用Increment,我应该发生什么?

  • 环绕(idx = 1)
  • 超出范围的例外
  • 未定义的行为
  • 别的什么?

mor*_*ido 5

你的程序将失败CONSTRAINT_ERROR.但是,这不是因为您最终尝试设置idx为1001.而是它的初始值0也不在您的预定义范围内.值得庆幸的是,编译器已经在编译时警告过你这个事实.

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

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

  • 请注意,在过去(pre ada2012?)中,没有开关-gnato的gnat编译器将不会检测到溢出(换句话说,它不是没有该开关的符合Ada编译器). (4认同)