Ale*_*ovs 11 arrays pascal const freepascal
Program ConstTest;
Const constVar = 1;
Begin
constVar := 3;
WriteLn(constVar);
End.
Run Code Online (Sandbox Code Playgroud)
很明显上面的代码不会编译,因为改变常量的值是不对的.但是,下面的代码将编译,并将返回"1; 5; 3;",即使数组是const:
Program ConstTest;
Const constArr:Array [1..3] Of ShortInt = (1,2,3);
Var i:ShortInt;
Begin
constArr[2] := 5;
For i:=1 To 3 Do WriteLn(constArr[i],'; ');
End.
Run Code Online (Sandbox Code Playgroud)
那么,是什么导致了这种行为?为什么常数实际上不是常量?
我正在使用FreePascal Compiler 2.2.0 for Win32.
Rob*_*edy 11
你有什么打字常数.类型常量不同于普通常量(也就是真常量),这就是你constVar的意思.请注意您不需要指定类型constVar; 如果你有,你可能会看到编译器也允许你为它分配新的值:
const
constVar: Integer = 1;
Run Code Online (Sandbox Code Playgroud)
Free Pascal手册描述了类型常量:
与普通常量相反,可以在运行时为它们分配值.这是来自Turbo Pascal的旧概念,已被替换为对初始化变量的支持:有关详细说明,请参见第183页的第4.4节.
支持将值分配给类型化常量由
{$J}指令控制:它可以关闭,但默认情况下处于打开状态(对于Turbo Pascal兼容性).始终允许初始化变量.
对于一个初始化的变量,替换const用var在你的宣言.它将在进入范围时获得其价值.或者,$J在类型常量声明之前关闭指令:
{$J-}
const
constArr: array [1..3] of ShortInt = (1, 2, 3);
{$J+}
Run Code Online (Sandbox Code Playgroud)
无论你之后再打开都取决于你.
类型常量是可修改的,因为它们存储在内存中的方式.事实上,这是因为它们存储在内存中,它们最初是可修改的.普通常量不作为不同的对象存储在内存中.当编译器遇到程序中使用的普通常量时,它会将其替换为常量值,就像你在其位置使用了一个文字一样.另一方面,类型常量驻留在内存中它自己的位置,当你在代码中引用它时,它的值从内存中读取,就像使用任何其他变量一样.如果文字没有可用的语法,则使用类型常量 - 例如,您不能拥有数组或记录文字.