gpt4 book ai didi

arrays - 为什么 Pascal const 数组实际上不是常量?

转载 作者:行者123 更新时间:2023-12-04 02:08:40 25 4
gpt4 key购买 nike

  Program ConstTest;
Const constVar = 1;
Begin
constVar := 3;
WriteLn(constVar);
End.

很明显,上面的代码不会编译,因为改变常量的值是不对的。
但是,以下代码将编译,并返回“1; 5; 3;”,即使数组是一个常量:
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.

那么,是什么导致了这种行为?为什么常数实际上不是常数?

我在 Win32 上使用 FreePascal Compiler 2.2.0。

最佳答案

你拥有的是一个类型化的常量。类型常量不同于普通常量(也就是真正的常量),这就是你的 constVar是。请注意,您无需在 constVar 上指定类型。 ;如果有,您可能会看到编译器也允许您为其分配新值:

const
constVar: Integer = 1;

The Free Pascal manual描述类型化常量:

Contrary to ordinary constants, a value can be assigned to them at run-time. This is an old concept from Turbo Pascal, which has been replaced with support for initialized variables: For a detailed description, see section 4.4, page 183.

Support for assigning values to typed constants is controlled by the {$J} directive: it can be switched off, but is on by default (for Turbo Pascal compatibility). Initialized variables are always allowed.



对于已初始化的变量,替换 constvar在你的声明中。它将在进入范围后获得其值。或者,关闭 $J类型常量声明之前的指令:
{$J-}
const
constArr: array [1..3] of ShortInt = (1, 2, 3);
{$J+}

之后是否重新打开它取决于您。

类型常量是可修改的,因为它们在内存中的存储方式。事实上,正是因为它们存储在内存中,所以它们最初是可以修改的。普通常量不会作为不同的对象存储在内存中。当编译器遇到程序中使用的普通常量时,它会用常量的值内联替换它,就像您在它的位置使用了文字一样。另一方面,类型常量驻留在内存中它自己的位置,当你在代码中引用一个常量时,它的值是从内存中读取的,就像使用任何其他变量一样。当没有可用于文字的语法时,您可以使用类型化常量——例如,您不能拥有数组或记录文字。

关于arrays - 为什么 Pascal const 数组实际上不是常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3240689/

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