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

Es bastante obvio que el código anterior no se compilará, porque no es correcto cambiar el valor de una constante. Sin embargo, a raíz de código se compila, y volverá "1; 5; 3;", a pesar de que la matriz es una constante:¿Por qué las matrices const de Pascal no son en realidad constantes?

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. 

Por lo tanto, lo que hace que este comportamiento? ¿Por qué una constante no es en realidad una constante?

Estoy usando FreePascal Compiler 2.2.0 para Win32.

+0

Véase también http://stackoverflow.com/questions/48934/in-delphi-7-why-cani-i-assign-a-value-to-a-const y http://stackoverflow.com/questions/2714365/delphi-all-constants-are-constant-but-some-are-more-constant-than-others. –

Respuesta

11

Lo que tienes allí es constante tipada. Las constantes tipadas son distintas de constantes ordinarias (a.k.a. constantes verdaderas), que es lo que su constVar es. Observe que no necesitó especificar un tipo en constVar; si tuviera, es posible ver que el compilador que permite a los nuevos valores asignados a él, también:

const 
    constVar: Integer = 1; 

The Free Pascal manual describe constantes proporcionado:

Contrariamente a las constantes ordinarias, un valor puede ser asignado a ellos en tiempo de ejecución. Este es un concepto antiguo de Turbo Pascal, que ha sido reemplazado con soporte para variables inicializadas: para una descripción detallada, consulte la sección 4.4, página 183.

El soporte para asignar valores a las constantes tipadas se controla mediante la directiva {$J}: se puede apagar, pero está activado por defecto (para compatibilidad con Turbo Pascal). Las variables inicializadas siempre están permitidas.

Para una variable inicializada, reemplace const con var en su declaración. Obtendrá su valor al entrar en el alcance. También puede desactivar la directiva $J antes de la declaración mecanografiada constante:

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

Tanto si se vuelve a activar después depende de usted.


Las constantes tipadas son modificables por la forma en que están almacenadas en la memoria. De hecho, es porque están almacenados en la memoria que originalmente eran modificables. Las constantes ordinarias no se almacenan en la memoria como objetos distintos. Cuando el compilador encuentra una constante ordinaria utilizada en su programa, la reemplaza en línea con el valor de la constante, como si hubiera usado un literal en su lugar. Una constante tipada, por otro lado, reside en su propia ubicación en la memoria, y cuando se refiere a uno en el código, su valor se lee de la memoria, al igual que el uso de cualquier otra variable. Usas constantes tipadas cuando no hay sintaxis disponible para un literal; por ejemplo, no puedes tener una matriz o grabar literales.

0

Bueno, si usted también sabe C, aquí hay un par de analogías:

En [/ gratuita Turbo] Pascal, escribiendo algo como esto:

const 
    MIN = 5; 
    MAX = 10; 

es equivalente a hacer esto en C:

#define MIN 5 
#define MAX 10 

Es decir, es un símbolo de tiempo de compilación reemplazado como el otro cartel dice.

Con registros y matrices, (constantes tipadas), la expresión "const" es solo una forma de inicializar un bloque de memoria asociado con un símbolo de enlazador.

TODO: contador de ejemplo.

Cuestiones relacionadas