Exception 当比较Ada标量类型和子类型时,是否需要进行范围检查? 当比较Ada标量类型和受约束的子类型时,是否需要进行范围检查?
我知道,在从基类型到受约束子类型的赋值中,如果在赋值之前我不能确保该值在范围内,则在运行时我有可能出现范围检查异常 但在进行比较时是否也是如此?我认为,由于用户想要返回的唯一知识是布尔结果,因此不需要隐式转换到基类型或范围检查 请注意:我正在寻找一个引用 例子 到目前为止我所发现的。。。 我还没有找到完整的答案。但我确实发现了一些有趣的数据 离散类型的操作/它说:Exception 当比较Ada标量类型和子类型时,是否需要进行范围检查? 当比较Ada标量类型和受约束的子类型时,是否需要进行范围检查?,exception,types,ada,Exception,Types,Ada,我知道,在从基类型到受约束子类型的赋值中,如果在赋值之前我不能确保该值在范围内,则在运行时我有可能出现范围检查异常 但在进行比较时是否也是如此?我认为,由于用户想要返回的唯一知识是布尔结果,因此不需要隐式转换到基类型或范围检查 请注意:我正在寻找一个引用 例子 到目前为止我所发现的。。。 我还没有找到完整的答案。但我确实发现了一些有趣的数据 离散类型的操作/它说: --本章仅讨论如何定义类型和子类型 --这一章中有有趣的注释,但我不确定这一章或这一章中的任何其他内容是否相关 (31)对于离散
- --本章仅讨论如何定义类型和子类型
- --这一章中有有趣的注释,但我不确定这一章或这一章中的任何其他内容是否相关
S'Val(S'Pos(X)) = X
S'Pos(S'Val(N)) = N
- --这里没有关于类型和子类型的内容
- “现在,我认为黄金答案就在这里。但这并不是冲着我跳。我从中看到了一点线索
- --这个水平太高了。这里没有什么有用的
- --本节有很多关于类型的深刻信息,但仍然没有与比较类型和子类型相关的信息
我可能在搜索过程中错过了答案。但我在以某种方式寻找确凿的证据
抱歉读了这么长时间。您可能会发现带注释的ARM版本()很有用(注意,您的参考是未维护的AdaHome网站;首选) 子类型具有类型和可能的约束:
type T is ...;
subtype S1 is T; -- effectively a renaming of T
subtype S2 is T range ...; -- (added) constraints
子类型的操作与它的类型相同,这就是为什么您可以编写比较Day=Payday
,而无需转换。我们知道Workday_类型
是Day_类型
,因此我们可以直接进行比较
诚然,Workday\u Type(Day)=Payday
存在CE风险,但您或编译器不需要这样做。就像,操作是一种类型的操作,而子类型形成一种类型的值子集,而不是使用不同操作的不同类型
为说明,请考虑<代码> + > /代码>:
type N is range 0 .. 10;
X : constant N := N'Base'(-1) + N'(2);
许多Ada规则都适用,尽管IANALL,但我记得LLawyers强调规则的制定是为了在不引发异常的情况下产生数学(逻辑)正确的结果,即使某些操作似乎涉及的值超过了一个范围。这里面有个暗示。因此,我希望
关系型操作符
规则,尤其是“=”
,也能起到支持作用。我想知道是什么导致了这个问题,以及您所做的大量研究——因为您的示例行中的一个程序刚刚起作用(在更正了工作日类型
的定义之后)@西蒙赖特只是知识。你说得对,示例程序是有效的。但我正在开发一个嵌入式程序,从硬件中获取数据,在分配给子类型之前,应该进行范围检查。这导致了range_检查,因此我仔细检查了这两种类型的所有用法,以确保它们的正确用法。我偶然发现了平等声明,我不确定它是否正确。所以我研究了它,但没有找到答案,我不能接受它只是起作用。另外,我还在为提问做StackOverflow尽职调查。你可能会发现是有效的
有用的()谢谢更新的链接。此外,我从来没有意识到有一个注释参考手册。我一直认为这只是LRM和理由。谢谢你拓展了我的视野!
type N is range 0 .. 10;
X : constant N := N'Base'(-1) + N'(2);