问题1:
var a:1..100;
begin
  readln(a);
end;
执行后输入120,为何没有出错?问题2:
var sz:array[1..10] of integer;i:integer;
begin
  for i:=1 to 20 do
    writeln(sz[i]);
end;
为何执行后没有出错,数组sz不是只有10个数组元素吗?问题3:
执行如下语句后
setlength(a,5);
setlength(a,10);
数组a是否是在第一次定义的长度基础上增加5,原a[1]至a[5]中已存数据是否受发生变化(实验证明是不变的)?

解决方案 »

  1.   

    你試試下面語句看出錯吧:
    var
      a :1..100;
    begin
      a := 120;
    end;var
      sz :array[1..10] of integer;
      i :integer;
    begin
      for i :=1 to 20 do
        sz[i] := i;
    end;
      

  2.   

    第一个问题不会报错,就如枚举类型超出范围一样;第二个问题是会报错的,会报IO错误,或者内存错误;第三个问题SetLength加长的时候,会把原来的内存复制过来;
      

  3.   

    1 计算机硬件无法支持这种类型,所以实际上会采用1个字节来储存和对待
    2 因为没有全部代码,所以只能从结果推测你的声明的是全局变量。x86是按照页面机制管理内存的,一个页面默认是4K。全局变量一般在pe文件的可读写段,映射到内存后,正好处于一个页面的尾部,并且下一个页面没有写权限的概率不是很大。因此在读写上虽然没表现出来什么问题,但实际上写的话,可能造成其它的全局变量的值被修改。
    另外,内存访问是不可能造成IO错误的。
    3 yes
      

  4.   

    第一段代码确实有错,若不是直接赋值,而是从readln中赋值,就不会出错。
    第二段代码在默认设置下编译通过,没有报错。