Expresiones y Operadores en Pascal

Por

Generalmente, las instrucciones de un programa, escrito en cualquier lenguaje, están compuestas principalmente de expresiones; las cuales siguen un modelo similar al de las expresiones de los sistemas algebraicos. Por lo tanto, podemos considerar que una expresión es la combinación de números, cadenas de textos, variables, constantes, funciones, operadores y signos de agrupación.

Expresiones y Operadores reconocidos por el Lenguaje Pascal.

Las expresiones nos permiten comparar valores; modificar cadenas de caracteres; o efectuar operaciones aritméticas, lógicas, o booleanas. En Pascal, toda expresión denota un valor final como resultado de efectuar sus operaciones; tal como ocurre con las expresiones algebraicas. Algunos ejemplos de expresiones podrían ser las siguientes:

X + Y - Z
-X
Resultado <> 0
I <= Longitud

Operadores y reglas de precedencia

En su forma más simple, una expresión está hecha de operadores y operandos. En el Lenguaje Pascal, normalmente se utilizan como operadores los símbolos matemáticos habituales, como por ejemplo: (+), (-), (*), y (/). Existen dos tipos de operadores: los operadores binarios, que admiten dos operandos; y los operadores unarios, que solamente admiten un operando. Los operadores unarios siempre debe preceder a su operando, por ejemplo: -A, -B, Not B.

Los operadores deben regirse por las reglas de precedencia que, basadas en las leyes de la matemática, determinan el orden en que serán efectuadas las operaciones dentro de una expresión. Este orden se ha establecido tal como se describe en la tabla a continuación:

OperadorOrden de precedenciaCategorías
NotPrimero (mayor prioridad)Operadores unarios
*, /, Div, Mod, And, Shl, ShrSegundoOperadores de producto
+, -, Or, XorTerceroOperadores de adición
=, <>, <, >, <=, >=, InCuarto (menor prioridad)Operadores relacionales

Normalmente, las operaciones con igual orden de precedencia se evalúan de izquierda a derecha; sin embargo, al momento de formar una expresión, se debe tener en cuenta las siguientes tres reglas:

  • Un operando entre dos operadores de diferente precedencia se efectúa con el operador de mayor prioridad.
  • Un operando entre dos operadores iguales se efectúa con el operador a su izquierda.
  • Las expresiones dentro de paréntesis se evalúan previamente para ser tratadas como un único operando.

Al momento de compilarse un programa, algunos compiladores suelen reorganizar los operandos para generar un código más óptimo; tal como es el caso del compilador de Turbo Pascal 7.0.

Sintaxis de las expresiones

Prácticamente, las reglas de precedencia nos permiten determinar la sintaxis correcta de las expresiones; las cuales se construyen a partir de diferentes combinaciones de operandos y operadores. Estas combinaciones, de operandos y operadores, a su vez suelen constituir otros elementos de la expresión que se conocen como factores, términos, y expresiones simples. Dentro de una expresión, un factor puede ser cualquiera de los siguientes elementos:

X			: Una variable.
Pi			: Una constante.
15			: Un valor numérico.
(X + Y + Z)		: Una expresión agrupada.
Sin(X)			: La llamada a una función.
Not Done		: La negación de un valor booleano.
Char (Digito + 48)	: Un valor tipo Char.

Mientras que, un término es simplemente un fragmento de expresión compuesto por dos o más factores, que están ligados mediante operadores de producto. Veamos algunos ejemplos:

X * Y
Z / (1 - Z)
Y Shl 2
(X <= Y) And (Y < Z)

Una expresión simple, está compuesta de uno o más términos ligados mediante operadores de adición; como por ejemplo:

X + Y
-X
X*Y + J*5
X/Y + J/5 - W*Z
Switch1 Or Switch2

Una expresión, también se puede componer a partir de varias expresiones simples unidas mediante operadores relacionales. Por ejemplo:

X <= (1.5 + Y - Z)
(I < J) = (J < K)
Resultado <> Error
C in Grupo

Cuando una expresión contiene a una función, ésta primero recibirá el llamado a ejecutar sus acciones; y luego, denotará el valor retornado por dicha función.

Operadores del Lenguaje Pascal

Los operadores utilizados en el Lenguaje Pascal se encuentran clasificados en varios grupos denominados como: operadores aritméticos, operadores lógicos, operadores booleanos, operadores de cadena, y operadores relacionales. Cada operador realiza una operación diferente, y sus operaciones entregan un resultado con un determinado tipo de datos.

