Sie sind auf Seite 1von 8

Operadores en C/C++ - Operadores Aritmticos

El concepto de operador aritmtico en el sentido matemtico se traduce bien a su


contrapartida informtica. Un operador aritmtico es un smbolo que indica al compilador
el clculo que deseamos realizar; ese clculo afectar a uno o ms valores, llamados
operandos, y producir un cierto resultado. Por ejemplo, el operador suma (+) admite dos
operandos, los sumandos, y produce como resultado la suma de ambos. Los operadores
aritmticos, junto con las constantes y variables numricas, permiten formar expresiones
anlogas a las algebricas habituales. Estas expresiones son traducidas por el compilador al
cdigo mquina correspondiente, que se ejecuta con objeto de calcular el valor de la
expresin en cuestin. La lista de operadores arimticos en C es la siguiente:

Smbol
Nombre Comentarios
o

El tipo del resultado es el tipo del factor de mayor


precisin; por ejemplo, si se multiplica un entero int por
un float, el resultado es de tipo float Si se multiplican
Multiplicaci
* int, el resultado es de tipo int, etc.. Este proceso de
n
promocin de tipos para evaluar la expresin tiene por
objeto mantener en lo posible la informacin almacenada en
el valor de mayor precisin empleado en sa expresin.

El tipo del resultado es el tipo del operando de mayor


precisin; por ejemplo, si se divide un entero int por un
float, el resultado es de tipo float. La divisin de enteros
Divisin /
produce un entero, que es el cociente entero de la divisin
(sin decimales). La divisin de dos valores float o double
produce, respectivamente, un valor float o double.

Slo es aplicable a variables enteras, produce el resto de la


Mdulo %
divisin entera.

El tipo del resultado es el tipo del sumando de mayor


precisin. El operador suma admite valores enteros y reales.
Suma +
Este operador, a diferencia de lo que ocurre en otros
lenguajes, no denota la concatenacin de cadenas.

Resta - Su comportamiento es anlogo al del operador suma. El tipo


del resultado es el tipo del valor de mayor precisin. Como
curiosidad, el operador - antepuesto a una variable numrica
sirve para cambiar su signo, en el sentido matemtico
habitual. Se trata de un operador unario, esto es, de un
operador que admite un nico argumento.

La forma general de una expresin de asignacin simple es


como sigue:
lvalue = rvalue;
en donde rvalue y lvalue son dos expresiones tales que
el resultado obtenido al evaluar rvalue es compatible con
la variable sealada por el resultado de evaluar lvalue. En
el caso de una variable, el lvalue es la direccin de la
misma. Los siguientes son ejemplos vlidos de expresiones
de asignacin:
x = 3;
x = x + y;
x = strcat(cad_1, cad_2);
x = (y == 7);
La evaluacin de este tipo de expresiones se realiza en
varias fases:

Evaluacin del rvalue.


Asignacin =
Evaluacin del lvalue.

Copia del valor obtenido al evaluar el rvalue en la


variable cuya direccin es el resultado de evaluar el
lvalue.

Las expresiones de asignacin son, en s, expresiones: al ser


evaluadas, producen como resultado el valor del rvalue.
Por tanto, tiene sentido la expresin de asignacin
compuesta:
x = y = z = t = 7;
que dar el valor 7 a lasvariables x, y, z y t. El operador
de asignacin tiene menor prioridad que todos los
operadores aritmticos, con objeto de asegurar que antes de
asignar un valor se calcule correctamente la expresin
correspondiente.

PRIORIDADES DE OPERADORES.

Tabla de Prioridades de operadores.


Uso de parntesis.

Operador de asignacin: Distincin entre = y ==.

Tabla de prioridades de operadores.


Lo que sigue es la lista de operadores de C, ordenados segn su prioridad. En caso de que
una expresin contenga ms de un operador de igual prioridad, la evaluacin se realizar
segn el orden que se indica en la columna central. Por ejemplo, si se encuentran dos
operadores de desplazamiento (>> y <<), la evaluacin se har de izquierda a derecha. Pero
si se encuentran dos operadores de suma con asignacin (+=), entonces la evaluacin se
realizar de derecha a izquierda (se evala primero la expresin situada ms a la derecha).

