加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

数组 – E1012常量表达式违反了子范围;为什么它适用于变量?

发布时间:2020-12-15 09:25:00 所属栏目:大数据 来源:网络整理
导读:程序Project1; {$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
程序Project1;

{$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.

我已经设置了数组int的绑定.

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

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

我已经搜索了其他问题,但没有找到好的问题…如果它存在,请不要犹豫,将链接关闭并关闭此问题,谢谢.

解决方法

因为编译器不执行数据流分析.为了让编译器拒绝这个代码,它需要分析你的代码,并确保我超出了界限,编译器根本不这样做.要做到这一点,即使是更复杂的例子也需要编译器开发人员付出巨大努力.

如果切换范围检查,此代码将因运行时错误而失败,我个人认为通过向编译器添加此类数据流分析几乎无法获得.如果你没有启用范围检查,那么你真的应该.

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

您询问在没有范围检查的情况下运行此代码会产生什么后果.好吧,行为没有定义,实际上任何事情都可能发生.最糟糕的情况是,该程序始终适合您,但对于您最重要的客户而言却失败了.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读