martes, 14 de abril de 2009

CAPíTULO 4 OPERADORES Y EXPRESIONES

4.1. OPERADORES Y EXPRESIONES
Los programas C constan de datos, sentencias de programas y expresiones. Una expresión es,
normalmente, una ecuación matemática, tal como 3 + 5. En esta expresión, el símbolo más (+) es el operador de suma, y los números 3 y 5 se llaman operandos. En síntesis, una expresión es una secuencia de operaciones y operandos que especifica un cálculo.
Cuando se utiliza el + entre números (o variables) se denomina operador binario, debido a que el
operador + suma dos números. Otro tipo de operador de C es el operador unitario («unario»), que actúa sobre un Único valor. Si la variable x contiene el valor 5, -x es el valor -5. El signo menos (-) es el operador unitario menos.
C soporta un conjunto potente de operadores unarios, binarios y de otros tipos.


4.2. OPERADOR DE ASIGNACIÓN
El operador = asigna el valor de la expresión derecha a la variable situada a su izquierda.
codigo = 3467;
fahrenheit = 123.456;
coordX = 525;
coordY = 725;
Este operador es asociativo por la derecha, eso permite realizar asignaciones múltiples. Así,
a = b = c = 45;
equivale a
a = (b = (c = 45));
o dicho de otro modo, a las variables a, b y c se asigna el valor 4 5.
Esta propiedad permite inicializar varias variables con una sola sentencia
int a, b, c;
a = b = c = 5; / * se asigna 5 a las variables a, b y c */
Además del operador de asignación =, C proporciona cinco operadores de asignación adicionales.
Estos operadores de asignación actúan como una notación abreviada para expresiones utilizadas
En la Tabla 4.1 aparecen los seis operadores de asignación.
con frecuencia. Así, por ejemplo, si se desea multiplicar 1 O por i, se puede escribir


4.3. OPERADORES ARITMÉTICOS
Los operadores aritméticos sirven para realizar operaciones aritméticas básicas. Los operadores
aritméticos C siguen las reglas algebraicas típicas de jerarquía o prioridad. Estas reglas especifican la precedencia de las operaciones aritméticas.
Considere la expresión
3 + 5 * 2
¿Cual es el valor correcto, 1 6 ( 8 * 2 ) o 13 ( 3 + 1 O ) ? De acuerdo a las citadas reglas, la multiplicación se realiza antes que la suma. Por consiguiente, la expresión anterior equivale a:
3 t (5 * 2 )
En C las expresiones interiores a paréntesis se evalúan primero; a continuación, se realizan los
operadores unitarios, seguidos por los operadores de multiplicación, división, resto, suma y resta.


4.3.1. Asociatividad
En una expresión tal como
3 * 4 + 5
el compilador realiza primero la multiplicación -por tener el operador * prioridad más alta- y luego la suma, por tanto, produce 17. Para forzar un orden en las operaciones se deben utilizar paréntesis
3 * (4 + 5)
produce 2 7, ya que 4 + 5 se realiza en primer lugar.
de izquierda a derecha o de derecha a izquierda. Por ejemplo,
La asociatividad determina el orden en que se agrupan los operadores de igual prioridad; es decir,
x ~ y + z se agrupa como (x ~ y ) + z
ya que - y +, con igual prioridad, tienen asociatividad de izquierda a derecha. Sin embargo,
x = y = z
se agrupa como
x = ( y = z)
dado que su asociatividad es de derecha a izquierda.


4.3.2. Uso de paréntesis
Los paréntesis se pueden utilizar para cambiar el orden usual de evaluación de una expresión
determinada por su prioridad y asociatividad. Las subexpresiones entre paréntesis se evalúan en primer lugar según el modo estándar y los resultados se combinan para evaluar la expresión completa. Si los paréntesis están «anidados» -es decir, un conjunto de paréntesis contenido en otro- se ejecutan en primer lugar los paréntesis más internos. Por ejemplo, considérese la expresión
(7 * (10 - 5) % 3)* 4 + 9
La subexpresión (1 O - 5) se evalúa primero, produciendo
( 7 * 5 % 3 ) * 4 + 9
A continuación se evalúa de izquierda a derecha la subexpresión (7 * 5 % 3 )
(35 % 3) * 4 + 9
seguida de
2 * 4 + 9
Se realiza a continuación la multiplicación, obteniendo
8 + 9
y la suma produce el resultado final
17


4.4. OPERADORES DE INCREMENTACIÓN Y DECREMENTACIÓN
De las características que incorpora C, una de las más Útiles son los operadores de incremento ++ y decremento --. Los operadores ++ y --, denominados de incrementación y decrementación, suman o restan 1 a su argumento, respectivamente, cada vez que se aplican a una variable.


4.5. OPERADORES RELACIONALES
C no tiene tipos de datos lógicos o booleanos, como Pascal, para representar los valores verdadero (true) y falso (false). En su lugar se utiliza el tipo i n t para este propósito, con el valor entero O que representa a falso y distinto de cero a verdadero.

falso cero
verdadero distinto de cero


Operadores tales como >= y == que comprueban una relación entre dos operandos se llaman
operadores relacionales y se utilizan en expresiones de la forma:

expresión, operador-re1 aci onal expresión
expresión, y expresión expresiones compatibles C
operador-re1 acional un operador de la tabla 4.7


Los operadores relacionales se usan normalmente en sentencias de selección ( i f ) o de iteración
(while, for), que sirven para comprobar una condición. Utilizando operadores relacionales se realizan operaciones de igualdad, desigualdad y diferencias relativas. La Tabla 4.7 muestra los operadores relacionales que se pueden aplicar a operandos de cualquier tipo de dato estándar: char, int , float, double, etc.
Cuando se utilizan los operadores en una expresión, el operador relaciona1 produce un O, o un 1,
dependiendo del resultado de la condición. O se devuelve para una condiciónfalsa, y 1 se devuelve para una condición verdadera. Por ejemplo, si se escribe
c = 3 < 7 ;
la variable c se pone a 1, dado que como 3 es menor que '1, entonces la operación < devuelve un valor de 1, que se asigna a c.


