Clase4 - Operadores en Delphi
-
Upload
julio-antonio-huaman-chuque -
Category
Engineering
-
view
148 -
download
1
Transcript of Clase4 - Operadores en Delphi
1 Embarcadero Delphi / Introducción
Ing. Américo Torres Gonzales
Expresiones
Una expresión es una construcción que retorna un valor. La siguiente tabla muestra ejemplos
de expresiones:
Las expresiones más simples son variables y constantes. Expresiones mas complejas son
construidas a partir de las mas simples usando operadores, llamadas a funciones,
constructores, índices y Casting de Tipos.
A. Operadores
Los operadores se comportan como funciones predefinidas que son parte del lenguaje Delphi.
Por ejemplo, la expresion (X + Y) esta construida a partir de las variables X e Y, llamados
operandos, con el operador +; donde X e Y representan enteros o reales, ( X + Y ) retorna su
suma. Los operadores incluyen: @, not, ^, *, /, div, mod, and, shl, shr, as, +, -, or, xor, =, >, <,
<>, <=, >=, in, is.
Los operadores @, not y ^ son unarios (toman un operando). Todos los otros operadores son
binarios (toman dos operandos), excepto + y – que pueden funcionar como operadores
unarios o binarios. Un operador unario siempre precede a su operando (por ejemplo, -B),
excepto para ^, el cual sigue a su operando (por ejemplo, P ^), Un operador binario esta
ubicado entre sus operandos (por ejemplo, A = 7).
Algunos operadores se comportan diferente dependiendo del tipo de dato pasado a ellos. Por
ejemplo, not realiza una negación a nivel de bit a un operando entero y negación lógica en un
operador Boolean.
2 Embarcadero Delphi / Introducción
Ing. Américo Torres Gonzales
A.1 Operadores Aritméticos
He aquí la lista de los operadores aritméticos:
Operadores Aritméticos Unarios:
Las siguientes reglas se aplican a los operadores aritméticos:
El valor de ( x / y ) es de tipo Extended, sin importar los tipos de x e y. Para otros
operadores aritméticos, el resultado es de tipo Extended si al menos un operando
es un real; de otro modo, el resultado es de tipo Int64 cuando al menos un
operando es de tipo Int64; de otro modo, el resultado es de tipo Integer. Si el tipo
de un operando es subrango de un tipo entero, es tratado como si fuera de tipo
entero.
El valor de ( x div y ) es el valor redondeado de x / y en la dirección de cero al mas
cercano entero.
El operador mod retorna el resto obtenido de dividir sus operandos.
Un error de tiempo de ejecución ocurre cuando y es cero en una expresión de la
forma x / y, x div y, ó x mod y.
3 Embarcadero Delphi / Introducción
Ing. Américo Torres Gonzales
Operadores Booleanos:
Los operadores booleanos not, and, or y xor toman operandos de cualquier tipo Boolean y
retornan un valor de tipo Boolean.
Tipos de Evaluación Lógica
El compilador soporta dos modos de evaluación para los operadores and y or: La evaluación
Completa y la Evaluación de Circuito Corto (Parcial). La evaluación completa significa que cada
conjunción o disyunción es evaluada, aun cuando el resultado de la expresión entera ya este
determinada. La evaluación de circuito corto significa una evaluación estricta de izquierda a
derecha que para tan pronto como el resultado de toda la expresión es determinada. Por
ejemplo, si la expresión (A and B) es evaluada bajo circuito corto cuando A es falso, el
compilador no evaluará B; sabe que la expresión completa es falsa tan pronto como evalúa A.
La evaluación de circuito corto es preferible debido a que garantiza un tiempo mínimo de
ejecución y, en la mayoría de los casos, mínimo tamaño de código. La evaluación completa es
algunas veces conveniente cuando un operando es una función con efectos que pueden alterar
la ejecución del programa.
La evaluación de circuito corto también permite el uso de construcciones que podrían de otro
modo resultar en operaciones ilegales de tiempo de ejecución. Por ejemplo el siguiente código
itera a través de la cadena S hasta la primera coma:
En caso de que S no tenga comas, la ultima iteración incrementa I al valor en el cual es mayor
que el tamaño de S. La siguiente vez que se evalúa el while, la evaluación completa intenta leer
S[I], lo que provoca un error de tiempo de ejecución. La evaluación corta, por el contrario, la
segunda parte de la condición (S*I+ <> ‘,’) no es evaluada si la primera parte falla.
Use la directiva de compilador $B para controlar el modo de evaluación. El estado por defecto
es {$B}, lo cual habilita la evaluación de circuito corto. Para habilitar evaluación completa
localmente agregar la directiva de compilador {$B+} a tu código. Puedes también cambiar a
evaluación completa en un proyecto seleccionando Complete Boolean Evaluation en el cuadro
de dialogo Compiler Options (todas las unidades necesitaran ser recompiladas).
4 Embarcadero Delphi / Introducción
Ing. Américo Torres Gonzales
Operadores Lógicos de Bits
Los siguientes operadores lógicos realizan manipulación a nivel de bits en operandos enteros.
Por ejemplo, si el valor almacenado en X (en binario) es 001101 y el valor almacenado en Y es
100001, la sentencia:
Z := X or Y;
Asigna el valor 101101 a Z.
Las siguientes reglas se aplican a operadores de bits:
El resultado de una operación not es del mismo tipo del operando.
Si los operandos de una operación and, or o xor son ambos enteros, el resultado es del
tipo entero con el rango mas pequeño que incluye todos los posibles valores de ambos
tipos.
Las operaciones ( x shl y ) y ( x shr y ) desplaza el valor de x a la izquierda o derecha por y
bits, el cual (si x es un entero sin signo) es equivalente a multiplicar o dividir x por 2
elevado a y; el resultado es del mismo tipo de x. Por ejemplo, si N tiene el valor 01101
(decimal 13), entonces N sh 1 retorna 11010 (decimal 26).
Operadores de Cadena
Los operadores relacionales =, <>, <, >, <=, >= toman todos ellos operandos de cadena. El
operador + concatena dos cadenas.
Las siguientes reglas se aplican a la concatenación de cadenas:
Los operandos para + pueden ser cadenas, cadenas packed (arreglos del tipo Char), o
caracteres. Sin embargo, si un operando es del tipo WideChar, el otro operando debe ser
una cadena UnicodeString, AnsiString o WideString.
5 Embarcadero Delphi / Introducción
Ing. Américo Torres Gonzales
El resultado de una operación + es compatible con cualquier tipo de cadena. Sin embago,
si los operandos son ambos cadenas cortas o caracteres, y sus tamaños combinados son
mas de 255m el resultado es truncado a los primeros 255 caracteres.
Operadores Puntero
Los operadores relacionales <, >, <= y >= pueden tomar operandos del tipo PAnsiChar y
PWideChar.
El operador ^ se referencia a un puntero. Su operando puede ser un puntero de cualquier tipo
excepto el genérico Pointer, el cual debe ser casteado antes de referenciarlo. P = Q es true solo
en el caso que P y Q apunten a la misma dirección; de otro modo, P <> Q es true.
Puedes usar los operadores + y – para incrementar y decrementar el desplazamiento del
puntero. Puedes usar también – para calcular la diferencia entre los desplazamientos de dos
punteros. Las siguientes se aplican a punteros:
Si I es un entero y P es un puntero a carácter, entonces P + I añade a la dirección dada por
P; esto es, retorna un puntero a la dirección I caracteres después de P. (La expresión I + P
es equivalente a P + I). P – I sustrae I de la dirección dada por P; esto es, que retorna un
puntero a la dirección I caracteres antes de P. Esto es true para punteros PAnsiChar; para
punteros PWideChar P + I agrega SizeOf(WideChar) a P.
Si P y Q son ambos punteros a caracteres, entonces P – Q computa la diferencia entre las
direcciones dadas por P (la dirección mas alta) y la dirección dada por Q (la dirección mas
baja); esto es, retorna un entero que denota el numero de caracteres entre P y Q. P + Q no
esta definido.
Operadores Set
Los siguientes operadores toman conjuntos como operandos.
6 Embarcadero Delphi / Introducción
Ing. Américo Torres Gonzales
Las siguientes reglas se aplican a +, - y *:
Un ordinal O esta en X + Y si y solo si O esta en X o Y. O esta en X – Y si y solo si O esta en X
pero no en Y. O esta en X * Y si y solo si esta en ambos X e Y.
El resultado de una operación +, - o * es del tipo set de A.. B, donde A es el valor ordinal
mas pequeño en el conjunto resultado y B es el mas grande.
Las siguientes reglas se aplican a <=, >=, =, <>, y in:
X <= Y es true solo en el caso que cada miembro de X es un miembro de Y; Z >= W es
equivalente a W <= Z. U = V es true solo en el caso en que U y V contengan exactamente
los miembros, de otro modo, U <> V es true.
Para un ordinal O y un set S, O en S es true solo en el caso en que O es un miembro de S.
Operadores Relacionales
Son usados para comparar dos operandos. Los operadores =, <>, <= y >= también se aplican a
conjuntos.
Para tipos mas simples, la comparación es estricta. Por ejemplo, I = J es true solo en caso en
que I y J tienen el mismo valor, y I <> J es true de otro modo.
Las siguientes reglas se aplican a operadores relacionales:
7 Embarcadero Delphi / Introducción
Ing. Américo Torres Gonzales
Los operandos deben ser de tipos compatibles, excepto un real y un entero, ellos pueden
ser comparados.
Las cadenas son comparadas de acuerdo a sus valores ordinales. Los tipos carácter son
tratados como cadenas de tamaño 1.
Dos cadenas packed deben tener el mismo número de componentes para ser comparados.
Cuando una cadena packed con n componentes es comparado a una cadena, la cadena
packed es tratada como una cande a de tamaño n.
Usar los operadores <, >, <= y >= para comparar operandos PAnsiChar (y PWideChar) solo
si los dos punteros apuntan al mismo arreglo de caracteres.
Los operadores = y <> pueden tomar operandos de clase y tipos de referencia a clase. Con
operandos de tipo class, = y <> son evaluados de acuerdo a las reglas que se aplican a los
punteros: C = D es true solo en caso que C y D apunten a la misma instancia de un objeto, y
C <> D en true de otro modo. Con operandos del tipo referencia a una clase, C = D es true
solo en caso que C y D denoten la misma clase, y C <> D es true de cualquier otro modo.
Operadores de Clases e Interfaces
Los operadores as e is toman clases e instancias de objetos como operandos; as opera en
interfaces también.
Los operadores relacionales = y <> también operan sobre clases.
El operador @
Retorna la dirección de una variable, o de una función, procedimiento, o método; esto es, @
construye un puntero a su operando.
Reglas que se aplican a @:
Si X es una variable, @X retorna la dirección de X. El tipo de @X es Pointer si la directiva
de compilador {$T} está activada. En el caso en que este en el modo {$T+}, @X es de tipo
^T, donde T es del tipo de X.
Si F es una rutina (procedimiento o función), @F retorna el punto de entrada de F. El tipo
de @F es siempre Pointer.
Cuando @ es aplicado a un método de clase, el método identificador debe estar
cualificado con el nombre de la clase. Por ejemplo: @MiClase.MetodoX apunta al método
MetodoX de la clase MiClase.
Nota: Cuando uses el operador @, no es posible tomar la dirección de un método de interface,
debido a que la dirección no es conocida en tiempo de compilación y no puede ser extraído en
tiempo me ejecución.
Precedencia de Operador
En expresiones complejas, las reglas de precedencia determinan el orden en el que las
operaciones son realizadas.
8 Embarcadero Delphi / Introducción
Ing. Américo Torres Gonzales
Un operador con el grado de precedencia mayor es evaluado antes que uno que no lo es,
mientras los operadores de igual precedencia son evaluados de izquierda a derecha. Asi la
expresión:
X + Y * Z
Multiplica Y * Z y le agrega X al resultado; * es realizado primero, debido a que tiene un grado
de precedencia mayor que +. Pero:
X – Y + Z
Primero sustrae Y de X y luego agrega Z al resultado; - y + tienen el mismo grado de
precedencia, así la operación se realiza de izquierda a derecha.
Sin embargo, puedes usar paréntesis para evitar estas reglas de precedencia. Por ejemplo:
(X+Y)*Z
Multiplica Z a la suma de X + Y.
Llamadas a Funciones
Debido a que las funciones devuelven un valor, las llamadas a funciones son expresiones. Por
ejemplo, si has definido una función llamada Calculo que toma dos enteros como argumentos
y retorna un entero, entonces la llamada a función Calculo(24,47) es una expresión entera. Si I
y J son variables enteras, entonces I + Calculo(J,8) es también una expresión entera. Ejemplos
de llamadas a funciones incluyen:
Constructor de Conjuntos
Un constructor de conjuntos denotan un valor tipo set. Por ejemplo:
[5, 6, 7, 8]
9 Embarcadero Delphi / Introducción
Ing. Américo Torres Gonzales
Denota un conjunto cuyos miembros son 5, 6, 7, 8.
El Constructor De conjunto:
[5..8]
Puede también denotar el mismo conjunto.
La sintaxis para un constructor de conjuntos es:
*item1,…,itemN+
Donde cada ítem es ya sea una expresión denotando un ordinal del tipo base del conjunto o un
par como expresión con dos puntos (..) en medio. Cuando un ítem tiene la forma x..y, es la
manera corta para todos los ordinales en el rango de x a y, incluyendo y; pero si x es mayor
que y, entonces x..y, el conjunto [x..y] no denota nada y es un conjunto vacío. El constructor [ ]
denota un conjunto vacío, mientras que [x] denota un conjunto cuyo único miembro es el valor
de x. Son ejemplos de constructores de conjuntos:
Indices
Las Cadenas, arreglos, arreglos de propiedades, y punteros a cadenas pueden ser indexados.
Por ejemplo, si FileName es una variable cadena, la expresión FileName[3] retorna el tercer
carácter en la cadena, mientras que FileName[I+1] retorna el carácter inmediatamente
después del indexado por I.
TypeCast
Algunas veces es útil tratar una expresión como si perteneciera a un tipo diferente. Un
typecast permite hacer esto, en efecto, temporalmente cambiando el tipo de una expresión.
Por ejemplo, Integer(‘A’) castea el carácter A como un entero. La sintaxis para un typecast es:
Tipo Identificador(expresion)
Si la expresión es una variable, el resultado es llamado un typecast de variable; de otro modo
el resultado es un Valor TypeCast. Reglas diferentes se aplican a cada uno de los dos tipos de
Cast.
Valor Typecast
En un valor typecast, el tipo identificador y la expresión deben ser ordinales o tipos puntero.
Ejemplos de valores typecast incluyen:
10 Embarcadero Delphi / Introducción
Ing. Américo Torres Gonzales
El valor resultante es obtenido convirtiendo la expresión en paréntesis. Esto podría involucrar
truncar o extender el tamaño del tipo especificado si el tipo especificado difiere del de la
expresión. El signo de la expresión es siempre preservado. Por ejemplo, la sentencia:
I := Integer(‘A’);
Asigna el valor de Integer(‘A’), que es 65 (su valor ASCII), a la variable I.
Un valor typecast no puede ser seguido de comillas y no puede aparecer en el lado izquierdo
de una sentencia de asignación.
Typecast de Variable
Puedes castear cualquier variable a cualquier tipo, previendo que sus tamaños sean los
mismos y no mezclar enteros con reales. (Para convertir tipos numéricos, se usan las funciones
Int y Trunc). Ejemplos de Typecast de variables incluyen:
Los typecast de variables pueden aparecer en cualquier lado de una sentencia de asignación.
Asi:
Asigna el carácter z (ASCII 122) a MyChar.
Puedes castear variables a un tipo procedural. Por ejemplo, dadas las declaraciones:
Puedes hacer las asignaciones siguientes: