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