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.
Так, что вызывает это поведение? Почему константа не является на самом деле константой?
Я использую Компилятор FreePascal 2.2.0 для Win32.
У вас есть типизированная константа . Типизированные константы отличаются от обычных констант (также известных истинных констант ), что и является вашей constVar
. Обратите внимание, что вам не нужно указывать тип в constVar
; если да, то вы можете увидеть, что компилятор также позволяет присваивать ему новые значения:
const
constVar: Integer = 1;
Руководство Free Pascal описывает типизированные константы:
В отличие от обычных констант, им можно присвоить значение во время выполнения.Это старая концепция Turbo Pascal, которая была заменена поддержкой инициализированных переменных: Подробное описание см. В разделе 4.4 , страница 183 .
Поддержка присвоения значений типизированным константам контролируется директивой
{$ J}
: ее можно отключить, но она включена по умолчанию (для совместимости с Turbo Pascal). Инициализированные переменные разрешены всегда.
Для инициализированной переменной замените const
на var
в своем объявлении. Он получит свое значение при входе в область видимости. Или отключите директиву $ J
перед объявлением типизированной константы:
{$J-}
const
constArr: array [1..3] of ShortInt = (1, 2, 3);
{$J+}
Включите ли вы ее снова после этого - решать вам.
Типизированные константы можно изменять, поскольку они хранятся в памяти. Фактически, это , потому что они хранятся в памяти, и изначально их можно было изменять. Обычные константы не хранятся в памяти как отдельные объекты. Когда компилятор встречает обычную константу, используемую в вашей программе, он заменяет ее в строке значением константы, как если бы вы использовали вместо нее литерал. С другой стороны, типизированная константа находится в собственном месте в памяти, и когда вы ссылаетесь на нее в коде, ее значение считывается из памяти, как и при использовании любой другой переменной. Вы используете типизированные константы, когда для литерала нет синтаксиса - например, у вас не может быть литералов массива или записи.