![]() | ![]() |
Un operador sirve para manipular datos. Los hay de varios tipos: de asignaciуn, de relaciуn, lуgicos, aritmйticos y de manipulaciуn de bits. En realidad los nombres tampoco importan mucho; aquн lo que queremos es aprender a programar, no aprender un montуn de nombres.
Este es un operador que ya hemos visto en el capнtulo de Tipos de Datos. Sirve para dar un valor a una variable. Este valor puede ser un nъmero que tecleamos directamente u otra variable:
a = 3; /* Metemos un valor directamente */ o a = b; /* Le damos el valor de una variable */
Podemos dar valores a varias variables a la vez:
a = b = c = 10; /* Damos a las variables a,b,c el valor 10 */
Tambiйn podemos asignar a varias variables el valor de otra de un sуlo golpe:
a = b = c = d; /* a,b,c toman el valor de d */
Los operadores aritmйticos son aquellos que sirven para realizar operaciones tales como suma, resta, divisiуn y multiplicaciуn.
Si quieres saber cуmo usar funciones matemбticas mбs complejas (exponentes, raнces, trigonomйtricas) vete al capнtulo correspondiente.
Este operador permite sumar variables:
#include <stdio.h> int main() { int a = 2; int b = 3; int c; c = a + b; printf ( "Resultado = %i\n", c ); }
El resultado serб 5 obviamente.
Por supuesto se pueden sumar varias variables o variables mбs constantes:
#include <stdio.h> int main() { int a = 2; int b = 3; int c = 1; int d; d = a + b + c + 4; printf ( "Resultado = %i\n", c ); }
El resultado es 10.
Podemos utilizar este operador para incrementar el valor de una variable:
x = x + 5;
Pero existe una forma abreviada:
x += 5;
Esto suma el valor 5 al valor que tenнa la variable x. Veamos un ejemplo:
#include <stdio.h> int main() { int x, y; x = 3; y = 5; x += 2; printf( "x = %i\n", x ); x += y; /* esto equivale a x = x + y */ printf( "x = %i\n", x ); }
Resultado:
x = 5 x = 10
Este operador equivale a sumar uno a la variable:
#include <stdio.h> int main() { int x = 5; printf ( "Valor de x = %i\n", x ); x++; printf ( "Valor de x = %i\n", x ); }
Resultado:
Valor de x = 5 Valor de x = 6
Se puede poner antes o despuйs de la variable.
Este operador tiene dos usos, uno es la resta que funciona como el operador suma y el otro es cambiar de signo.
Resta:
x = x - 5;
Para la operaciуn resta se aplica todo lo dicho para la suma. Se puede usar tambiйn como: x -= 5;.
Pero tambiйn tiene el uso de cambiar de signo. Poniendolo delante de una variable o constante equivale a multiplicarla por -1.
#include <stdio.h> int main() { int a, b; a = 1; b = -a; printf( "a = %i, b = %i\n", a, b ); }
Resultado: a = 1, b = -1. No tiene mucho misterio.
Es equivalente a ++ pero en vez de incrementar disminuye el valor de la variable. Equivale a restar uno a la variable.
Este operador sirve para multiplicar y funciona de manera parecida a los anteriores.
Tambiйn sirve para definir y utilizar punteros, pero eso lo veremos mбs tarde.
Este funciona tambiйn como los anteriores pero hay que tener cuidado. Si dividimos dos nъmero en coma flotante (tipo float) tenemos las divisiуn con sus correspondientes decimales. Pero si dividimos dos enteros obtenemos un nъmero entero. Es decir que si dividimos 4/3 tenemos como resultado 1. El redondeo se hace por truncamiento, simplemente se eliminan los decimales y se deja el entero.
Si dividimos dos enteros el resultado es un nъmero entero, aunque luego lo saquemos por pantalla usando %f o %d no obtendremos la parte decimal.
Cuando dividimos dos enteros, si queremos saber cual es el resto (o mуdulo) usamos el operador %, que vemos mбs abajo.
Si con el anterior operador obtenнamos el mуdulo o cociente de una divisiуn entera con йste podemos tener el resto. No funciona mбs que con enteros, no vale para nъmeros float o double.
Cуmo se usa:
#include <stdio.h> int main() { int a, b; a = 18; b = 5; printf( "Resto de la divisiуn: %d \n", a % b ); }
Los operadores de condiciуn se utilizan para comprobar las condiciones de las sentencias de control de flujo (las estudiaremos en el capнtulo sentencias).
Cuando se evalъa una condiciуn el resultado que se obtiene es 0 si no se cumple y un nъmero distinto de 0 si se cumple. Normalmente cuando se cumplen devuelven un 1.
Los operadores de comparaciуn son:
== | igual que | se cumple si son iguales |
!= | distinto que | se cumple 1 si son diferentes |
> | mayor que | se cumple si el primero es mayor que el segundo |
< | menor que | se cumple si el primero es menor que el segundo |
>= | mayor o igual que | se cumple si el primero es mayor o igual que el segundo |
<= | menor o igual que | se cumple si el primero es menor o igual que el segundo |
Veremos la aplicaciуn de estos operadores en el capнtulo Sentencias. Pero ahora vamos a ver unos ejemplos:
#include <stdio.h> int main() { printf( "10 > 5 da como resultado %i\n", 10>5 ); printf( "10 > 5 da como resultado %i\n", 10>5 ); printf( "5== 5 da como resultado %i\n", 5==5 ); printf( "10==5 da como resultado %i\n", 10==5 ); }
No sуlo se pueden comparar constantes, tambiйn se pueden comparar variables.
Estos son los que nos permiten unir varias comparaciones: 10>5 y 6==6. Los operadores lуgicos son: AND (&&), OR (||), NOT(!).
Operador && (AND, en castellano Y): Devuelve un 1 si se cumplen dos condiciones.
printf( "Resultado: %i", (10==10 && 5>2 );
Operador || (OR, en castellano O): Devuelve un 1 si se cumple una de las dos condiciones.
Operador ! (NOT, negaciуn): Si la condiciуn se cumple NOT hace que no se cumpla y viceversa.
Ver el capнtulo Sentencias, secciуn Notas sobre las condiciones para mбs informaciуn.
En esta secciуn voy a describir lo que son los bytes y los bits. No voy a descubrir nada nuevo, asн que la mayorнa se podrбn saltar esta secciуn.
Supongo que todo el mundo sabe lo que son los bytes y los bits, pero por si acaso allб va. Los bits son la unidad de informaciуn mбs pequeсa, digamos que son la base para almacenar la informaciуn. Son como los бtomos a las molйculas. Los valores que puede tomar un bit son 0 у 1. Si juntamos ocho bits tenemos un byte.
Un byte puede tomar 256 valores diferentes (de 0 a 255). їCуmo se consigue esto? Imaginemos nuestro flamante byte con sus ocho bits. Supongamos que los ocho bits valen cero. Ya tenemos el valor 0 en el byte. Ahora vamos a darle al ъltimo byte el valor 1.
00000001 -> 1
Este es el uno para el byte. Ahora vamos a por el dos y el tres:
00000010 -> 2 00000011 -> 3
y asн hasta 255. Como vemos con ocho bits podemos tener 256 valores diferentes, que en byte corresponden a los valores entre 0 y 255.
Ya hemos visto que un byte son ocho bits. Pues bien, con los operadores de bits podemos manipular las variables por dentro. Los diferentes operadores de bits son:
Operador | Descripciуn |
| | OR (O) |
& | AND (Y) |
^ | XOR (O exclusivo) |
~ | Complemento a uno o negaciуn |
>> | Desplazamiento a la derecha |
<< | Desplazamiento a la izquierda |
Operador | (OR):
Toma los valores y hace con ellos la operaciуn OR. Vamos a ver un ejemplo:
#include <stdio.h> int main() { printf( "El resultado de la operaciуn 235 | 143 es: %i\n", 235 | 143 ); }
Se obtiene:
El resultado de la operaciуn 235 | 143 es: 239
Veamos la operaciуn a nivel de bits:
235 -> 11101011 143 -> 10001111 | 239 -> 11101111
La operaciуn OR funciona de la siguiente manera: Tomamos los bits dos a dos y los comparamos si alguno de ellos es uno, se obtiene un uno. Si ambos son cero el resultado es cero. Primero se compara los dos primeros (el primero de cada uno de los nъmeros, 1 y 1 -> 1), luego la segunda pareja (1 y 0 -> 1) y asн sucesivamente.
Operador & (AND):
Este operador compara los bits tambiйn dos a dos. Si ambos son 1 el resultado es 1. Si no, el resultado es cero.
#include <stdio.h> int main() { printf( "El resultado de la operaciуn 170 & 155 es: %i\n", 170 & 155 ); }
Tenemos:
El resultado de la operaciуn 170 & 155 es: 138
A nivel de bits:
170 -> 10101010 155 -> 10011011 & 138 -> 10001010
Operador ^ (XOR):
Compara los bits y los pone a unos si son distintos.
235 -> 11101011 143 -> 10001111 ^ 100 -> 01100100
Operador ~ (Complemento a uno):
Este operador acepta un sуlo dato (operando) y pone a 0 los 1 y a 1 los 0, es decir los invierte. Se pone delante del operando.
#include <stdio.h> int main() { printf( "El resultado de la operaciуn ~152 es: %i\n", ~152 ); } El resultado de la operaciуn ~152 es: 103
152 -> 10011000 ~ 103 -> 01100111
Operador >> (Desplazamiento a la derecha):
Este operador mueve cada bit a la derecha. El bit de la izquierda se pone a cero, el de la derecha se pierde. Si realizamos la operaciуn inversa no recuperamos el nъmero original. El formato es:
variable o dato >> nъmero de posiciones a desplazar
El nъmero de posiciones a desplazar indica cuantas veces hay que mover los bits hacia la derecha. Ejemplo:
#include <stdio.h> int main() { printf( "El resultado de la operaciуn 150 >> 2 es: %i\n", ~152 ); } El resultado de la operaciуn 150 >> 2 es: 37
Veamos la operaciуn paso a paso. Esta operaciуn equivale a hacer dos desplazamientos a la derecha:
150 -> 10010110 Nъmero original 75 -> 01001011 Primer desplazamiento. Entra un cero por la izquierda, el cero de la derecha se pierde y los demбs se mueven a la derecha. 37 -> 00100101 Segundo desplazamiento.
NOTA: Un desplazamiento a la izquierda equivale a dividir por dos. Esto es muy interesante porque el desplazamiento es mбs rбpido que la divisiуn. Si queremos optimizar un programa esta es una buena idea. Sуlo sirve para dividir entre dos. Si hacemos dos desplazamientos serнa dividir por dos dos veces, no por tres.
Operador << (Desplazamiento a la izquierda):
Funciona igual que la anterior pero los bits se desplazan a la izquierda. Esta operaciуn equivale a multiplicar por 2.
Este es un operador muy ъtil. Nos permite conocer el tamaсo en bytes de una variable. De esta manera no tenemos que preocuparnos en recordar o calcular cuanto ocupa. Ademбs el tamaсo de una variable cambia de un compilador a otro, es la mejor forma de asegurarse. Se usa poniendo el nombre de la variable despuйs de sizeof y separado de un espacio:
#include <stdio.h> int main() { int variable; printf( "Tamaсo de la variable: %i\n", sizeof variable ); }
Tambнen se puede usar con los especificadores de tipos de datos (char, int, float, double...). Pero en йstos se usa de manera diferente, hay que poner el especificador entre parйntesis:
#include <stdio.h> int main() { printf( "Las variables tipo int ocupan: %i\n", sizeof(int) ); }
Existen ademбs de los que hemos visto otros operadores. Sin embargo ya veremos en sucesivos capнtulos lo que significa cada uno.
Debemos tener cuidado al usar operadores pues a veces podemos tener resultados no esperados si no tenemos en cuenta su orden de evaluaciуn. Vamos a ver la lista de precedencias, cuanto mбs arriba se evalъa antes:
Precedencia |
() [] -> . |
! ~ ++ -- (molde) * & sizeof (El * es el de puntero) |
* / % (El * de aquн es el de multiplicaciуn) |
+ - |
<< >> |
< <= > >= |
== != |
& |
^ |
| |
&& |
|| |
?: |
= += -= *= /= |
, |
Por ejemplo imaginemos que tenemos la siguiente operaciуn:
10 * 2 + 5
Si vamos a la tabla de precedencias vemos que el * tiene un orden superior al +, por lo tanto primero se hace el producto 10*2=20 y luego la suma 20+5=25. Veamos otra:
10 * ( 2 + 5 )
Ahora con el parйntesis cambia el orden de evaluaciуn. El que tiene mayor precedencia ahora es el parйntesis, se ejecuta primero. Como dentro del parйntesis sуlo hay una suma se evalъa sin mбs, 2+5=7. Ya solo queda la multiplicaciуn 10*7=70. Otro caso:
10 * ( 5 * 2 +3 )
Como antes, el que mayor precedencia tiene es el parйntesis, se evalъa primero. Dentro del parйntesis tenemos producto y suma. Como sabemos ya se evalъa primero el producto, 5*2=10. Seguimos en el parйntesis, nos queda la suma 10+3=13. Hemos acabado con el parйntesis, ahora al resto de la expresiуn. Cogemos la multiplicaciуn que queda: 10*13=130.
Otro detalle que debemos cuidar son los operadores ++ y --. Estos tienen mayor precedencia que las demбs operaciones aritmйticas (+, -, *, /, %). Por ejemplo:
10 * 5 ++
Puede parecer que primero se ejecutarб la multiplicaciуn y luego el ++. Pero si vamos a la tabla de precedencias vemos que el ++ estб por encima de * (de multiplicaciуn), por lo tanto se evaluarб primero 5++=6. 10*6=60.
Es mejor no usar los operadores ++ y -- mezclados con otros, pues a veces obtenemos resultados inesperados. Por ejemplo:
#include <stdio.h> int main() { int a, b; a = 5; b = a++; printf( "a = %i, b = %i\n", a, b ); }
Este ejemplo en unos compiladores darб a = 6, b = 5 y en otros a = 6 y b = 6. Por favor si podeis, escribidme diciendo quй valores os salen a vosotros y quй compilador usais.
Para asegurarse lo mejor serнa separar la lнnea donde se usa el ++ y el =:
#include <stdio.h> int main() { int a, b; a = 5; a++; b = a; printf( "a = %i, b = %i\n", a, b ); }
Ejercicio 1: En este programa hay un fallo muy gordo y muy habitual en programaciуn. A ver si lo encuentras:
#include <stdio.h> int main() { int a, c; a = 5; c += a +5; }
Soluciуn:
Cuando calculamos el valor de 'c' sumamos a+5 ( =10 ) al valor de 'c'. Pero resulta que 'c' no tenнa ningъn valor indicado por nosotros. Estamos usando la variable 'c' sin haberle dado valor. En algunos compiladores el resultado serб inesperado. Este es un fallo bastante habitual, usar variables a las que no hemos dado ningъn valor.
Ejercicio 2: їCual serб el resultado del siguiente programa?
#include <conio.h> #include <stdio.h> int main() { int a, b, c; a = 5; b = ++a; c = ( a + 5 * 2 ) * ( b + 6 / 2 ) + ( a * 2 ); printf( "%i, %i, %i", a, b, c ); }
Soluciуn:
El resultado es 156. En la primera a vale 5. Pero en la segunda se ejecuta b = ++a = ++5 = 6. Tenemos a = b = 6.
Ejercicio 3: Escribir un programa que compruebe si un numero es par o impar.
Solucion:
#include <stdio.h>
int main() {
char palabra[100];
int a;
a = 124;
if ( a % 2 == 0 )
printf( "%d es par\n", a );
else
printf( "%d es impar\n", a );
printf( "\n" );
system( "pause" );
return 0;
}
Fichero: cap5_ejercicio3.c
Para comprobar si un numero es par o impar podemos usar el operador '%'. Si al calcular el resto de dividir un numero por 2 el resultado es cero eso indica que el numero es par. Si el resto es distinto de cero el numero es impar.
© Gorka Urrutia