Tras analizar las variables y constantes en el capítulo anterior, el objetivo de este capítulo es ver cómo se pueden combinar las variables y constantes mencionadas para formar expresiones.
En el lenguaje C se utiliza un operador para representar una operación. La combinación de variables y/o constantes con los agentes da lugar a expresiones que consisten en una o varias expresiones, combinadas con los agentes, en una orden. Hay muchos más que los operadores = (asignación) + (suma) – (resta) y * (multiplicación) que hemos utilizado en los programas de los capítulos anteriores. Antes de analizar uno a uno, analizaremos dos características principales de los agentes: la prioridad y la compatibilidad.
Cuando hay más de un agente en una expresión, el orden de evaluación depende de la prioridad de los agentes. Se realizan las operaciones de mayor prioridad obteniendo los primeros resultados de trabajo. Posteriormente, y siguiendo el orden decreciente de prioridad, se aplican los siguientes agentes sobre los resultados de trabajo anteriores. Los paréntesis, al igual que en otros lenguajes, modifican el orden de la evaluación. Por ejemplo, la evaluación de 2 + 3 * 4 genera 14 porque la multiplicación tiene un grado de prioridad mayor que la suma.
La convergencia nos dice cómo se realiza la evaluación, de izquierda a derecha o viceversa. Por ejemplo, mientras el operador tiene la compatibilidad derecha izquierda, los operadores aritméticos comunes (+, –, *) tienen la de izquierda a derecha.
a = b = c
se evalúa por la derecha. Por tanto, b primero y a después toman el valor de c.
a + b - c
por el contrario, se evaluará de izquierda a derecha. En la tabla 1 se muestran los agentes más relevantes y su compatibilidad en orden de prioridad.
Vamos a analizar los agentes que aparecen en la tabla.
Como se puede observar en la Tabla 2, al margen de las operaciones habituales, se presentan otras dos, el incremento y el decremento. En ambos casos se produce la asignación y aunque se pueden expresar de otra manera, se han introducido dentro del lenguaje C en aras a la comodidad y eficacia, a veces difíciles de leer los programas.
Cabe destacar la existencia de un único agente para la división, tanto total como real (frente al PASCAL, div y / o operadores se diferencian). Si los operandos son completos, el resultado será el de la totalidad de la división y en el resto el real (ver tabla 3).
El módulo, el operador%, sólo se puede utilizar con operandos completos.
Ejemplo:
Condición número par (x 2%) = = Ø
Entre las características del lenguaje C se encuentra la capacidad de captura de bits, para lo cual se dispone de los agentes descritos en la tabla 4. Como es sabido, la operación AND se utiliza para poner varios bits en Ø, para poner la operación OR en estado 1 y cambiar el estado xor (bits). Para ello se empareja una variable tipo carácter (8 bits), short (16 bits) o long (32 bits) con una máscara indicada en hexadecimal (prefijo Øx). A los bits que se quieren mantener en la máscara se les asigna el valor Ø y a los que se quieren poner en uno (OR) o cambiar (XOR) el valor. La operación AND se realiza al revés y para ello se puede utilizar el operador.
Por ejemplo, si la variable n está compuesta por 8 bits (sin conocer su valor) y se coloca en un bit a la izquierda, se pone a cero la derecha y se quieren cambiar los dos centrales, se debe:
n = n | Øx8Ø n = n ( ØxØ1) n = n^ Øx18 | /* n ?ó /* n ?ó /* n ?ó | xxxx xxxx */ 1xxx xxxx */ 1xxx xxx Ø */ 1xxx– x–xxØ */ |
Los desplazamientos sirven sobre todo para utilizar el manejo de bits en estructuras repetitivas, como veremos en el capítulo 5.
Los operadores relacionales se utilizan principalmente para representar las condiciones (ver tabla 5). En cualquier caso, el lenguaje C puede ser cualquier condición de expresión; la asignación, ...
Cuando una expresión no relacional es condición, la evaluación de la expresión se considera falsa cuando Ø es y en el resto de los casos como verdadera. Por ello, hay que tener mucho cuidado con la relación de igualdad, ya que es muy fácil poner = = en lugar de = (asignación), como se hace en otros lenguajes. En consecuencia, el resultado de la condición a verificar dependerá del valor asignado.
int n = Ø
if (n=Ø) /* siempre falsa, ya que la asignación es */ if (n = Ø) /* en este caso lo verdadero es n Ø ya */
Cabe destacar que las cadenas de caracteres no se pueden combinar con los operadores observados, ya que las cadenas de caracteres no son datos básicos (ver capítulo 7).
Estos agentes tienen mucho que ver con las estructuras de datos y los demostradores y se profundizará en el capítulo 7 (ver tabla 6).
Estos agentes combinan una operación con la asignación, siendo el resultado y el operando 1 siempre la misma variable. De esta forma se puede sustituir x=x+por x+= a, x=x 3 por x =3 etc.
Estos agentes son:
+= % = | –= = | *= |= | /= ¿= |