10 operadores y manejo de expresiones en c · como se ve en la siguiente tabla, donde un...

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

Upload: others

Post on 01-May-2020

9 views

Category:

Documents


0 download

TRANSCRIPT

Estructuras de datos (Prof. Edgardo A. Franco)

1

Tema 10: Operadores y manejo de expresiones en C

M. en C. Edgardo Adrián Franco Martínez http://[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

• Constantes2

10

Op

erad

ore

s y

man

ejo

de

exp

resi

on

es e

n C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

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

10

Op

erad

ore

s y

man

ejo

de

exp

resi

on

es e

n C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

Precedencia de Operadores

4

10

Op

erad

ore

s y

man

ejo

de

exp

resi

on

es e

n C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

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

10

Op

erad

ore

s y

man

ejo

de

exp

resi

on

es e

n C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

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

10

Op

erad

ore

s y

man

ejo

de

exp

resi

on

es e

n C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

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 suevaluación dependerá del orden de los operadores en laexpresió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

10

Op

erad

ore

s y

man

ejo

de

exp

resi

on

es e

n C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

• Son expresiones aritméticas invalidas lassiguientes.

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

10

Op

erad

ore

s y

man

ejo

de

exp

resi

on

es e

n C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

Casting (Moldeado de variables)

• Debido a que el lenguaje C es un lenguajefuertemente tipificado, es necesario estarconsientes de las asignaciones que se realizan entredistintos tipos de datos.

• Aunque sintácticamente el lenguaje permite realizarasignaciones entre variables de distintos tipos dedatos es necesario realizar de manera conscienteestas asignaciones y apoyarse de la operación demodelado o cast.

9

10

Op

erad

ore

s y

man

ejo

de

exp

resi

on

es e

n C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

(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

10

Op

erad

ore

s y

man

ejo

de

exp

resi

on

es e

n C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

Expresiones condicionales; operadores relacionales y lógicos

• Si se tienen expresiones entre operadores derelación, se puede decir que dichas expresionesson condicionales, las cuales a su vez puedenestar unidas mediante operadores lógicos paraobtener una condición múltiple.

• Los operadores de relación tienen la mismaprecedencia y esta esta por debajo de losoperadores aritméticos.

• Las expresiones condicionales son evaluadas deizquierda a derecha y si se encuentranoperadores lógicos son tratados en ese orden.

11

10

Op

erad

ore

s y

man

ejo

de

exp

resi

on

es e

n C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

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

10

Op

erad

ore

s y

man

ejo

de

exp

resi

on

es e

n C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

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

10

Op

erad

ore

s y

man

ejo

de

exp

resi

on

es e

n C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

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

10

Op

erad

ore

s y

man

ejo

de

exp

resi

on

es e

n C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

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 eloperador Y sobre bits, && es el operador lógico Y. Similarmentelos operadores | y ||.

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

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

• Como los operadores desplazan bits en un sentido, lacomputadora trae ceros en el otro extremo. Se debe recordarque un desplazamiento no es una rotación: los bits desplazadosen un extremo no vuelven al otro. Se pierden y los ceros traídoslos reemplazan.

15

10

Op

erad

ore

s y

man

ejo

de

exp

resi

on

es e

n C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

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

10

Op

erad

ore

s y

man

ejo

de

exp

resi

on

es e

n C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

Operaciones del manejo de bits

• El operador AND de bits (&) a menudo es usadopara enmascarar álgun conjunto de bits.

• El operador OR (|) es empleado para encenderbits.

• El operador OR exclusivo (^) pone uno en cadaposición donde sus operandos tienen bitsdiferentes.

• El operador unario (~) realiza el complementoA1; esto es convierte cada bit 1 en un bit 0 yviceversa. 17

10

Op

erad

ore

s y

man

ejo

de

exp

resi

on

es e

n C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

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

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

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

10

Op

erad

ore

s y

man

ejo

de

exp

resi

on

es e

n C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

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 realizarcorrimientos (<< y >>).

19

10

Op

erad

ore

s y

man

ejo

de

exp

resi

on

es e

n C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

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

10

Op

erad

ore

s y

man

ejo

de

exp

resi

on

es e

n C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

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

10

Op

erad

ore

s y

man

ejo

de

exp

resi

on

es e

n C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

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

biblioteca estándar del lenguaje deprogramación C diseñado para operacionesmatemáticas básicas.

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

• Una nota importante: si se está programando enC/C++ bajo Linux, y se utiliza uno de loscompiladores nativos de este sistema operativo(gcc o g++), es necesario incluir, al compilar, laopción -lm, dado que, de lo contrario, elcompilador generará un error. 22

10

Op

erad

ore

s y

man

ejo

de

exp

resi

on

es e

n C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

• La biblioteca math.h contiene la definiciónde muchas funciones matemáticas útiles. Elsiguiente es un listado breve de algunasfunciones.

ceil(x) Redondea al entero máspequeñ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ásgrande 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

10

Op

erad

ore

s y

man

ejo

de

exp

resi

on

es e

n C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

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

constantes. Siempre es aconsejable usar estasdefiniciones.

• 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

10

Op

erad

ore

s y

man

ejo

de

exp

resi

on

es e

n C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

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

10

Op

erad

ore

s y

man

ejo

de

exp

resi

on

es e

n C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez