25
Estructuras de datos (Prof. Edgardo A. Franco) 1 Tema 09: Operadores y manejo de expresiones en C M. en C. Edgardo Adrián Franco Martínez http://www.eafranco.com [email protected] @edfrancom edgardoadrianfrancom

Clase 13: Operadores y manejo de expresiones en C · Estructuras de datos (Prof. Edgardo A. Franco) 1 Tema 09: Operadores y manejo de expresiones en C ... • Operadores • Precedencia

Embed Size (px)

Citation preview

Estructuras de datos (Prof. Edgardo A. Franco)

1

Tema 09: Operadores y manejo de expresiones en C

M. en C. Edgardo Adrián Franco Martínez http://www.eafranco.com [email protected] @edfrancom edgardoadrianfrancom

Contenido • Operadores • Precedencia de Operadores • Operadores y expresiones aritméticas • Expresiones condicionales; operadores

relacionales y lógicos • Operaciones para el manejo de bits • La librería estándar <math.h>

• Funciones • Constantes

2

09 O

pera

dore

s y m

anej

o de

exp

resio

nes e

n C

Algo

ritm

ia y

pro

gram

ació

n es

truc

tura

da

Prof

. Edg

ardo

Adr

ián

Fran

co M

artín

ez

Operadores • Son palabras o símbolos que implican una acción sobre

ciertas variables.

• Pueden operar de manera: • Unaria (con 1 variable) • Binaria (con 2 variables) • Ternaria (con 3 variables)

• Existen en C operadores: • Aritméticos • Relacionales • Lógicos • De Asignación • De Dirección • De Bits

3

09 O

pera

dore

s y m

anej

o de

exp

resio

nes e

n C

Algo

ritm

ia y

pro

gram

ació

n es

truc

tura

da

Prof

. Edg

ardo

Adr

ián

Fran

co M

artín

ez

Precedencia de Operadores

4

09 O

pera

dore

s y m

anej

o de

exp

resio

nes e

n C

Algo

ritm

ia y

pro

gram

ació

n es

truc

tura

da

Prof

. Edg

ardo

Adr

ián

Fran

co M

artín

ez

Operadores Tipo Asociatividad

( ) [ ] -> Alta prioridad Izquierda a derecha

! ~ ++ -- + - * & (tipo) sizeof Unarios Derecha a izquierda

* / % + - Aritméticos Izquierda a derecha << >> Corrimiento de bits Izquierda a derecha < <= > >= == != Relacionales Izquierda a derecha

& ^ | Bits Izquierda a derecha

&& || Lógicos Izquierda a derecha

?: Condicional Derecha a izquierda

= += -= *= /= %= &= ^= |= <<= >>=

Asignación Derecha a izquierda

, Evaluación Izquierda a derecha

Operadores y expresiones aritméticas

5

09 O

pera

dore

s y m

anej

o de

exp

resio

nes e

n C

Algo

ritm

ia y

pro

gram

ació

n es

truc

tura

da

Prof

. Edg

ardo

Adr

ián

Fran

co M

artín

ez

Operador Nombre Descripción

* Multiplicación 5*2 → 10

/ División 5/2 → 2

% Módulo 5%2 → 1

+ Suma 5+2 → 7

- Resta 5-2 → 3

(tipo de dato) “Cast” forzado (double)5 → 5.0

sizeof(tipo de dato) Tamaño de dato sizeof(int) → 4

Operador Abreviado No Abreviado = a=2; a=2;

++ n++; n=n+1; -- n--; n=n-1; += n+=2; n=n+2; -= n-=2; n=n-2; *= n*=2; n=n*2; /= n/=2; n=n/2; %= n%=2; n=n%2;

6

09 O

pera

dore

s y m

anej

o de

exp

resio

nes e

n C

Algo

ritm

ia y

pro

gram

ació

n es

truc

tura

da

Prof

. Edg

ardo

Adr

