Почему массивы константы Паскаля не являются на самом деле константами?

  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.

11
задан Aleksejs Popovs 13 July 2010 в 19:26
поделиться

1 ответ

У вас есть типизированная константа . Типизированные константы отличаются от обычных констант (также известных истинных констант ), что и является вашей 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+}

Включите ли вы ее снова после этого - решать вам.


Типизированные константы можно изменять, поскольку они хранятся в памяти. Фактически, это , потому что они хранятся в памяти, и изначально их можно было изменять. Обычные константы не хранятся в памяти как отдельные объекты. Когда компилятор встречает обычную константу, используемую в вашей программе, он заменяет ее в строке значением константы, как если бы вы использовали вместо нее литерал. С другой стороны, типизированная константа находится в собственном месте в памяти, и когда вы ссылаетесь на нее в коде, ее значение считывается из памяти, как и при использовании любой другой переменной. Вы используете типизированные константы, когда для литерала нет синтаксиса - например, у вас не может быть литералов массива или записи.

11
ответ дан 3 December 2019 в 09:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: