FIB Tardor 00 BLA bla de C Preprocesador de C • Prepara el código fuente para el compilador facilitando su trabajo. • Sus directivas empiezan por el carácter especial “#”. • Siempre se indica en la columna 1. • Ayuda a simplificar la programación y el código. • Peligro: • puede abusarse de su uso y quedar un programa difícil de seguir. • puede “engañar”: introducir código dependiente de la máquina, por ejemplo. • Ejemplo: ejecución de código dependiente de la máquina. int e_exec_call(serv_port, interrupt, fname, argp, envp, new_arg_addr, entry, entry_count, #ifdef parisc traced, entry_args) #else traced) #endif Introducció als Sistemes Operatius NO SON APUNTES OFICIALES 1 FIB Tardor 00 BLA bla de C Include #include #include #include #include Introducció als Sistemes Operatius “/users/proj/mach/libcthreads/options.h” <mach/port.h> <mach/message.h> <mach/thread_switch.h> NO SON APUNTES OFICIALES 2 FIB Tardor 00 BLA bla de C Directiva define • Como definición de constantes #define CPROC_RUNNING 0 • Como definición de macros #define MACH_CALL(expr, ret) (ret) = (expr) #define cthread_queue_enq(q, x) \ do { \ (x)->next = 0; \ if ((q)->tail == 0) \ (q)->head = (cthread_queue_item_t) (x); \ else \ (q)->tail->next = (cthread_queue_item_t)(x); \ (q)->tail = (cthread_queue_item_t) (x); \ } while (0) • Como redefinición de funciones #define yield() (void) thread_switch(MACH_PORT_NULL, \ SWITCH_OPTION_DEPRESS, 10) Introducció als Sistemes Operatius NO SON APUNTES OFICIALES 3 FIB Tardor 00 BLA bla de C Sentencia condicional: if (expresión) sentencia1; else sentencia2; • En if's anidados, el else siempre se asocia al if más cercano. • La indentación no tiene significado para el compilador, sólo es una ayuda para el programador. - Por ejemplo: if (exp1) if (ex2) sent1; else sent2; - es lo mismo que: if (exp1) if (ex2) sent1; else sent2; - y lo mismo que: if (exp1) if (ex2) sent1; else sent2; - y lo mismo que: if (exp1) if (ex2) sent1; else sent2; else; Introducció als Sistemes Operatius NO SON APUNTES OFICIALES 4 FIB Tardor 00 BLA bla de C Sentencia condicional • C permite la elección de sentencias alternativas: max = (a > b) ? a : b; - Equivale a: if (a > b) max = a; else max = b; Introducció als Sistemes Operatius NO SON APUNTES OFICIALES 5 FIB Tardor 00 BLA bla de C Sentencia condicional: switch (expresion) 1. Evalúa la expresión de switch. 2. Ejecuta el case cuya constante coincide con el valor encontrado en el paso 1. 3. Termina la sentencia switch cuando encuentra un break o llega el final del switch. switch (c) { case ‘a’: ++a_cnt; break; case ‘b’: ++b_cnt; break; default: ++resto_cnt; } Introducció als Sistemes Operatius NO SON APUNTES OFICIALES 6 FIB Tardor 00 BLA bla de C Sentencia condicional: switch (expresion) (II) switch (c) { case ‘a’:++a_cnt; case ‘A’: ++a_cnt; break; default: ++resto_cnt; } switch (c) { case ‘a’: case ‘A’: ++a_cnt; break; default: ++resto_cnt; } Introducció als Sistemes Operatius NO SON APUNTES OFICIALES 7 FIB Tardor 00 BLA bla de C Sentencia iterativa: for (exp1; exp2; exp3) sentencia; • No es obligatorio ni necesario ninguna de las tres expresiones, aunque sí el “;” que las separa. • Son válidas sintácticamente, pero no significan lo mismo: for (i=0; i<MAX; i++) for (; i<MAX; i++) for (; i<MAX;) for (i=0;; i++) for (i=0;;) for (;;i++) for (;;) • Puede hacerse un uso combinado con sentencias condicionales y break consiguiendo el mismo efecto, de un modo más entrevelado. Introducció als Sistemes Operatius NO SON APUNTES OFICIALES 8 FIB Tardor 00 BLA bla de C Sentencias break y continue • Break causa la salida del bucle más interno en la que se está o de la sentencia switch. while (1) { scanf(“%lf”, &x); if (x < 0.0) \ break; printf(“\n%f”, sqrt(x)); } /* el break salta hasta aqui */ • Continue, sirve para saltar lo que resta de iteración de un bucle y volver a la siguiente iteración. while (1) { scanf(“%lf”, &x); if (x < 0.0) \ continue; printf(“\n%f”, sqrt(x)); /* el continue salta hasta aqui */ } Introducció als Sistemes Operatius NO SON APUNTES OFICIALES 9 FIB Tardor 00 BLA bla de C Tipos de datos simples • enteros, reales, caracteres • Booleano: no existe como tipo: El 0 equivale a FALSO al evaluar una expresión Todo valor diferente de 0 se evalúa como cierto • La asignación es “=” • La igualdad es “==” if (a == 5) /* sera cierto si a vale 5 */ if (a = 5) /* sera siempre cierto */ Introducció als Sistemes Operatius NO SON APUNTES OFICIALES 10 FIB Tardor 00 BLA bla de C Punteros • De cualquier variable se puede acceder al valor o a la dirección: int a; a = 5; /* nos referimos al valor de a */ p = &a; /* nos referimos a la dirección de a */ char *p; /* el valor de p es la dirección de un char */ p = &c; *p = ‘A’; • En la declaración de una variable tipo puntero no va incluido el espacio de la variable a la que apunta y por lo tanto su dirección inicial no es válida int *q; q = malloc(sizeof(int)); *q = 5; Introducció als Sistemes Operatius NO SON APUNTES OFICIALES 11