Orden de
Grupo de operadores Comentarios
evaluacin
de izquierda Este es el grupo de operadores con mayor
() [] -> .
a derecha prioridad.
! ~ ++ -- + - (tipo) * & de derecha a La refundicin de tipos y sizeof son operadores
sizeof izquierda unarios.
El smbolo "%" denota el operador mdulo, que
de izquierda
*/% produce el resto entero obtenido al dividir el
a derecha
primer operando por el segundo.
de izquierda Los operadores aditivos tienen menor prioridad
+-
a derecha que los multiplicativos.
de izquierda Estos son los operadores de desplazamiento bit a
<< >>
a derecha bit (q.v.)
de izquierda
< <= > >=
a derecha
de izquierda
== !=
a derecha
Este operador y los dos siguientes realizan
de izquierda
& operaciones lgicas bit a bit, considerando bits
a derecha
individuales de sus operandos.
de izquierda
^
a derecha
de izquierda
|
a derecha
Este operador y el siguiente producen resultados
de izquierda
&& lgicos, pero no consideran bits individuales sino
a derecha
el valor global del operando.
de izquierda
||
a derecha
de derecha a
?:
izquierda
= += -= *= /= %= &= de derecha a
^= |= <<= >>= izquierda
Este es el operador de menor prioridad en C.
Sirve para separar una coleccin de expresiones,
que se irn evaluando de izquierda a derecha. El
resultado es el producido por la expresin situada
de izquierda en ltimo lugar (ms a la derecha), y tiene por
,
a derecha tanto el tipo y valor de esta ltima expresin. Se
emplea a veces en expresiones de control; un
ejemplo sera la clusula de iniciacin de un for
o la clusula de mantenimiento de iteracin de un
while.

Uso de parntesis.
Cuando el compilador genera el cdigo que se emplea para evaluar una expresin, hace uso
de la informacin textual de que dispone, pero no "reconoce" la expresin, como puede
hacerlo un ser humano. Las unicas reglas que se aplican son las de prioridad de operadores
expuestas en la tabla anterior. Sin embargo, C nos permite especificar sin ambigedad el
orden de evaluacin deseado; esto se hace empleando parntesis. Los parntesis que estn
anidados con ms profundidad sern los primeros en evaluarse. Vese un ejemplo.

La idea es bien sencilla: el operador parntesis fuerza la evaluacin de su contenido,


elevando su prioridad con respecto a todos los dems operadores, salvo el propio operador
parntesis en el caso de que se encuentre ms profundamente anidado. Los parntesis no
estropean nada, y aseguran que el compilador entienda exactamente lo mismo que el
programador. Cuando en una expresin aparecen dos o ms subexpresiones entre parntesis
de igual prioridad, se realiza la evaluacin de izquierda a derecha. Vase un ejemplo.

Operador de asignacin: Distincin entre = y ==.


Es muy frecuente cometer el error consistente en confundir dos operadores distintos pero de
aspecto similar:
El operador de asignacin, "="
Y el operador de comparacin, "=="
Estos dos operadores, binarios ambos, admiten como operandos dos expresiones, y
producen un resultado. Este resultado es completamente distinto:

El operador de asignacin, "=", produce como resultado el valor calculado para la


expresin situada a su derecha. Por ejemplo, en valor de la expresin a = 7; es,
precisamente, 7.

Por su parte, el operador de comparacin, "==", produce como resultado un valor


lgico (verdadero o falso) que es verdadero si los dos operandos tienen igual valor,
y falso en caso contrario. Por ejemplo, a == 7; producir el valor lgico verdadero
(un valor numrico no nulo) si el valor de a es precisamente siete, y el valor lgico
falso (un cero) si el valor de a no es siete.

Como puede apreciarse, las expresiones a = 7; y a == 7; producen resultados


