Jerarquia de Operadores en C

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 14

JERARQUIA DE OPERADORES EN C-SHARP.

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).

Grupo de operadores
() [] -> .

Orden de
evaluacin

Comentarios

de izquierda Este es el grupo de operadores


a derecha
con mayor prioridad.

! ~ ++ -- + - (tipo) * & de derecha a La refundicin de tipos y sizeof son


sizeof
izquierda
operadores unarios.

*/%

El smbolo "%" denota el operador


de izquierda mdulo, que produce el resto entero
a derecha
obtenido
al
dividir
el
primer
operando por el segundo.

+-

Los operadores aditivos tienen


de izquierda
menor
prioridad
que
los
a derecha
multiplicativos.

<< >>

de izquierda Estos
son
los
operadores
a derecha
desplazamiento bit a bit (q.v.)

< <= > >=

de izquierda
a derecha

== !=

de izquierda
a derecha

&

Este operador y los dos siguientes


de izquierda realizan operaciones lgicas bit a bit,
a derecha
considerando bits individuales de sus
operandos.

de izquierda
a derecha

de izquierda

de

a derecha

&&

Este
operador
y
el
siguiente
de izquierda producen resultados lgicos, pero no
a derecha
consideran bits individuales sino 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 en ltimo
de izquierda lugar (ms a la derecha), y tiene por
tanto el tipo y valor de esta ltima
a derecha
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
calculaa*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.

EJEMPLO DE ESTRUCTURA DE DATOS EN SWICHT DE C-SHARP.

