Exception 当比较Ada标量类型和子类型时,是否需要进行范围检查? 当比较Ada标量类型和受约束的子类型时,是否需要进行范围检查?

Exception 当比较Ada标量类型和子类型时,是否需要进行范围检查? 当比较Ada标量类型和受约束的子类型时,是否需要进行范围检查?,exception,types,ada,Exception,Types,Ada,我知道,在从基类型到受约束子类型的赋值中,如果在赋值之前我不能确保该值在范围内,则在运行时我有可能出现范围检查异常 但在进行比较时是否也是如此?我认为,由于用户想要返回的唯一知识是布尔结果,因此不需要隐式转换到基类型或范围检查 请注意:我正在寻找一个引用 例子 到目前为止我所发现的。。。 我还没有找到完整的答案。但我确实发现了一些有趣的数据 离散类型的操作/它说: --本章仅讨论如何定义类型和子类型 --这一章中有有趣的注释,但我不确定这一章或这一章中的任何其他内容是否相关 (31)对于离散

我知道,在从基类型到受约束子类型的赋值中,如果在赋值之前我不能确保该值在范围内,则在运行时我有可能出现范围检查异常

但在进行比较时是否也是如此?我认为,由于用户想要返回的唯一知识是布尔结果,因此不需要隐式转换到基类型或范围检查

请注意:我正在寻找一个引用

例子 到目前为止我所发现的。。。 我还没有找到完整的答案。但我确实发现了一些有趣的数据

离散类型的操作/它说:

  • --本章仅讨论如何定义类型和子类型

  • --这一章中有有趣的注释,但我不确定这一章或这一章中的任何其他内容是否相关

(31)对于离散类型的子类型,由 属性Val可能不属于该子类型;同样,实际的 属性Pos的参数不必属于子类型。这个 以下关系(在无例外情况下)由 这些属性:

S'Val(S'Pos(X)) = X
S'Pos(S'Val(N)) = N
  • --这里没有关于类型和子类型的内容

  • “现在,我认为黄金答案就在这里。但这并不是冲着我跳。我从中看到了一点线索

(20) 除了显式类型_转换外,类型转换在结构的预期类型和实际类型不同的情况下隐式执行,这是类型解析规则所允许的(见8.6)。例如,整数文本的类型为universal_integer,并在分配给某个特定整数类型的目标时隐式转换。类似地,当对应的形式参数是类范围的类型时,特定标记类型的实际参数将被隐式转换

即使预期类型和实际类型相同,也会执行隐式子类型转换,以调整操作数的数组边界(如果有)以匹配所需的目标子类型,或者在(可能已调整的)值不满足目标子类型的约束时引发约束错误

这似乎表明隐式类型转换总是执行到子类型(语言对我来说很难理解)。但我没有看到任何地方说明在所需的子类型和基类型之间执行的比较

我也被这句话弄糊涂了:

执行隐式子类型转换以调整操作数的数组边界(如果有)以匹配所需的目标子类型

  • 数组边界是否引用数组类型?或者是引用受约束子类型的范围
  • 如果没有子类型,是否有目标子类型
  • Ada 95基本原理。。。
    • --这个水平太高了。这里没有什么有用的

    • --本节有很多关于类型的深刻信息,但仍然没有与比较类型和子类型相关的信息


    我可能在搜索过程中错过了答案。但我在以某种方式寻找确凿的证据


    抱歉读了这么长时间。

    您可能会发现带注释的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);