ián

Fran

co M

artín

ez Operadores y expresiones de asignación

Expresiones • Son expresiones validas aquellas que utilicen de manera

adecuada algún tipo de operador, y el resultado de su evaluación dependerá del orden de los operadores en la expresión, su prioridad y asociatividad. Expresión en C Significado

a=a+5*b; a=a+(5*b) x*=y+1; x=x*(y+1) x=++n; x=n+1 y n=n+1

y=n--*5+n; y=((n-1)*5)+n y n=n-1 z=n+1*45+10.4E-10*6 z=n+(1*45)+(10.4E-10*6)

z=(n+1)*(45+10.4E-10)*6 z=(n+1)*(45+10.4E-10)*6 x+=x*(10.5E11+x); x=x+(x*10.5E11)+x

b=z=x=10.5; b=10.5 y z=10.5 y x=10.5

7

09 O

pera

dore

s y m

anej

o de

exp

resio

nes e

n C

Algo

ritm

ia y

pro

gram

ació

n es

truc

tura

da

Prof

. Edg

ardo

Adr

ián

Fran

co M

artín

ez

• Son expresiones aritméticas invalidas las siguientes. Expresión en C Posible significado a dar

a=a+5*b=4; a=a+(5*b) y b=4

x*=y+1++; x=x*(y+2)

x=++n--; x=n+1 y n=n-1

y=n--*5++n; y=((n-1)*6)+n y n=n-1

z=n+1*45+10.4x10^-10*6 z=n+(1*45)+(10.4E-10*6)

z=(n+1)*(45+10.4E-10)*6=x

z=(n+1)*(45+10.4E-10)*6 y x=z

++x=x*(10.5E11+x++); x=x+1+x+(x*10.5E11)+x; 8

09 O

pera

dore

s y m

anej

o de

exp

resio

nes e

n C

Algo

ritm

ia y

pro

gram

ació

n es

truc

tura

da

Prof

. Edg

ardo

Adr

ián

Fran

co M

artín

ez

Casting (Moldeado de variables)

• Debido a que el lenguaje C es un lenguaje fuertemente tipificado, es necesario estar consientes de las asignaciones que se realizan entre distintos tipos de datos.

• Aunque sintácticamente el lenguaje permite realizar asignaciones entre variables de distintos tipos de datos es necesario realizar de manera consciente estas asignaciones y apoyarse de la operación de modelado o cast.

9

09 O

pera

dore

s y m

anej

o de

exp

resio

nes e

n C

Algo

ritm

ia y

pro

gram

ació

n es

truc

tura

da

Prof

. Edg

ardo

Adr

ián

Fran

co M

artín

ez

(cast) • b=(int)a; //Antes de realizar la asignación a "b" se moldea a "a" como entero.

• b=(unsigned int)k; //Antes de realizar la asignación a "b" se moldea a "k" como entero sin signo.

• c=(float)g; //Antes de realizar la asignación a "c" se moldea a "g" como flotante.

• c=(char)j; //Antes de realizar la asignación a "c" se moldea a "j" como char.

10

09 O

pera

dore

s y m

anej

o de

exp

resio

nes e

n C

Algo

ritm

ia y

pro

gram

ació

n es

truc

tura

da

Prof

. Edg

ardo

Adr

ián

Fran

co M

artín

ez

Expresiones condicionales; operadores relacionales y lógicos • Si se tienen expresiones entre operadores de

relación, se puede decir que dichas expresiones son condicionales, las cuales a su vez pueden estar unidas mediante operadores lógicos para obtener una condición múltiple.

• Los operadores de relación tienen la misma precedencia y esta esta por debajo de los operadores aritméticos.

• Las expresiones condicionales son evaluadas de izquierda a derecha y si se encuentran operadores lógicos son tratados en ese orden.

11

09 O

pera

dore

s y m

anej

o de

exp

resio

nes e

n C

Algo

ritm