completamente distintos... pero existe un grave peligro. En efecto, qu ocurre si se evala
el resultado de estas expresiones desde el punto de vista lgico? Esto es, qu resultados
obtendremos si se utiliza el resultado de estas expresiones como variable de control en una
sentencia if():
if( a == 7)
printf("a vale 7");
else
printf("a no vale 7);

if (a = 7)
printf("a vale 7");
else
printf("a no vale 7);

Como puede observarse, en la primera expresin el resultado ser siempre correcto: a == 7


solo es no nulo si a vale 7. Pero en la segunda, el resultado de evaluar a = 7 ser siempre 7.
Luego pasan dos cosas:

a siempre recibir el valor 7, lo cual no se desea en absoluto y es un error lgico

Adems, siempre se imprimir en pantalla "a vale 7", que puede no ser cierto;
esto ocurre porque 7 es no nulo y por tanto se toma como un valor lgico verdadero.

Como decamos, esta es una fuente de errores muy comn. El compilador no puede
detectarlos, porque tanto a = 7 como a == 7 son expresiones completamente correctas.
Afortunadamente, basta invertir el orden de la expresin para que el compilador detecte un
error:
if( 7 == a)
printf("a vale 7");
else
printf("a no vale 7);

if (7 = a)
printf("a vale 7");
else
printf("a no vale 7);

La expresin 7 == a es vlida; se tienen dos operandos para el operador de comparacin.


Pero la expresin 7 = a es sintcticamente incorrecta, porque 7 no es un nombre vlido de
variable. El compilador seala un error. Por tanto, para evitar este tipo de errores, debemos
adoptar la costumbre de situar siempre las constantes a la izquierda cuando se utilice el
operador "==". De este modo, si olvidamos un "=", el compilador detecta el error.

Asignaciones mltiples
Como se ha indicado, el resultado de una asignacin es el valor de la expresin situada a la
derecha. Esto permite escribir expresiones de la forma
a = b = c;
en donde primero se evala c; a continuacin se asigna c a b, y por ltimo se asigna b a a.
Vase el oportuno Ejemplo.

Ejercicio.- Verificar las reglas de prioridad de operadores, empleando parntesis para


efectuar un clculo elemental. Comprobar los resultados obtenidos tanto al emplear
parntesis como al no hacer uso de ellos.
#include <stdio.h>

void main(void)
{
int cociente, a, b, c, d;
printf ("Parntesis y prioridad de operadores\n\n");
cociente = 0;
a = 10; b = 4; c = 5; d = 1;
cociente = (a*b)/(c+d);
printf("Empleando parntesis,cociente vale %d\n",cociente);
cociente = 0; a = 10; b = 4; c = 5; d = 1;
cociente = a*b/c+d;
printf("Sin emplear parntesis,cociente vale %d\n",cociente);
}

/*
Resultados:

Parntesis y prioridad de operadores

Empleando parntesis,cociente vale 6


Sin emplear parntesis,cociente vale 9

*/
Comentario.- El primer caso no tiene dificultad; los parntesis hacen de igual prioridad los
dos lados del rvalue y se evala la expresin de izquierda a derecha (vase el siguiente
ejercicio). En el segundo caso, el operador de multiplicacin y el de divisin tienen igual
prioridad, y el operador suma tiene menor prioridad que los anteriores. Por tanto, se
evalan primero las subexpresiones relativas a operadores de mayor prioridad. Dado que la
prioridad de * y / es la misma, se evala de izquierda a derecha, luego se calcula a*b.
Acto seguido se divide el resultado por c. Por ltimo, a*b/c se suma con d.

Ejercicio.- Estudiar la evaluacin de expresiones a igualdad de prioridades, en el caso de


parntesis. Comprobar que la evaluacin se efecta de izquierda a derecha.
#include <stdio.h>

void main(void)
{
int num, cociente, a, b, c, d;
printf ("Evaluacin de expresiones\n\n");
a = 10; b = 4; c = 5; d = 1; num = 0;
cociente = (num = a*b)/(num + c + d);
printf("Cociente vale %d\n", cociente);
printf("\n\nTerminacin normal del programa.\n");
}
/*
Salida obtenida:
Evaluacin de expresiones
Cociente vale 0
Terminacin normal del programa.
*/

Comentario.- El resultado es 0, luego se evala de izquierda a derecha. Si fuera de derecha


a izquierda,el denominador hara uso del valor nulo de num, y el resultado no sera cero sino
6.

Ejemplo.- Comprobar los resultados de una confusin entre el operador "=" y el operador
"==".
#include <stdio.h>
void main(void)
{
int a, b, c;
printf ("Confusin del operador = con el operador ==\n\n");
a = 1; b = 2; c = 3;
a = b == c;
printf("El resultado de comparar b = %d y c = %d es a = %d\n\n",
b, c, a);
a = b = c;
printf("El resultado de ASIGNAR c = %d a b = %d a a es a = %d\n\n", c,
b, a);
printf("\n\nTerminacin normal del programa.\n\n");
}

/*
Confusin del operador = con el operador ==

El resultado de comparar b = 2 y c = 3 es a = 0

El resultado de ASIGNAR c = 3 a b = 3 a a es a = 3

Terminacin normal del programa.


*/

Comentarios.- Obsrvese que 0 denota falso, y 3 denota verdadero. Por tanto, la asignacin
dara lugar a un valor incorrecto para a, que no sera detectado.

Das könnte Ihnen auch gefallen