gpt4 book ai didi

arrays - E1012 常量表达式违反子范围界限;为什么它适用于变量?

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

编程项目1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
System.SysUtils;

var
ints: array[1..2] of Integer = (0,0);
i : Integer;

begin
ints[5] := 10; // doesn't compile
i := 5;
ints[i] := 10; // Seems to works
Writeln(ints[i]); // and even display the value
Readln;
end.

我已经设置了数组ints的界限。

通常,在尝试将值设置为有界数组之前,我会检查 Low(ints)High(ints)...但当我正在寻找另一 block code时,我注意到我可以在边界之外使用索引,并且它不会引发任何异常...

我想知道为什么它会起作用以及会产生什么后果?(例如,如果这部分内存没有保留并且我可以破坏它,...)

我搜索了其他问题,但没有找到好的问题...如果存在,请毫不犹豫地放置链接并关闭此问题,谢谢。

最佳答案

因为编译器不进行数据流分析。为了让编译器拒绝此代码,它需要分析您的代码并确保 i 超出范围并且编译器根本不会这样做。即使对于稍微复杂的示例来说,这样做也需要编译器开发人员付出巨大的努力。

由于如果您打开范围检查,此代码将因运行时错误而失败,因此我个人认为向编译器添加此类数据流分析几乎没有什么好处。如果您没有在启用范围检查的情况下运行,那么您确实应该启用。

让编译器执行范围检查的众多好处之一是,在许多情况下您可以删除范围检查代码。这将使您的代码更加清晰。但是,只有当您完全控制索引并且可以静态分析代码时才能执行此操作。如果索引来自用户输入,那么显然您需要提供防止滥用的保护。

您询问在不进行范围检查的情况下运行此代码会产生什么后果。嗯,行为是没有定义的,实际上任何事情都可能发生。最坏的情况是该计划始终适合您,但对您最重要的客户来说却会严重失败。

关于arrays - E1012 常量表达式违反子范围界限;为什么它适用于变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10599685/

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