Operadores Aritméticos

Los operadores aritméticos, son aquellos que nos permiten la realización de operaciones matemáticas básicas. Las características de este grupo de operadores se pueden observar detalladamente en la tabla siguiente:

OperadorOperaciónTipo de operandoTipo de resultado
+SumaReal, IntegerReal, Integer
-RestaReal, IntegerReal, Integer
*Multiplicación Real, IntegerReal, Integer
/DivisiónReal, IntegerReal, Integer
DivDivisión EnteraReal, IntegerReal, Integer
ModModulo de División (Residuo)Real, IntegerReal, Integer

Dentro de los operadores aritméticos existe otro subgrupo denominado como operadores de identidad de signo; los cuales son de tipo unario, y se utilizan para asignar o cambiar el signo de una expresión. En la tabla siguiente se pueden observar las características de estos operadores:

OperadorOperaciónTipo de operandoTipo de resultado
+Asignación de signo positivoReal, IntegerReal, Integer
-Asignación de signo negativoReal, IntegerReal, Integer

Los operadores aritméticos admiten operandos de tipo numérico Real o Integer. Si dos operandos ligados a un operador (+), (-), (*), (Div), o (Mod) son de tipo Integer, el resultado de su operación será también del tipo Integer; en cambio, si al menos uno de los operandos es de tipo Real, el resultado será de tipo Real. Mientras que, en las operaciones de asignación de signo, el tipo del resultado será del mismo tipo de su operando.

En la operación X/Y, el resultado siempre será de tipo Real, independientemente del tipo de sus operandos. La operación X Div Y es el cociente matemático entre X y Y, pero tomando solamente su parte numérica entera; por lo tanto, su resultado será siempre de tipo entero. En ambas operaciones ocurrirá un error en tiempo de ejecución, si el valor de Y es cero (0).

El operador Mod devuelve como resultado el residuo de la división entera de sus dos operandos; por lo tanto,

X mod Y = X – (X div Y)*Y

En la expresión X Mod Y, el signo del resultado será siempre del mismo signo de Y. En esta operación, también se producirá un error en tiempo de ejecución, si el valor de Y es cero.

Operadores Lógicos

Los operadores lógicos se utilizan para realizar operaciones de lógica combinatoria; las mismas que se aplican al algebra de sistemas digitales. Estas operaciones se efectúan a nivel de los bits (0 y 1) de la representación binaria de una expresión, en lugar de efectuarse directamente sobre su valor numérico decimal. En la tabla siguiente podemos ver las operaciones y el tipo de resultado entregado por estos operadores:

OperadorOperaciónTipo de operandoTipo de resultado
NotNegación (a nivel de bits)IntegerInteger
AndConjunción (a nivel de bits)IntegerInteger
OrDisyunción (a nivel de bits)IntegerInteger
XorExclusión (a nivel de bits)IntegerInteger
ShlDesplazamiento a la izquierdaIntegerInteger
ShrDesplazamiento a la derechaIntegerInteger

Estos operadores solamente admiten operandos de tipo Integer, y sus operaciones se efectúan sobre los bits individuales de sus operandos; es por eso que, a estos operadores también se les conoce como "operadores bit a bit" u "operadores bitwise".

El operador Not, es de tipo unario, y realiza la negación de bits (complemento a 1) de una expresión; es decir, convierte cada bit 0 del operando en 1 y viceversa; su resultado será el valor inverso del operando menos uno.

Los operadores And, Or, y Xor efectúan las operaciones lógicas de conjunción, disyunción, y exclusión sobre cada bit relativo de sus operandos.

Los operadores Shl y Shr realizan, respectivamente, un desplazamiento de los bits de una expresión a una posición de n bits a la izquierda o la derecha, dónde n corresponde también a otra expresión:

Expresion Shl n

Los resultados devueltos por los operadores lógicos se pueden observar en los siguientes ejemplos:

A := 60;	{A =  60 = 00111100}
B := 14;	{B =  14 = 00001110}

C := Not A;	{C = -61 = 11000011}
C := A And B;	{C =  12 = 00001100}
C := A Or B;	{C =  62 = 00111110}
C := A Xor B;	{C =  50 = 00110010}

Desplazamientos a 3 bits:

C := A Shl 3;	{C = 480 = 11100000}
C := B Shr 3;	{C =   1 = 00000001}

Operadores Booleanos