switch (Referencia de C#)


La instruccin switch es una instruccin de control que selecciona una seccin
switch para ejecutarla desde una lista de candidatos.
Una instruccin switch incluye una o ms secciones switch. Cada seccin switch
contiene una o ms etiquetas caseseguidas de una o ms instrucciones. En el ejemplo
siguiente se muestra una instruccin switch simple con tres secciones switch. Cada
seccin switch tiene una etiqueta case, por ejemplo, case 1, y dos instrucciones.
C#
int caseSwitch = 1;
switch (caseSwitch)
{
case 1:
Console.WriteLine("Case 1");
break;
case 2:
Console.WriteLine("Case 2");
break;
default:
Console.WriteLine("Default case");
break;
}

Comentarios
Cada etiqueta case especifica un valor constante. La instruccin switch transfiere el
control a la seccin switch cuya etiqueta case coincide con el valor de la expresin
switch (caseSwitch en el ejemplo). Si ninguna etiqueta case contiene un valor
coincidente, el control se transfiere a la seccin default, si hay alguna. Si no hay
ninguna seccindefault, no se realiza ninguna accin y el control se transfiere fuera de
la instruccin switch. En el ejemplo anterior, las instrucciones en la primera seccin
switch se ejecutan porque case 1 coincide con el valor de caseSwitch.
Una instruccin switch puede incluir cualquier nmero de secciones switch y cada
seccin puede tener una o ms etiquetas case (como se muestra en el ejemplo

siguiente de etiquetas case de una cadena). Sin embargo, las etiquetas case pueden
contener el mismo valor constante.
La ejecucin de la lista de instrucciones en la seccin switch seleccionada comienza
con la primera instruccin y contina a lo largo de la lista de instrucciones,
normalmente hasta que se alcance una instruccin de salto, comobreak, goto
case, return o throw. En este punto, el control se transfiere fuera de la
instruccin switch o a otra etiqueta case.
A diferencia de C++, C# no permite que la ejecucin contine de una seccin switch a
la siguiente. El cdigo siguiente genera un error.
C#
switch (caseSwitch)
{
// The following switch section causes an error.
case 1:
Console.WriteLine("Case 1...");
// Add a break or other jump statement here.
case 2:
Console.WriteLine("... and/or Case 2");
break;
}
C# requiere que el final de las secciones switch, incluida la ltima, sea inalcanzable. Es
decir, a diferencia de otros lenguajes, el cdigo puede no pasar explcitamente a la
siguiente seccin switch. Aunque este requisito se cumple normalmente mediante el
uso de una instruccin break, la siguiente etiqueta case tambin es vlida, porque
asegura que no se pueda llegar al final de la lista de instrucciones.
C#
case 4:
while (true)
Console.WriteLine("Endless looping. . . .");

Ejemplo
En el ejemplo siguiente se muestran los requisitos y las capacidades de una
instruccin switch.
C#
class Program
{
static void Main(string[] args)
{
int switchExpression = 3;
switch (switchExpression)
{
// A switch section can have more than one case label.
case 0:
case 1:
Console.WriteLine("Case 0 or 1");
// Most switch sections contain a jump statement, such as

// a break, goto, or return. The end of the statement


list
// must be unreachable.
break;
case 2:
Console.WriteLine("Case 2");
break;
// The following line causes a warning.
Console.WriteLine("Unreachable code");
// 7 - 4 in the following line evaluates to 3.
case 7 - 4:
Console.WriteLine("Case 3");
break;
// If the value of switchExpression is not 0, 1, 2, or 3, the
// default case is executed.
default:
Console.WriteLine("Default case (optional)");
// You cannot "fall through" any switch section,
including
// the last one.
break;
}
}
}

En el ltimo ejemplo, la variable de cadena, str, y las etiquetas case de la cadena


controlan el flujo de ejecucin.
C#
class SwitchTest
{
static void Main()
{
Console.WriteLine("Coffee sizes: 1=small 2=medium 3=large");
Console.Write("Please enter your selection: ");
string str = Console.ReadLine();
int cost = 0;
// Notice the goto statements in cases 2 and 3. The base cost of
25
// cents is added to the additional cost for the medium and large
sizes.
switch (str)
{
case "1":
case "small":
cost += 25;

break;
case "2":
case "medium":
cost += 25;
goto case "1";
case "3":
case "large":
cost += 50;
goto case "1";
default:
Console.WriteLine("Invalid selection. Please select 1, 2,
or 3.");
break;
}
if (cost != 0)
{
Console.WriteLine("Please insert {0} cents.", cost);
}
Console.WriteLine("Thank you for your business.");
}
}
/*
Sample Input: 2
Sample Output:
Coffee sizes: 1=small 2=medium 3=large
Please enter your selection: 2
Please insert 50 cents.
Thank you for your business.
*/

OTRO EJEMPLO.

60 - Estructura condicional switch

La estructura condicional switch remplaza en algunos casos un conjunto de if.


La estructura del switch:
switch(variable) {
case valor1:

Instrucciones
break;
case valor2:
Instrucciones
break;
case valor3:
Instrucciones
break;

.
.
.
default:
}

Instrucciones
break;

Luego de la palabra clave switch entre parntesis indicamos una variable, luego
con una serie de case verificamos si dicha variable almacena un valor igual a
[valor1, valor2, valor3 etc.] en el caso de ser igual se ejecutan las instrucciones
contenidas en dicho case.
Si todos los case son falsos, luego se ejecutan las instrucciones contenidas
despus de la plabra default.
Problema 1:

Ingresar un valor entero entre 1 y 5. Luego mostrar en castellano el valor


ingresado. Si se ingresa un valor fuera de dicho rango mostrar un mensaje
indicando tal situacin
Programa:

usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
namespaceEstructuraswitch1
{
classProgram
{
staticvoidMain(string[]args)
{
Console.Write("Ingreseunvalorentre
1y5:");

intvalor=
int.Parse(Console.ReadLine());
switch(valor)
{
case1:Console.Write("uno");
break;
case2:Console.Write("dos");
break;
case3:Console.Write("tres");
break;
case4:Console.Write("cuatro");
break;
case5:Console.Write("cinco");
break;
default:
Console.Write("Seingreso
unvalorfueraderango");
break;
}
Console.ReadKey();
}
}
}
Es obligatorio que est entre parntesis la variable luego de la palabra clave
switch.
Luego de cada case debemos indicar el valor con el que se comparar la variable
(siempre debe ser un valor constante y no podemos disponer una variable luego
de la palabra case.
Es necesario la palabra break luego de cada bloque de instrucciones por cada
case.
Problema 2:

Ingresar un nmero entre uno y cinco en castellano. Luego mostrar en formato


numrico. Si se ingresa un valor fuera de dicho rango mostrar un mensaje
indicando tal situacin

Programa:

usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
namespaceEstructuraswitch2
{
classProgram
{
staticvoidMain(string[]args)
{
Console.Write("Ingreseunnmeroen
castellanoentreunoycinco:");
stringnro=Console.ReadLine();
switch(nro)
{
case"uno":Console.Write(1);
break;
case"dos":Console.Write(2);
break;
case"tres":Console.Write(3);
break;
case"cuatro":Console.Write(4);
break;
case"cinco":Console.Write(5);
break;
default:Console.Write("Debe
ingresarunvalorentreunoycinco");
break;
}
Console.ReadKey();
}
}
}

Esto quiere decir que podemos utilizar en el switch variables string para ser
comparadas.

También podría gustarte