gpt4 book ai didi

ada - 为什么 Ada 没有捕获这个指定的范围检查?

转载 作者:行者123 更新时间:2023-12-03 14:51:25 26 4
gpt4 key购买 nike

我正在阅读 learn.adacore.com 教程,但遇到了一个我不确定的问题。
具体来说,我知道 Ada 旨在捕获试图溢出具有指定范围定义的变量的尝试。
在下面的情况下,第一次尝试这样做会导致编译器“范围检查失败”,这是预期的。但是以下行并没有捕获它,我不知道为什么:

with Ada.Text_IO; use Ada.Text_IO;

procedure Custom_Floating_Types is
type T_Norm is new float range -1.0 .. 1.0;

D : T_Norm := 1.0;
begin
Put_Line("The value of D =" & T_Norm'Image(D));
-- D := D + 1.0; -- This causes a range check failure at run time = completely expected.
Put_Line("The value of D =" & T_Norm'Image(D + 1.0)); -- This doesn't?

end Custom_Floating_Types;

最佳答案

您有几个很好的答案,但我将添加另一个,因为很明显您期望表达式 D + 1.0提出一个异常(exception),而你的答案并没有解释为什么它没有。
像这样的类型声明

type T_Norm is new float range -1.0 .. 1.0;
大致相当于
type T_Norm'Base is new Float;
subtype T_Norm is T_Norm'Base range -1.0 .. 1.0;
类型(称为“基本类型”)没有命名,尽管它通常可以用 'Base 引用。属性。给出的名称是一个子类型,称为“第一个命名的子类型”。
这种区别很重要,但往往没有得到足够的重视。正如 egilhh 所解释的, T_Norm'Image根据 T_Norm'Base 定义.算术运算符也是如此。例如, "+"被定义为
function "+" (Left : in T_Norm'Base; Right : in T_Norm'Base) return T_Norm'Base;
2.0 显然在 T_Norm'Base 的范围内,所以评估 D + 1.0不违反任何约束,也不会将其传递给 T_Norm'Image .但是,当您尝试将结果值分配给 D 时,它有子类型 T_Norm ,执行检查该值是否在子类型的范围内,并因检查失败而引发异常。
这种区别在其他地方使用,使语言可以合理地工作。例如,一个受约束的数组类型
type A is array (1 .. 10) of C;
大致相当于
type A'Base is array (Integer range <>) of C;
subtype A is A'Base (1 .. 10);
如果你这样做
V : A;
... V (2 .. 4)
您可能会遇到问题,因为切片没有 A 的边界。 .但它有效,因为切片没有子类型 A而是匿名子类型 A'Base (2 ..4) .

关于ada - 为什么 Ada 没有捕获这个指定的范围检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66200754/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com