ia y

pro

gram

ació

n es

truc

tura

da

Prof

. Edg

ardo

Adr

ián

Fran

co M

artín

ez

Operadores Relacionales Operador Nombre Descripción

== Igual a if (a==‘s’)

!= Diferente de if (a!=null)

> Mayor que if (a>0.5)

< Menor que if (a<2l)

>= Mayor o igual que if (a>=2f)

<= Menor o igual que if (a<=3) 12

09 O

pera

dore

s y m

anej

o de

exp

resio

nes e

n C

Algo

ritm

ia y

pro

gram

ació

n es

truc

tura

da

Prof

. Edg

ardo

Adr

ián

Fran

co M

artín

ez

Operadores Lógicos

Operador Nombre Descripción

&& Y (AND) if ((a>3) && (a<9))

|| O (OR) if ((a==2) || (a==3))

! NEGADO (NOT)

if (!(a==3)) es igual a if (a!=3)

Importante: Cuando se evaluá una condicional, los valores que se obtienen son:

Si es FALSA se obtiene cero. Si es VERDADERA se obtiene algo diferente de cero.

13

09 O

pera

dore

s y m

anej

o de

exp

resio

nes e

n C

Algo

ritm

ia y

pro

gram

ació

n es

truc

tura

da

Prof

. Edg

ardo

Adr

ián

Fran

co M

artín

ez

Ejemplo de condicionales; operadores relacionales y lógicos #include<stdio.h> #include<math.h> int main(void) { const float pi=3.1416; float distancia,x1=10,y1=11,x2=20,y2=16; //Cálculo de la distancia entre dos puntos distancia=sqrt(pow((x2-x1),2)+pow((y2-y1),2)); if(distancia>0&&x2-x1<0&&y2-y1<0) printf("\nEl punto P2(%.2f,%.2f) esta debajo de P1(%.2f,%.2f)",x2,y2,x1,y1); if(distancia>0&&x2-x1>0&&y2-y1>0) printf("\nEl punto P2(%.2f,%.2f) esta por encima de P1(%.2f,%.2f)",x2,y2,x1,y1); if(distancia==0) printf("\nEl punto P2 y P1 están en las mismas coordenadas(%.2f,%.2f)",x2,y2); return 0; } 14

09 O

pera

dore

s y m

anej

o de

exp

resio

nes e

n C

Algo

ritm

ia y

pro

gram

ació

n es

truc

tura

da

Prof

. Edg

ardo

Adr

ián

Fran

co M

artín

ez

Operaciones para manejo de bits • El lenguaje C proporciona seis operadores para manejo

de bits; sólo pueden ser aplicados a variable integrales, esto es, char, short, int y long, con o sin signo.

• No se debe confundir el operador & con el operador &&, & es el

operador Y sobre bits, && es el operador lógico Y. Similarmente los operadores | y ||.

• El operador unario ~ sólo requiere un argumento a la derecha del operador.

• Los operadores de desplazamiento, >> y <<, mueven todos los bits en una posición hacia la derecha o la izquierda un determinado número de posiciones.

• Como los operadores desplazan bits en un sentido, la computadora trae ceros en el otro extremo. Se debe recordar que un desplazamiento no es una rotación: los bits desplazados en un extremo no vuelven al otro. Se pierden y los ceros traídos los reemplazan.

15

09 O

pera

dore

s y m

anej

o de

exp

resio

nes e

n C

Algo

ritm

ia y

pro

gram

ació

n es

truc

tura

da

Prof

. Edg

ardo

Adr

ián

Fran

co M

artín

ez

Operadores de Bits

Operador Nombre Descripción << Corrimiento a la izquierda b=a>>2;

>> Corrimiento a la derecha b=a<<3;

& Y (AND) entre bits c=a&128;

| O (OR) entre bits c=a|0x0a;

~ Complemento A1 c=~a;

^ O exclusivo (XOR) c=^a; 16