Los operadores booleanos también nos permiten realizar operaciones lógicas, pero a nivel de proposiciones. A diferencia de los operadores lógicos, estos operadores sólo admiten operandos de tipo Boolean; tal como se muestra en la tabla a continuación:

OperadorOperaciónTipo de operandoTipo de resultado
NotNegación lógicaBooleanBoolean
AndConjunción lógicaBooleanBoolean
OrDisyunción lógicaBooleanBoolean
XorExclusión lógicaBooleanBoolean

Normalmente, los operadores booleanos actúan sobre expresiones lógicas relacionales, dando por resultado valores como falso o verdadero. Por ende, son las leyes del algebra de proposiciones las que rigen en este tipo de operadores. Veamos algunas operaciones de ejemplo:

A := True;	{El valor de A es: Verdadero}
B := False;	{El valor de B es: Falso}

C := Not A;	{El valor de C será: Falso}
C := A And B;	{El valor de C será: Falso}
C := A Or B;	{El valor de C será: Verdadero}
C := A Xor B;	{El valor de C será: Verdadero}

Operador de Cadenas

En el lenguaje pascal, también se utiliza al símbolo más (+) como un operador de cadena; el cual nos permite concatenar, o combinar, dos operandos en una sola cadena de caracteres. Observe la tabla a siguiente:

OperadorOperaciónTipo de operandoTipo de resultado
+Concatenación de cadenasChar, StringString

El resultado de una operación de concatenación es compatible con cualquier variable de tipo String (excepto para las variables de tipo Char o Packed String). Si la cadena resultante contiene más de 255 carácteres, se trunca después del carácter 255. Por ejemplo:

A := 'Hello';  	{A es de tipo String}
B := ' ';  	{B es de tipo Char}
C := 'World!'	{C es de tipo String}

D := A + B + C	{Resultado en D será: “Hello World!”}

Operadores Relacionales

Los operadores relacionales se utilizan para comprobar si entre dos operandos se cumple o no una relacion condicional de correspondencia. Normalmente, estas relaciones son de tipo matemático; de manera que, cuando se cumple la condición de la relación, se produce un resultado verdadero (true), o un resultado falso (false) si ocurre lo contrario. Las características de estos operadores se pueden apreciar en la tabla siguiente:

OperadorOperaciónTipo de operandoTipo de resultado
=Igual aCompatible types, Pointer, Set,
String, y Packed string.
Boolean
<>Diferente deCompatible types, Pointer, Set,
String, y Packed string.
Boolean
<Menor queCompatible types, Pointer, Set,
String, y Packed string.
Boolean
>Mayor queCompatible types, Pointer, Set,
String, y Packed string.
Boolean
<=Menor o igual aCompatible types, Pointer, Set,
String, y Packed string.
Boolean
>=Mayor o igual aCompatible types, Pointer, Set,
String, y Packed string.
Boolean

Observe y analice las expresiones en los siguientes ejemplos:

A := 10 + 5 = 15;  {El valor de A será: True}
B := 15 + 5 = 30;  {El valor de B será: False}

C := 'Xa' < 'Xb';  {El valor de C será: True}
D := 'Xb' > 'Xc';  {El valor de D será: False}

Los operadores relacionales pueden admitir operandos de tipo numérico que sean compatibles (Compatible types) entre si; de manera que, si en una expresión relacional uno de los operandos es de tipo Real, el otro operando puede ser de tipo Integer.

Mediante estos operadores también es posible comparar cadenas de caracteres, teniendo en cuenta el valor ordinal de los caracteres del Conjunto ASCII Extendido. En una expresión relacional, todos los valores de tipo String son compatibles entre si; incluso, son también compatibles con valores de tipo Char. Esto es porque que, al comparar un valor de tipo String con otro de tipo Char, el valor de tipo de Char es tratado como una cadena de caracteres de longitud uno (1).

Conclusiones y aclaraciones finales

Seguramente habrá notado que, algunos operadores emplean el mismo símbolo; como es el caso del símbolo más (+), que es utilizado a la vez por las operaciones de suma, concatenación y asignación de signo; otro caso también notorio es el de los operadores lógicos y booleanos, que tienen en común a los símbolos Not, And, Or y Xor.

Los compiladores e intérpretes del Lenguaje Pascal, están capacitados para diferenciar correctamente a cada operador según su contexto. No obstante, para evitar resultados erróneos, al momento de formular expresiones, debemos tener bien claro el funcionamiento de cada operador; teniendo siempre en cuenta los tipos de operando que admiten, el tipo de resultado que arrojan y su orden de precedencia.