Expresiones
y sentencias

Obs:
Un token o también llamado componente léxico es una cadena de caracteres que tiene un significado coherente en cierto lenguaje de programación. Ejemplos de tokens podrían ser palabras clave (if, else, while, int, ...), identificadores, números, signos, o un operador de varios caracteres, (por ejemplo, :=).
Construcción
de expresiones
Literales
y variables son expresiones primarias:
1.7
// Literal real de tipo double
sum
// Variable
-Los
literales se evalúan a sí mismos.
-Las
variables se evalúan a su valor.
Los
operadores nos permiten combinar expresiones primarias y
otras
expresiones formadas con operadores:
1
+ 2 + 3*1.2 + (4 +8)/3.0
Los
operadores se caracterizan por:
-El
número de operandos (unarios, binarios o ternarios).
-El
tipo de sus operandos (p.ej. numéricos o booleanos).
-El
tipo del valor que generan como resultado
Número
de operandos

-Operadores
unarios
Sentencias
de asignación
Las
sentencias de asignación constituyen el ingrediente básico en la
construcción
de programas con lenguajes imperativos.
Al
ejecutar una sentencia de asignación:
1.Se
evalúa la expresión que aparece a la derecha del operador de
asignación
(=).
2.El
valor que se obtiene como resultado de evaluar la expresión
se
almacena en la variable que aparece a la izquierda del
operador
de asignación (=).
Restricción:
El
tipo del valor que se obtiene como resultado de evaluar la expresión
ha de ser compatible con el tipo de la variable.
Ejemplos
x
= x + 1;
int
miVariable=20;// Declaración con inicialización
otraVariable=miVariable;//
Sentencia de asignación
NOTA
IMPORTANTE:
Una
sentencia de asignación no es una igualdad matemática.
Efectos
colaterales
Al
evaluar una expresión, algunos operadores provocan efectos
colaterales (cambios en el estado del programa; es decir, cambios en
el valor de alguna de las variables del programa).
El
uso de operadores de incremento y decremento reduce el tamaño de las
expresiones pero las hace más difíciles de interpretar. Es mejor
evitar su uso en expresiones que modifican múltiples variables o
usan varias veces una misma variable.
Operadores
combinados de asignación (op=)
C
define 10 operadores que combinan el operador de asignación con
otros
operadores (aritméticos y a nivel de bits):
La
forma general de los operadores combinados de asignación es
Variable
op= expresión;
que
pasa a ser
variable
= variable op (expresión);
OJO:
Las
expresiones con y sin operadores combinados de asignación no son
siempre equivalentes.
Ejemplo
V
[i++]+= 2; y
v[i++]=v[i++]+2;
no
son equivalentes.
Conversión
de tipos
En
determinadas ocasiones, nos interesa convertir el tipo de un dato en
otro tipo para poder operar con él.
Ejemplo
Convertir
un número entero en un número real para poder realizar divisiones
en
coma flotante
C
permite realizar conversiones entre datos de tipo numérico (enteros
y reales), así como trabajar con caracteres como si fuesen números
enteros:
-La
conversión de un tipo con menos bits a un tipo con más bits es
automática (vg. de short a long, de float a double), ya que el tipo
mayor puede almacenarcualquier valor representable con el tipo menor
(además de valores que “no caben”en el tipo menor).
-La
conversión de un tipo con más bits a un tipo con menos bits
serealizar de forma explícita con “castings”. Como se pueden
perder datos en la conversión, un buen compilador de C nos avisa de
posibles conversiones erróneas (warnings)
Castings
Para
realizar una conversión explícita de tipo (un “casting”) basta
con poner el nombre del tipo deseado entre paréntesis antes del
valor que se desea convertir:
Algunas
conversiones de interés
De
números en coma flotante a números enteros
Al
convertir de número en coma flotante a entero, el número se trunca
(redondeo a cero).
En
la biblioteca math.h existen funciones que nos permiten realizar el
redondeo de otras formas:
floor(x),
ceil(x)
El
redondeo al que estamos acostumbrados tendremos que implementarlo
nosotros:
int
i = x+0.5;
Conversión
entre caracteres y números enteros
Como
cada carácter tiene asociado un código ASCII, los caracteres pueden
interpretarse como números enteros
int i;
char c;
Resumen
de conversión de tipos
Conversiones
implícitas
Long
double > double > float > unsigned long > long >
unsigned short > short > char
Conversiones
explícitas (castings)
(tipo)
expresión
Evaluación
de expresiones
- La
precedencia de los operadores determina el orden deevaluación de una
expresión (el orden en que se realizan las operaciones):
3*4+2
es equivalente a (3*4)+2
porque
el operador * es de mayor precedencia que el operador +
-
Cuando en una expresión aparecen dos operadores con el mismo nivel
de precedencia, la asociatividad de los operadores determina el orden
de evaluación.
a
–b + c –d es equivalente a ((a –b) + c) –d
porque
los operadores aritméticos son asociativos de izquierda a derecha
a
= b += c = 5 es equivalente a a = (b += (c = 5))
porque
los operadores de asignación son asociativos de derecha a izquierda
-
La
precedencia y la asociatividad determinan el orden de los operadores,
pero no especifican el orden en que se evalúan los operandos de un
operador binario (un operador con dos operandos):
En C,
los operandos se evalúan de izquierda a derecha:
el
operando de la izquierda se evalúa primero.
Si los
operandos no tienen efectos colaterales (esto es, no cambian el valor
de una variable), el orden de evaluación de los operandos es
irrelevante.
NOTA:
Siempre
es recomendable el uso de paréntesis.
Los
paréntesis nos permiten especificar el orden de evaluación de una
expresión, además de hacer su interpretación más fácil.