09 O

pera

dore

s y m

anej

o de

exp

resio

nes e

n C

Algo

ritm

ia y

pro

gram

ació

n es

truc

tura

da

Prof

. Edg

ardo

Adr

ián

Fran

co M

artín

ez

Operaciones del manejo de bits • El operador AND de bits (&) a menudo es usado

para enmascarar álgun conjunto de bits.

• El operador OR (|) es empleado para encender bits.

• El operador OR exclusivo (^) pone uno en cada posición donde sus operandos tienen bits diferentes.

• El operador unario (~) realiza el complemento A1; esto es convierte cada bit 1 en un bit 0 y viceversa.

17

09 O

pera

dore

s y m

anej

o de

exp

resio

nes e

n C

Algo

ritm

ia y

pro

gram

ació

n es

truc

tura

da

Prof

. Edg

ardo

Adr

ián

Fran

co M

artín

ez

• Los operadores << y >> realizan corrimientos a nivel de bits, ya sea a la izquierda o derecha.

• Una aplicación que tienen los operadores de desplazamiento de bits es para realizar multiplicaciones y divisiones rápidas con enteros. Como se ve en la siguiente tabla, donde un desplazamiento a la izquierda es multiplicar por 2 y uno a la derecha dividir por 2.

• Los desplazamientos son mucho más rápidos que la multiplicación actual (*) o la división (/) por dos. Por lo tanto, si se quieren multiplicaciones o divisiones rápidas por 2 se usan desplazamientos.

18

09 O

pera

dore

s y m

anej

o de

exp

resio

nes e

n C

Algo

ritm

ia y

pro

gram

ació

n es

truc

tura

da

Prof

. Edg

ardo

Adr

ián

Fran

co M

artín

ez

char x Ejecución Valor de x x = 7; 0 0 0 0 0 1 1 1 7

x << 1; 0 0 0 0 1 1 1 0 14 x << 3; 0 1 1 1 0 0 0 0 112 x << 2; 1 1 0 0 0 0 0 0 192 x >> 1; 0 1 1 0 0 0 0 0 96 x >> 2; 0 0 0 1 1 0 0 0 24

• Multiplicaciones y divisiones por 2 al realizar corrimientos (<< y >>).

19

09 O

pera

dore

s y m

anej

o de

exp

resio

nes e

n C

Algo

ritm

ia y

pro

gram

ació

n es

truc

tura

da

Prof

. Edg

ardo

Adr

ián

Fran

co M

artín

ez

Ejemplo: Operaciones del manejo de bits

#include<stdio.h> int main(void) { int byte=0xFF; printf("\nEl valor de byte es: %4X H",byte); byte&=0x00; printf("\nEl valor de byte es: %4X H",byte); byte|=0xFF; printf("\nEl valor de byte es: %4X H",byte); byte>>=1; printf("\nEl valor de byte es: %4X H",byte); byte<<=2; printf("\nEl valor de byte es: %4X H",byte); return 0; } 20

09 O

pera

dore

s y m

anej

o de

exp

resio

nes e

n C

Algo

ritm

ia y

pro

gram

ació

n es

truc

tura

da

Prof

. Edg

ardo

Adr

ián

Fran

co M

artín

ez

Operadores de Asignación para bits

Operador Abreviado No Abreviado <<= n<<=2; n=n<<2; >>= n>>=2; n=n>>2; &= n&=0x0a; n=n&0x0a; |= n|=7; n=n|7; ^= n^=0x03; n=^0x03; = n=0x7f; n=0x7f;

Nota: 0x7f, 0x0a, 0x03 son un números hexadecimales.

21

09 O

pera

dore

s y m

anej

o de

exp

resio

nes e

n C

Algo

ritm

ia y

pro

gram

ació

n es

truc

tura

da

Prof

. Edg

ardo

Adr

ián

Fran

co M

artín

ez

