Programación : C (2)

Transcripción

Programación : C (2)
Programación : C (2)
Dr. J.B. Hayet
CENTRO DE INVESTIGACIÓN EN MATEMÁTICAS
Agosto 2013
,
J.B. Hayet
Programación, Agosto 2013
1 / 52
Outline
1
C : overview
2
Operadores
3
C : estructuras de control
,
J.B. Hayet
Programación, Agosto 2013
2 / 52
C : overview
Outline
1
C : overview
2
Operadores
3
C : estructuras de control
,
J.B. Hayet
Programación, Agosto 2013
3 / 52
C : overview
Un poco de historia
Concebido en 1972 por
Dennis Richie y Ken
Thompson (Bell Labs),
después del B.
Inicialmente era para
desarrollar UNIX.
,
J.B. Hayet
Programación, Agosto 2013
4 / 52
C : overview
Un poco de historia
Formalizado por Brian Kernighan y Dennis Richie en su libro
The C Programming language (el K&R) en 1978.
Adquiere muchı́sima importancia en los años 1980 (tomando el
lugar de Fortran).
Normalizado por el ANSI (American National Standards
Institute) 1983-1989 (C89) : el ANSI C.
Norma recuperada tal cual por la ISO (International Standards
Organization) en 1990 (C90).
,
J.B. Hayet
Programación, Agosto 2013
5 / 52
C : overview
Un poco de historia
En 1999 : C99 (cambios en directivas al preprocesador, nuevas
palabras llaves, declaraciones dentro del código, inline, arreglos
de tamaño variable. . . ). Se acerca de C++.
Nueva versión del estándar desde finales de 2011: C11
http://www.open-std.org/jtc1/sc22/wg14/www/docs/
n1494.pdf
Soporte para multi-threading.
gets quitado del lenguaje.
Estructuras/uniones anónimas.
...
,
J.B. Hayet
Programación, Agosto 2013
6 / 52
C : overview
Un poco de historia
Ahora, si el estándar define unas cosas, no necesariamente les tiene
el compilador. Por ejemplo, con gcc 4.6:
“A fourth version of the C standard, known as C11, was published in
2011 as ISOIEC 9899:2011. GCC has limited incomplete support for
parts of this standard, enabled with -std=c11 or
-std=iso9899:2011.”
(default: gnu89, similar a C90)
,
J.B. Hayet
Programación, Agosto 2013
7 / 52
C : overview
Lenguajes interpretados y compilados
En un lenguaje interpretado, código convertido en
instrucciones ejecutables al momento mismo de la ejecución.
En un lenguaje compilado, código traducido en instrucciones
ejecutables una vez por todas.
C es una lenguaje compilado (la gran mayorı́a del tiempo) pero
existen interpretadores también
http://root.cern.ch/drupal/content/cint
,
J.B. Hayet
Programación, Agosto 2013
8 / 52
C : overview
Caracterı́sticas del C
+ Lenguaje de “bajo” nivel entre los de “alto” nivel.
+ Eficiente.
+ Adaptado a operaciones sistema, accesos directos a la
memoria, control del bajo nivel (herencia de su creación. . . ).
+ Gran control y libertad del programador (memoria,. . . ).
+ Comunidad inmensa, mucho soporte.
,
J.B. Hayet
Programación, Agosto 2013
9 / 52
C : overview
Caracterı́sticas del C
- Requiere esfuerzos del programador (liberación de memoria,
verificación de indices. . . ).
- Tal cual no permite manejar cadenas de caracteres o
estructuras de alto nivel.
- Librerı́a estándar reducida.
- No muy adaptado a proyectos requiriendo programación
orientada a objetos.
,
J.B. Hayet
Programación, Agosto 2013
10 / 52
C : overview
Compilación
Preprocesador
.c
Ensamblaje
Compilacion
.i
.s
Edicion de ligas
.o
EJECUTABLE
.o
.o
El pre-procesador trata el código mismo (#define,#include)
(.i).
La compilación transforma el código en ensamblador (.s).
El ensamblaje transforma el ensamblador en lenguaje
maquina, se obtiene un archivo objeto (.o).
La edición de ligas combina varios archivos objeto para hacer
un ejecutable.
,
J.B. Hayet
Programación, Agosto 2013
11 / 52
C : overview
Compilación
Ej: con functionCode.c, functionCode.h, main.c
gcc -c functionCode.c -o functionCode.o
gcc -c main.c -o main.o
gcc main.o functionCode.o -o test
,
J.B. Hayet
Programación, Agosto 2013
12 / 52
C : overview
Compilación
Pre-procesamiento
#i n c l u d e < s t d i o . h>
#d e f i n e CONSTANT 5
i n t main ( ) {
p r i n t f ( ”My c o n s t a n t i s %d” ,CONSTANT ) ;
return 0;
}
,
J.B. Hayet
Programación, Agosto 2013
13 / 52
C : overview
Elementos del lenguaje
Identificadores : nombre de variables, de structs, de labels, de
funciones.
Palabras llaves : nombres de tipos, de estructuras de control,
calificadores de tipos, de almacenamiento.
Constantes y nombres de macros sustituidas por el
preprocesador : definidas por DEFINE.
Cadenas de caracteres.
Operadores : +,*. . .
Puntuación.
Comentarios : /* Comentario */ (o // Comentario a partir de
C99)
,
J.B. Hayet
Programación, Agosto 2013
14 / 52
C : overview
Expresiones
Las instrucciones son una serie de expresiones
sintácticamente correctas terminadas por un “;”.
Declaración de variables :
int a ;
double d ;
Definición y uso de variables :
a = 1;
d = 2 . 1 ∗ a+a ∗ a ;
,
J.B. Hayet
Programación, Agosto 2013
15 / 52
C : overview
Constantes enteras
Varias maneras de escribir las constantes
Decimal
i n t x =100;
Octal (introducido por 0)
i n t x =0144;
Hexadecimal (introducido por 0x)
i n t x=0x64 ;
Se puede poner sufijos para indicar que la constante es long
(l o L) o unsigned (u o U).
,
J.B. Hayet
Programación, Agosto 2013
16 / 52
C : overview
Constantes enteras
Ejemplo de código inocente en apariencia pero incorrecto:
int x = 09;
main.c:7:11: error: invalid digit "9" in octal constant
,
J.B. Hayet
Programación, Agosto 2013
17 / 52
C : overview
Constantes flotantes
Representación mantisa-exponente (cf. clase 1).
Por default en double.
Puede ser modificada en long double (con L) o en float
(con F).
Ejemplos :
12.34
1 2 . 3 e−4
12.34F
12.34L
double
double
float
long double
(long double: en general, 80 bits)
,
J.B. Hayet
Programación, Agosto 2013
18 / 52
C : overview
Funciones
Forma general:
t i p o m i f u n c i o n ( t i p o 1 arg1 , t i p o 2 arg2 , . . . ) {
d e c l a r a c i o n e s de v a r i a b l e s i n t e r n a s
instrucciones
return a l g o d e t i p o t i p o ;
}
Son la base de la estructuración de un programa.
,
J.B. Hayet
Programación, Agosto 2013
19 / 52
C : overview
Funciones
Ejemplo:
int
computeSum ( i n t a , i n t b ) {
i n t sum = 0 ;
sum = a+b ;
r e t u r n sum ;
}
,
J.B. Hayet
Programación, Agosto 2013
20 / 52
C : overview
Funciones
Un programa en C es esencialmente un conjunto de
códigos de funciones.
Durante la ejecución del programa, la estructura de las
funciones llamándose una a otra es la de una pila.
Arriba de la pila es la primera función a llamarse, la función
main(), que tiene que estar definida en cualquier programa.
,
J.B. Hayet
Programación, Agosto 2013
21 / 52
Operadores
Outline
1
C : overview
2
Operadores
3
C : estructuras de control
,
J.B. Hayet
Programación, Agosto 2013
22 / 52
Operadores
Operadores aritméticos
Operadores aritméticos : +,-,/,*,%
Cuidado al / es a la vez división entera y división en flotantes :
si los dos operadores son enteros, hará una división entera; si
no, una división entre flotantes.
Para otros operadores matemáticos, ver math.h.
,
J.B. Hayet
Programación, Agosto 2013
23 / 52
Operadores
Operadores aritméticos
Error clásico
i n t i =1, j =2;
double medio = i / j ;
Solución: convertir cualquier de los operandos a un flotante.
,
J.B. Hayet
Programación, Agosto 2013
24 / 52
Operadores
lvalue y rvalue
Una lvalue es un valor al cual se puede asociar una dirección
en memoria : son las únicas que se puede poner a la izquierda
de una afectación “=”.
Los rvalue son tipicamente resultados de operaciones
matemáticas, como están en los registros de la CPU, pero no
guardados en memoria.
i es una lvalue, 2*i no es (es una rvalue).
,
J.B. Hayet
Programación, Agosto 2013
25 / 52
Operadores
Operadores de relación
¿ Qué dice ?
i n t main ( ) {
i n t a =0, b =1;
i f (a = b)
p r i n t f ( ”\n a y b s o n i g u a l e s \n” ) ;
else
p r i n t f ( ”\n a y b s o n d i f e r e n t e s \n” ) ;
return 0;
}
,
J.B. Hayet
Programación, Agosto 2013
26 / 52
Operadores
Operadores de relación
Cuidado a la diferencia entre == (relación) y =
(afectación).
Operadores >, <, >=, <=, ==, ! =.
Cuidado a valores flotantes muy cercanos (cf. clase 1).
,
J.B. Hayet
Programación, Agosto 2013
27 / 52
Operadores
Operadores lógicos
&& : AND
|| : OR
! : NOT
La evaluación regresa un int que vale 1 si la expresión lógica es
true, 0 si no.
Evaluación de izquierda a la derecha en caso de grupo de
expresiones :
i f ( ( i >= 0 ) && ( i <= 9 ) &&
! ( a [ i ] == 0 ) && ( b [ i ] >3)) {
...
,
J.B. Hayet
Programación, Agosto 2013
28 / 52
Operadores
Operadores lógicos
Pensar el orden de las expresiones !
para que expresiones eventualmente peligrosas no estén
evaluadas si una pre-condición no está verificada,
para ganar en eficiencia (i.e. descartar casos)
i f ( ( f r e q u e n t l y V i o l a t e d P r e c o n d i t i o n ) &&
( lessFrequentlyViolayedPrecondition )) {
...
}
,
J.B. Hayet
Programación, Agosto 2013
29 / 52
Operadores
Operadores lógicos sobre los bits
& : AND
| : OR
ˆ: XOR
˜: NOT
<< y >> : shift de los bits a la izquierda o a la derecha;
agrega ceros al final o al principio del numero según el caso.
No confundir con operadores booleanos.
,
J.B. Hayet
Programación, Agosto 2013
30 / 52
Operadores
Operadores lógicos sobre los bits
Cuidado con el tamaño de los datos
unsigned char c1 =128;
unsigned char c2=c1 <<1;
p r i n t f ( ”%d\n” , c2 ) ;
Cuidado con el signo de los datos
char c3 =127;
char c4=c3 <<1;
p r i n t f ( ”%d\n” , c4 ) ;
Un shift hacia la derecha no afecta el signo
char c5 =−127;
char c6=c5 >>1;
p r i n t f ( ”%d\n” , c6 ) ;
,
J.B. Hayet
Programación, Agosto 2013
31 / 52
Operadores
Aplicaciones : multiplicaciones y divisiones
En regla general, para no tener problemas, usar esos operadores
de shift con tipos no signados (unsigned).
Usar los operadores de shift para multiplicar/dividir por
potencias de 2 (pero con cuidado) puede ser mas rápido que
usar operadores aritméticos.
,
J.B. Hayet
Programación, Agosto 2013
32 / 52
Operadores
Aplicaciones : conjuntos de flags
En un programa, se puede proponer una serie de opciones que
podemos activar o no para nuestras funciones. Una idea es asociar
a cada una un bit de un número suficientemente grande.
#d e f i n e
#d e f i n e
#d e f i n e
#d e f i n e
#d e f i n e
FLAG
FLAG
FLAG
FLAG
FLAG
X
1
2
3
4
0
1
2
4
8
,
J.B. Hayet
Programación, Agosto 2013
33 / 52
Operadores
Aplicaciones : conjuntos de flags
Verificar si unos flags están activados
v o i d f u n c i o n ( unsigned i n t
{
i f ( f l a g s != 0 )
{
i f ( ( f l a g s & FLAG
// E l p r i m e r f l a g
i f ( ( f l a g s & FLAG
// E l p r i m e r f l a g
...
}
else
// FLAG X
flags )
1)
es
2)
es
!=0 )
activado
!=0 )
activado
Formar un entero con unos flags dados :
f u n c i o n ( FLAG 1 | FLAG 2 ) ;
J.B. Hayet
,
Programación, Agosto 2013
34 / 52
Operadores
Operadores de afectación compuesta
+=
−=
∗=
/=
%=
&=
ˆ=
|=
<<=
>>=
Por ejemplo, a+ = b es equivalente a a = a + b. La ventaja es que
el término de la izquierda solo es evaluado una vez
,
J.B. Hayet
Programación, Agosto 2013
35 / 52
Operadores
Operadores de incrementación
Incrementan/decrementan el valor de enteros. Pueden ser pre-fijos o
post-fijos
int a = 3 , b , c ;
b = ++a ;
/∗ a y b v a l e n 4 ∗/
c = b++;
/∗ c v a l e 4 y b v a l e 5 ∗
útiles en estructuras de tipo loop.
,
J.B. Hayet
Programación, Agosto 2013
36 / 52
Operadores
Operador condicional ?
Es un operador con tres operandos (el único del lenguaje!!)
c o n d i c i ó n ? haz1 : haz2 ;
Si la condición se cumple ’haz1’, si no ’haz2’.
m = (( a > b) ? a : b );
,
J.B. Hayet
Programación, Agosto 2013
37 / 52
Operadores
Operador de cast
Para convertir objetos de un tipo a otro se usa el operador de cast,
que se usa :
type1 b = . . . ;
type2 a = ( type2 ) b ;
,
J.B. Hayet
Programación, Agosto 2013
38 / 52
Operadores
Operador de cast
El cast puede ser necesario para realizar unas operaciones que
tendrı́an otro sentido sin el cast:
i n t i =1, j =2;
double medio = ( double ) i / j ;
,
J.B. Hayet
Programación, Agosto 2013
39 / 52
Operadores
Cast automático
Operadores pueden estar aplicados con operandos de diferentes
tipos: las variables de tipo mas pequeño están convertidas al tipo
mas grande entre los operandos. En caso de la afectación, el valor
de la derecha está convertido en el tipo del operando de la izquierda.
int i = 8;
int j ;
float x = 12.3;
double y ;
y = i ∗ x;
j = i ∗ x;
,
J.B. Hayet
Programación, Agosto 2013
40 / 52
Operadores
Cast automático
Reglas:
1
Entre dos enteros : char y short están convertidos en int; luego,
la computadora elige el tipo mas largo.
int ,
2
3
unsigned i n t ,
long ,
unsigned long
Entre un entero y un flotante, se convierte el entero en el tipo
flotante.
Entre dos flotantes, se convierte el operando menos largo en el
tipo mas largo :
float ,
double ,
long double
Cuidado a los overflows.
,
J.B. Hayet
Programación, Agosto 2013
41 / 52
Operadores
Cast automático
Efectos de borde al uso de datos heterogeneos
unsigned long a = 2 3 ;
s i g n e d char b = −23;
p r i n t f ( ” a %c b\n” , a<b ? ’< ’ : ( a==b ? ’= ’ : ’> ’ ) ) ;
(cf. Gandhi)
,
J.B. Hayet
Programación, Agosto 2013
42 / 52
Operadores
Operador de dirección
Dirección memoria de un objeto con el operador & :
type1 b = . . . ;
t y p e 1 ∗ a = &b ;
,
J.B. Hayet
Programación, Agosto 2013
43 / 52
Operadores
Prioridades entre operadores
Prioridad
Operadores
1 (la mas fuerte )
()
2
! ++ −−
3
∗ / %
4
+ −
5
< <= > >=
6
== ! =
7
&&
8
||
9 (la menos fuerte) = + = − = ∗ = / = % =
Con operadores de misma prioridad, evaluación de la izquierda a la
derecha.
Si dudas, usar paréntesis !
,
J.B. Hayet
Programación, Agosto 2013
44 / 52
Operadores
Prioridades entre operadores
Ejemplo
i n t a =2;
i n t b =2;
p r i n t f ( ”%d” ,!−−a==!b ) ;
Para mejor lisibilidad, usar paréntesis.
Ejemplo
X ∗= Y + 1 ;
X ∗= Y + 1 ;
<=>
no e q u i v a l e a
X = X ∗ (Y + 1 ) ;
X = X ∗ Y + 1;
,
J.B. Hayet
Programación, Agosto 2013
45 / 52
C : estructuras de control
Outline
1
C : overview
2
Operadores
3
C : estructuras de control
,
J.B. Hayet
Programación, Agosto 2013
46 / 52
C : estructuras de control
if. . . then. . . else. . .
Evaluación condicional
i f ( expresion1 )
instruccionbloque1
else i f ( expresion2 )
instruccionbloque2
...
else i f ( expresionn )
instruccionbloquen
else
instruccionbloquedefault
P.D. : Un bloque con mas de una instrucción tiene que estar
rodeado de {}
,
J.B. Hayet
Programación, Agosto 2013
47 / 52
C : estructuras de control
switch
¿Cuánto vale b al final ?
i n t a =1;
int b ;
switch ( a ) {
case 1 :
b =5;
case 2 :
b =9;
default :
b=3
break ;
}
,
J.B. Hayet
Programación, Agosto 2013
48 / 52
C : estructuras de control
switch
switch ( e x p r e s i o n ) {
case v a l o r 1 :
instruccionbloque1
break ;
case v a l o r 2 :
instruccionbloque2
break ;
...
case v a l o r n :
instruccionbloquen
break ;
default :
instruccionbloquedefault
break ;
}
,
J.B. Hayet
Programación, Agosto 2013
49 / 52
C : estructuras de control
while
i = 2;
while ( i < 5) {
p r i n t f ( ”\n i = %d” , i ++);
}
No entra en la evaluación si la condición no es OK.
i = 2;
do {
p r i n t f ( ”\n i = %d” , i ++);
} while ( i < 5 ) ;
Entra en la evaluación y no sigue el ciclo si la condición no está
respetada.
,
J.B. Hayet
Programación, Agosto 2013
50 / 52
C : estructuras de control
for
Instrucción(es) de principio - Condición(es) de terminación Instrucción(es) de incremento
f o r ( i = 0 ; i < 5 ; i ++)
p r i n t f ( ”\n i = %d” , i ) ;
,
J.B. Hayet
Programación, Agosto 2013
51 / 52
C : estructuras de control
break/continue
Al interior de ciclos, permite salir de estos.
i = 2;
do {
p r i n t f ( ”\n i = %d” , i ++);
i f ( i ==6)
break ;
} while ( i < 100);
Al interior de ciclos, permite saltar al próximo ciclo.
f o r ( i = 0 ; i < 5 ; i ++)
i f ( i %2==1)
c o nt i n ue ;
p r i n t f ( ”\n i = %d” , i ) ;
}
,
J.B. Hayet
Programación, Agosto 2013
52 / 52

Documentos relacionados