当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Ada-用于递增范围结束的任何已定义行为?》经验,为你挑选了1个好方法。

如果我将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)

超出范围的例外

未定义的行为

别的什么?

morido.. 5

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

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

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



1> morido..:

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

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

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


请注意,在过去(pre ada2012?)中,没有开关-gnato的gnat编译器将不会检测到溢出(换句话说,它不是没有该开关的符合Ada编译器).
推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有