La librería estándar <math.h> • math.h es un archivo de cabecera de la

biblioteca estándar del lenguaje de programación C diseñado para operaciones matemáticas básicas.

• Muchas de sus funciones incluyen el uso de números en coma flotante.

• Una nota importante: si se está programando en C/C++ bajo Linux, y se utiliza uno de los compiladores nativos de este sistema operativo (gcc o g++), es necesario incluir, al compilar, la opción -lm, dado que, de lo contrario, el compilador generará un error.

22

09 O

pera

dore

s y m

anej

o de

exp

resio

nes e

n C

Algo

ritm

ia y

pro

gram

ació

n es

truc

tura

da

Prof

. Edg

ardo

Adr

ián

Fran

co M

artín

ez

• La biblioteca math.h contiene la definición de muchas funciones matemáticas útiles. El siguiente es un listado breve de algunas funciones.

ceil(x) Redondea al entero más pequeño no menor que x. cos(x)Coseno de x. exp(x) ex. fabs(x)Valor absoluto de x. floor(x)Redondea al entero más grande no mayor que x. log(x)Logaritmo natural de x. log10(x)Logaritmo base 10 de x.

pow(x,y) xy. sin(x) Seno de x. sqrt(x) Raíz cuadrada de x. tan(x)Tangente de x. tanh(x)Tangente hiperbólica de x. cosh(x)Coseno hiperbólico de x. sinh(x) Seno hiperbólico de x. fmod(x) Resto del punto flotante de x.

*Todas las funciones en las que participan ángulos toman y devuelven radianes. *Todas operan con parámetros de tipo double (también se soportan flotantes) y devuelven resultados de tipo double (pueden guardarse como flotantes). 23

09 O

pera

dore

s y m

anej

o de

exp

resio

nes e

n C

Algo

ritm

ia y

pro

gram

ació

n es

truc

tura

da

Prof

. Edg

ardo

Adr

ián

Fran

co M

artín

ez

Constantes <math.h> • La biblioteca de matemáticas define varias

constantes. Siempre es aconsejable usar estas definiciones.

• M_E La base de los logaritmos naturales e. • M_LOG2E El logaritmo de e de base 2. • M_LOG10E El logaritmo de e de base 10. • M_LN2 El logaritmo natural de 2. • M_LN10 El logaritmo natural de 10. • M_PI pi • M_PI_2 pi/2 • M_PI_4 pi/4 • M_1_PI 1/pi • M_2_PI 2/pi • M_2_SQRTPI 2/sqrt(pi) • M_SQRT2 La raíz cuadrada positiva de 2 • M_SQRT1_2 La raíz cuadrada positiva de 1/2

24

09 O

pera

dore

s y m

anej

o de

exp

resio

nes e

n C

Algo

ritm

ia y

pro

gram

ació

n es

truc

tura

da

Prof

. Edg

ardo

Adr

ián

Fran

co M

artín

ez

Ejemplo empleando <math.h> #include<stdio.h> #include<math.h> int main(void) { const float pi=3.1416; float distancia,x1=1.5,y1=-10,x2=2.5,y2=20; //Mostrando la diferencia de exactitud entre pi y M_PI printf("\nEl seno de pi es: %f",sin(pi)); printf("\nEl seno de M_PI es: %f",sin(M_PI)); //Cálculo de la distancia entre dos puntos distancia=sqrt(pow((x2-x1),2)+pow((y2-y1),2)); printf("\nLa distancia entre P2(%.2f,%.2f) y P1(%.2f,%.2f) es: %.4f",x2,y2,x1,y1,distancia); return 0; }

*Su compilación en Linux sería: gcc programa.c –lm –o programa 25

09 O

pera

dore

s y m

anej

o de

exp

resio

nes e

n C

Algo

ritm

ia y

pro

gram

ació

n es

truc

tura

da

Prof

. Edg

ardo

Adr

ián

Fran

co M

artín

ez