Los operadores son símbolos
que indican cómo se deben manipular los operandos. Los operadores
junto
con los operandos forman una expresión,
que es una fórmula que define el cálculo de un valor. Los
operandos pueden ser constantes, variables o llamadas a funciones, siempre
que éstas devuelvan algún valor. El compilador evalúa
los operadores, algunos de izquierda a derecha,
otros de derecha a izquierda, siguiendo un orden de precedencia. Este orden
se puede alterar utilizando paréntesis para forzar al compilador
a evaluar primero las partes que se deseen.
Tipos de operadores:
![]() |
Aritméticos. |
![]() |
Casting. |
![]() |
Monarios. |
![]() |
Relacionales y Lógicos. |
![]() |
Asignación. |
![]() |
Condicional. |
![]() |
Tratamiento de bits. |
![]() |
Punteros. |
![]() |
Secuencial. |
![]() |
Acceso a estructuras y uniones. |
![]() |
[ ] y ( ). |
|
|
|
adición |
|
sustracción |
|
multiplicación |
|
división |
|
resto de división entera |
NOTA: El
% a veces es llamado operador módulo.
2) Si la división es entre dos números en coma flotante el resultado será otro número en coma flotante.
3) Si la división es entre un número entero y otro en coma flotante, el resultado será un número en coma flotante.
4) Si la división
tiene algún operando negativo, o los dos, entonces la división
entera (entre dos números enteros) estará truncada hacia
cero, esto quiere decir que el resultado será siempre menor en valor
absoluto que el verdadero cociente.
El lenguaje permite cambiar el tipo de una variable a través
del operador de casting , que se emplea anteponiendo al operando el nombre
del tipo requerido, encerrado entre paréntesis:
![]() |
|
![]() |
Son operadores que actúan sobre un sólo operando
para producir un nuevo valor. En C todas las constantes numéricas
son positivas. Por tanto, un número negativo es en realidad una
expresión,
que consiste en el operador monario menos (-), seguido de una constante
numérica positiva. No
debemos confundir este menos, con el de la operación de la sustracción,
el cual requiere dos operandos.
Otros dos operadores monarios
interesantes son:
++ | Que es el operador incremento, hace que su operando se incremente en uno. |
-- | Que es el operador decremento, hace que el operando se decremente en uno. |
NOTA: El
operador incremento y el de decremento son operadores monarios y de asignación,
por tanto, en el apartado Asignación
los volvemos a mencionar.
Otro operador monario digno de mención
es el operador de tamaño: sizeof.
Éste devuelve la longitud en bytes del operando, que puede ser una
variable o un especificador de tipo (en este caso, debe ir encerrado entre
paréntesis).
Por último, decir que cast
(visto
anteriormente en el apartado Casting),
puede ser considerado un operador monario.
Los operadores lógicos y relacionales
tratan con valores verdaderos y falsos. Una expresión
con
operadores lógicos o relacionales devuelven siempre un valor verdadero
o falso. El lenguaje interpreta un valor verdadero cuando es diferente
de cero, y falso cuando es igual a cero. Los diferentes operadores de este
tipo que existen son:
|
|
|
mayor que |
|
mayor o igual que |
|
menor que |
|
menor o igual que |
|
igual |
|
distinto |
|
AND lógico |
|
OR lógico |
|
NOT lógico |
NOTA: Los
operadores tienen un orden de precedencia, pudiéndose diferenciar
de mayor a menor precedencia, en caso de igualdad de precedencia todos
se asocian de izquierda a derecha (excepto los monarios, los condicionales,
y los de asignación, que lo hacen de derecha a izquierda), esto
quiere decir que si la asociatividad es de izquierda a derecha, y se nos
presentan operadores con la misma precedencia, comenzaremos a mirar los
operadores más a la izquierda, e iremos avanzando hacia la derecha,
dicho esto presentamos los distintos grupos de operadores:
Dado que el lenguaje interpreta como falso el valor cero, y
como verdadero cualquier valor diferente de cero, se pueden emplear operadores
aritméticos en las expresiones lógicas y de comparación.
Se utiliza el operador
=, dentro de una asignación, para asignar
valores a una variable. Tiene el siguiente formato:
![]() |
|
![]() |
![]() |
|
![]() |
![]() |
|
![]() |
|
|
|
incremento unario |
|
decremento unario |
|
asignación simple |
|
asignación de la multiplic. |
|
asignación de la división |
|
asignación del resto |
|
asignación de la suma |
|
asignación de la resta |
|
asignación del desplazam. a la izquierda |
|
asignación del desplazam. a la derecha |
|
asignación de la operación AND |
|
asignación de la operación OR |
|
asignación de la operación XOR |
Cuando se evalúa una expresión
se obtiene un tipo de resultado que depende de los operandos. Si un operador
tiene operandos de tipos diferentes, éstos se convierten a tipo
según una jerarquía preestablecida. Las conversiones aritméticas
implícitas se realizan mediante la siguiente secuencia, y en ese
orden:
IMPORTANTE: Cuando se realiza
una asignación de variables de diferentes tipos, el valor del lado
derecho se ajusta al tipo de variable del lado izquierdo de la expresión.
Este operador (?:) se utiliza para reemplazar estructuras sencillas
de decisión. Si se desea que una instrucción determinada
se ejecute según una cierta condición, se emplea este operador
ternario de la siguiente forma:
![]() |
|
![]() |
Primero se evalúa la <condición>.
Si es verdadera, se evalúa la <expresión-v>. Si es falsa, se evalúa la <expresión-f>. |
El C proporciona un grupo de operadores de manipulación
de bits. Estos operadores son:
|
|
|
operación AND. |
|
operación OR. |
|
operación XOR. |
|
desplazam. a la derecha. |
|
desplazam. a la izquierda. |
Estos operadores sólo pueden usarse con los tipos int y char y funcionan bit a bit. El operador de desplazamiento se puede utilizar para realizar multiplicaciones o divisiones rápidas, pues cada desplazamiento a la izquierda multiplica por 2, y cada desplazamiento a la derecha divide por 2. El C distingue entre desplazamientos aritméticos y lógicos:
En temas posteriores entraremos más a fondo sobre ellos,
ya que son una parte imprescindible del lenguaje. De ellos sólo
diremos que los operadores unitarios * y
& se utilizan con punteros. Cuando se
evalúa el operador unitario &,
se obtiene la dirección del operando. El operador *,
al evaluarse, devuelve el valor de la variable a la que apunta el operando;
por lo tanto, el operando debe ser un puntero.
El operador secuencial (,) se utiliza para concatenar varias
expresiones. El lado izquierdo de la coma siempre se evalúa primero.
Ejemplo:
Este apartado, al igual que en el de los Punteros,lo
trataremos en un tema posterior. Sólo decir que los operadores
.
y ->
se utilizan para
acceder a los campos de uniones o de estructuras. Cuando un puntero apunta
a una estructura, se emplea el operador ->
para acceder a los campos, y el operador .
se utiliza en otro caso.
Los corchetes se utilizan para acceder a los diferentes elementos
de una matriz (se verá posteriormente en temas sucesivos). Para
seleccionar un elemento se necesita un índice que indique la posición
a utilizar. Los paréntesis se pueden utilizar dentro de las expresiones
para modificar el orden de evaluación predeterminado por el lenguaje.
Ejemplo
de operadores Aritméticos:
Supongamos que
a y b son
variables de tipo carácter que representan los caracteres P y F
respectivamente, si realizamos las siguientes operaciones obtendremos:
b 70 a+b 150 a+b+7 157 a+b+'7' 205
Ejemplos
del operador Casting:
Supongamos que i
es una variable entera con un valor de 3, y f
un variable de coma flotante con un valor de 4.5. La expresión:
Supongamos que
i es una variable entera, y f
una
variable de coma flotante.
Supongamos que i es una variable
entera con valor de 7, f una variable de coma
flotante con valor de 5.5 y c una variable
de carácter que representa la 'w'.
|
|
|
|
cierto | 1 |
|
falso | 0 |
|
cierto | 1 |
|
cierto | 1 |
|
falso | 0 |
|
cierto | 1 |
|
cierto | 1 |
|
falso | 0 |
|
cierto | 1 |
|
falso | 0 |
Ejemplos
del operador de Asignación:
Supongamos que i y
j
son variables enteras, con los valores de 5 y 7, respectivamente; f
y
g
variables
de coma flotante con valores de 5.5 y -3.25 respectivamente; x,y
y
z,
tienen los valores 2, 3 y 4 respectivamente:
|
|
|
|
i=i+5 | 10 |
|
f=f-g | 8.75 |
|
j=j*(i-3) | 14 |
|
f=f/3 | 1.833333 |
|
i=i%(j-2) | 0 |
|
3 (ya que i es variable entera). | |
|
-3 (ya que i es variable entera) | |
|
120 | |
|
24 | |
|
x=x*(-2*(y+z)/3) | 8 |
(1): 'x'
corresponde al carácter ASCII número 120, y el '0' corresponde
al 48.
NOTA: Como hemos
podido suponer el valor que tenía inicialmente i,
por ejemplo en (1),
es machacado cuando se le asigna otro valor final.
Ejemplos
del operador Condicional:
(f<g)?f:g
c+=(a>0 && a<=10)?++a:a/b;
Si a,
b y c
poséen los valores 1, 2 y 3, respectivamente, entonces, al evaluar
la expresión condicional obtendremos el valor de 2 (ya que evaluaremos
la expresión ++a),
y posteriormente a c se
le asignará el valor de 5 (ya que la asignación sería:
c=3+2).