2010-07-13 11 views
10
Program ConstTest; 
    Const constVar = 1; 
    Begin 
    constVar := 3; 
    WriteLn(constVar); 
    End. 

Es ist ziemlich offensichtlich, dass der obige Code nicht kompiliert wird, weil es nicht richtig ist, den Wert einer Konstante zu ändern. wird jedoch folgender Code kompilieren, und wird wieder "1; 5; 3;", obwohl das Array ein const ist:Warum Pascal const Arrays sind eigentlich keine Konstanten?

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. 

Also, was dieses Verhalten verursacht? Warum ist eine Konstante keine Konstante?

Ich verwende FreePascal Compiler 2.2.0 für Win32.

+0

Siehe auch http://stackoverflow.com/questions/48934/in-delphi-7-why-can-i-assign-a-value-to-a-const und http://stackoverflow.com/questions/2714365/delphi-all-constants-sind-konstant-aber-einige-sind-mehr-konstant-als-andere. –

Antwort

11

Was Sie dort haben, ist eine typisierte Konstante. Typisierte Konstanten unterscheiden sich von gewöhnlichen Konstanten (a.k.a. wahre Konstanten), die Ihre constVar ist. Beachten Sie, dass Sie keinen Typ unter constVar angeben mussten. wenn Sie hatten, können Sie sehen, dass der Compiler zugewiesen neue Werte erlaubt es, auch:

const 
    constVar: Integer = 1; 

The Free Pascal manual beschreibt typisierte Konstanten:

Im Gegensatz zu gewöhnlichen Konstanten kann ein Wert zugewiesen werden sie zur Laufzeit. Dies ist ein altes Konzept von Turbo Pascal, das durch die Unterstützung initialisierter Variablen ersetzt wurde: Eine detaillierte Beschreibung finden Sie in Abschnitt 4.4, Seite 183.

Die Unterstützung für die Zuweisung von Werten zu typisierten Konstanten wird durch die Direktive {$J} gesteuert: Sie kann ausgeschaltet werden, ist aber standardmäßig aktiviert (für Turbo Pascal-Kompatibilität). Initialisierte Variablen sind immer erlaubt.

Für eine initialisierte Variablen ersetzen const mit var in Ihrer Erklärung. Es wird seinen Wert bei Eingabe des Umfangs erhalten. Oder schalten Sie den $J Richtlinie vor dem typisierten-Konstante Erklärung ab:

{$J-} 
const 
    constArr: array [1..3] of ShortInt = (1, 2, 3); 
{$J+} 

Ob Sie es wieder einschalten danach bleibt Ihnen überlassen.


Typisierte Konstanten können geändert werden, da sie im Speicher abgelegt sind. In der Tat ist es weil sie im Speicher gespeichert sind, dass sie ursprünglich änderbar waren. Gewöhnliche Konstanten werden nicht im Speicher als unterschiedliche Objekte gespeichert. Wenn der Compiler auf eine gewöhnliche Konstante trifft, die in Ihrem Programm verwendet wird, ersetzt er sie inline mit dem Wert der Konstanten, als ob Sie stattdessen ein Literal verwendet hätten. Eine typisierte Konstante hingegen befindet sich an ihrem eigenen Ort im Speicher, und wenn Sie im Code auf einen verweisen, wird ihr Wert wie bei jeder anderen Variablen aus dem Speicher gelesen. Sie verwenden typisierte Konstanten, wenn für ein Literal keine Syntax verfügbar ist - Sie können beispielsweise keine Array- oder Datensatzliterale verwenden.

0

Nun, wenn Sie auch C kennen, hier ein paar Analogien:

In [Turbo/Free] Pascal, etwas zu schreiben, wie folgt aus:

const 
    MIN = 5; 
    MAX = 10; 

entspricht dies in C zu tun:

#define MIN 5 
#define MAX 10 

Das heißt, es ist eine Kompilierzeit Symbol ersetzen wie das andere Plakat sagt.

Bei Datensätzen und Arrays (typisierte Konstanten) ist der Ausdruck "const" nur eine Möglichkeit, einen Speicherblock zu initialisieren, der einem Linkersymbol zugeordnet ist.

TODO: Gegenbeispiel.

Verwandte Themen