4.6. OPERADORES LÓGICOS
Además de los operadores matemáticos, C tiene también operadores lógicos. Estos operadores se
utilizan con expresiones para devolver un valor verdadero (cualquier entero distinto de cero) o un valor falso (O). Los operadores lógicos se denominan también operadores hooleanos, en honor de George Boole, creador del álgebra de Boole.
Los operadores lógicos de C son: not ( ! 1 , and (&&I y or ( I I I . El operador lógico ! (not, no)
producefalso (cero) si su operando es verdadero (distinto de cero) y viceversa. El operador lógico && (and, y ) produce verdadero sólo si ambos operandos son verdadero (no cero); si cualquiera de los operandos es falso produce falso. El operador lógico I I (or, o) produce verdadero si cualquiera de los operandos es verdadero (distinto de cero) y produce falso sólo si ambos operandos son falsos. La Tabla 4.8 muestra los operadores lógicos de C.


4.6.1. Evaluación en cortocircuito
En C los operandos de la izquierda de && y t I se evalúan siempre en primer lugar; si el valor del
operando de la izquierda determina de forma inequívoca el valor de la expresión, el operando derecho no se evalúa. Esto significa que si el operando de la izquierda de && es falso o el de t 1 es verdadero, el operando de la derecha no se evalúa. Esta propiedad se denomina evaluacio'n en cortocircuito y se debe a que si p es falso, la condición p && q es falsa con independencia del valor de q y de este modo C no evalúa q. De modo similar si p es verdadera la condición p I I q es verdadera con independencia del valor de q y C no evalúa a q.


4.7. OPERADORES DE MANIPULACIÓN DE BITS
Una de las razones por las que C se ha hecho tan popular en computadoras personales es que el lenguaje ofrece muchos operadores de manipulación de bits a bajo nivel.
Los operadores de manipulación o tratamiento de bits (binuise) ejecutan operaciones lógicas sobre cada uno de los bits de los operandos. Estas operaciones son comparables en eficiencia y en velocidada sus equivalentes en lenguaje ensamblador.
Cada operador de manipulación de bits realiza una operación lógica bit a bit sobre datos internos.
Los operadores de manipulación de bits se aplican sólo a variables y constantes char, int y long, y
no a datos en coma flotante. Dado que los números binarios constan de 1 ,s y 0,s (denominados bits), estos 1 y 0 se manipulan para producir el resultado deseado para cada uno de los operadores.
Las siguientes tablas de verdad describen las acciones que realizan los diversos operadores sobre los diversos patrones de bit de un dato int (char o long).


4.7.1. Operadores de asignación adicionales
AI igual que los operadores aritméticos, los operadores de asignación abreviados están disponibles también para operadores de manipulación de bits. Estos operadores se muestran en la Tabla 4.13.


4.7.2. Operadores de desplazamiento de bits (>>, <<)
Equivalen a la instrucción SHR ( << ) de los microprocesadores 80x86. Efectúa un
desplazamiento a la derecha (>>) o a la izquierda (<<) de n posiciones de los bits del operando, siendo n un número entero. El número de bits desplazados depende del valor a la derecha del operador. Los formatos de los operadores de desplazamiento son:
( >>) y SHL
1. valor << numero-de-bi ts;
2. valor >> numero-de-bits;
El valor puede ser una variable entera o carácter, o una constante. El número-de-hits determina
cuántos bits se desplazarán. La Figura 4.2 muestra lo que sucede cuando el número 29 (binario
O001 1101) se desplaza a la izquierda tres bits con un desplazamiento a la izquierda bit a bit (<<).


4.7.3. Operadores de direcciones
Son operadores que permiten manipular las direcciones de las variables y registros en general:
*expresión
&valorpi (lvalue)
registro.miembro
puntero-hacia-registro -> miembro


4.8. OPERADOR CONDICIONAL
El operador condicional, ? : , es un operador ternario que devuelve un resultado cuyo valor depende de la condición comprobada. Tiene asociatividad a derechas (derecha a izquierda).
Al ser un operador ternario requiere tres operandos. El operador condicional se utiliza para
reemplazar a la sentencia i f -e 1 se lógica en algunas situaciones. El formato del operador condicional es:
expresion-c ? expresion-v : expresion-f;
Se evalúa expresion-c y su valor (cero = falso, distinto de cero = verdadero) determina cuál es
la expresión a ejecutar; si la condición es verdadera se ejecuta expresion-v y si es falsa se ejecuta
expres i on- f.
La Figura 4.3 muestra el funcionamiento del operador condicional.


4.9. OPERADOR COMA
El operador coma permite combinar dos o más expresiones separadas por comas en una sola línea. Se evalúa primero la expresión de la izquierda y luego las restantes expresiones de izquierda a derecha. La expresión más a la derecha determina el resultado global. El uso del operador coma es como sigue:
expresión , expresión , expresión , . . . , expresión
Cada expresión se evalúa comenzando desde la izquierda y continuando hacia la derecha. Por
ejemplo, en
int i = 10, j = 25;
dado que el operador coma se asocia de izquierda a derecha, la primera variable está declarada e
inicializada antes que la segunda variable j . Otros ejemplos son:
i++, j++ ; equivale u
i++, j++, k++ ; equivale a
i++; j++;
i++; j++; k++;
El operador coma tiene la menor prioridad de todos los operadores C, y se asocia de izquierda
a derecha.
El resultado de la expresión global se determina por el valor de expresión,,. Por ejemplo,
int i, j, resultado;
resultado = j = 10, i = j, ++i;
El valor de esta expresión y valor asignado a resultado es 11. En primer lugar, a j se asigna el
La técnica del operador coma permite operaciones interesantes
i = 1 0 ;
j = (i = 12, i + 8 ) ;
Cuando se ejecute la sección de código anterior, j vale 2 O, ya que i vale 1 O en la primera sentencia, valor 1 o, a continuación a i se asigna el valor de j . Por último, i se incrementa a 1 1 .
en la segunda toma i el valor 12 y al sumar i + 8 resulta 2 O.


4.10. OPERADORES ESPECIALES ( ) [ ]
C admite algunos operadores especiales que sirven para propósitos diferentes. Entre ellos se destacan:
() , [ ] .


4.10.1. El operador ( )
El operador ( ) es el operador de llamada a funciones. Sirve para encerrar los argumentos de una
función, efectuar conversiones explícitas de tipo, indicar en el seno de una declaración que un
identificador corresponde a una función, resolver los conflictos de prioridad entre operadores.


4.10.2. El operador []
Sirve para dimensionar los arrays y designar un elemento de un array.

Ejemplos de ello:
double v[201; / * define un array de 20 elementos * /
printf ("v[2] = %e",v[21); / * escribe el elemento 2 de v * /
return vli-INFERIOR]; / * devuelve el elemento i-INFERIOR * /


4.11. EL OPERADOR SIZEOF
Con frecuencia su programa necesita conocer el tamaño en bytes de un tipo de dato o variable. C
proporciona el operador s i zeo f , que toma un argumento, bien un tipo de dato o bien el nombre de una variable (escalar, array, registro, etc.). El formato del operador es
sizeof (nombre-variabl e)
s i z eo f ( t ipo-da t o )
sizeof(expresión)

No hay comentarios:

Publicar un comentario