Preprocesador de C

Anuncio
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
Descargar