Вы находитесь на странице: 1из 41

Introduccin al lenguaje C

Juan C. Dueas <jcduenas@dit.upm.es> Joaqun Seoane <jseoane@dit.upm.es> T. de Miguel <tmiguel@dit.upm.es> A. Gmez Flechoso <anto@dit.upm.es> Dpto. Ingeniera de Sistemas Telemticos Universidad Politcnica de Madrid
El lenguaje C, diapositiva 1 (22/08/06)

dit UPM

Objetivos
Leer y escribir programas en ANSI C 1. Tipos de datos simples 2. Estructuras de control 3. Funciones 4. Datos estructurados 5. Punteros 6. Preprocesador

El lenguaje C, diapositiva 2 (22/08/06)

dit UPM

Historia de C

BCPL (1967), B (1970) no tipados, de sistemas. C (Ritchie, 1972), tipado, para SO porttiles. Ligado a UNIX desde 1973. ANSI-C (1989). ISO-C (1990). C99 (1999) Objective C. C++ (Stroustrup-Bell Labs- 1980s), orientado a objetos. Java (Gosling, 1997), orientado a objetos. Inicialmente empotrados, reorientado hacia Internet. Independiente de la plataforma. C# (Microsoft)

El lenguaje C, diapositiva 3 (22/08/06)

dit UPM

Caractersticas de C

C no es orientado a objetos:

No tiene clases, ni herencia, ni polimorfismo, ni objetos, ni mtodos, ni excepciones

C suele compilarse a lenguaje mquina:

Suele ser ms rpido que Java (en mquina virtual)

C es un lenguaje para programacin de sistemas:


Bajo nivel, poco tipado, inseguro Acceso directo a primitivas del SO (llamadas al sistema) Gestin de memoria explcita en C (programador) El compilador de C hace pocas comprobaciones de tipos Los fallos suelen detectarse en tiempo de ejecucin (depurador imprescindible para programador de C)

El lenguaje C, diapositiva 4 (22/08/06)

dit UPM

Estructura de un programa
// Rutinas.java public class Rutinas { static void rutina() {} public static void main(String[]args) { int i, N; N= Integer.parseInt(args[0]); for (i=0; i<N; i++) rutina(); System.out.println(i); } /* rutinas.c */ #include <stdlib.h> #include <stdio.h> void rutina(void) {} int main(int argc,char* argv[]){ int i, N; N = atoi(argv[1]); for (i=0; i<N; i++)rutina(); printf("%d\n", i); exit(0); }

$> javac Rutinas.java $> java Rutinas 10000000

$> gcc rutinas.c o rutinas $> ./rutinas 10000000

El lenguaje C, diapositiva 5 (22/08/06)

dit UPM

Tipos de datos

Fundamentales:

enteros reales enumerados array puntero estructura unin

Derivados:

El lenguaje C, diapositiva 6 (22/08/06)

dit UPM

Tipos fundamentales

Similares en Java:

void /* representa la nada o un tipo indefinido */ char c = s; /* entero 8 bits, suele representar un carcter */ int i = 25; /* entero de 16 32 bits */ float f = 0.56; /* coma flotante de precisin simple */ double d = 0.56; /* coma flotante de doble precisin */ En C no existe boolean! (las expresiones lgicas devuelven int) (C99 tiene boolean y complex) Tamao: short, long, long long (C99) Signo: signed, unsigned (en Java no hay unsigned) sizeof(char) = 1 sizeof (short) <= sizeof (int) <= sizeof (long) <= sizeof(long long) >= 2 >= 2 >= 4 >= 8

Modificadores enteros:

Tamao y rangos de cada tipo dependen de la plataforma


El lenguaje C, diapositiva 7 (22/08/06)

dit UPM

Conversiones y operadores
x Igual que en Java:

Conversin de tipos:

Implcita, promocin al de ms rango: int + float = float Explcita: (double) integer Aritmticos (+ - * / %) Relacionales y lgicos (> >= < <= == != && || !) Manejo de bits (& | ^ << >> ~) Incremento/decremento (i++ ++i --i) Evaluacin condicional (a>b) ? a : b Son operadores: a = b + 1; x = y = z = 3; u = (v = x) + y Combinables con otros operadores: i += 2; mask <<= 3;

Operadores:

Asignaciones

El lenguaje C, diapositiva 8 (22/08/06)

dit UPM

Estructuras de control
xIgual que en Java:

Bloques:

Sentencias simples terminan en ; Sentencia compuesta: bloque {}

Control de flujo:

Condicionales (if-else) Decisin mltiple (switch) Bucles while-do y do-while Bucle for En los bucles se puede utilizar break y continue

El lenguaje C, diapositiva 9 (22/08/06)

dit UPM

Evaluacin de expresiones

Expresiones lgicas y de relacin:

Devuelven valor entero (en C no existe tipo boolean) 0 es falso, el resto cierto
if (! --vueltas) exit(0);

Orden de evaluacin de expresiones igual que en Java:

parntesis reglas de precedencia y agrupacin de los operadores no se especifica en qu orden se evalan los operandos de un operador
x = f() + g(); /* f y g, o g y f ? */

El lenguaje C, diapositiva 10 (22/08/06)

dit UPM

Precedencia y agrupacin
Operador () [] -> . ! ~ ++ -- - (cast) * & sizeof * / % + - << >> < <= > >= == != & ^ && || ?: = += -= ,
El lenguaje C, diapositiva 11 (22/08/06)

Agrupacin -> <->

<->

dit UPM

Ejempos

a+b*c a/b*c a=b=c

= = =

a+(b*c) (a/b)*c a=(b=c)

(a+b)*c a/(b*c) (a=b)=c (ilegal)

El lenguaje C, diapositiva 12 (22/08/06)

dit UPM

Funciones

Todas las funciones son globales

En Java todos los mtodos pertenecen a una clase

Espacio de nombres nico para las funciones

En Java un espacio de nombres por clase

Manejo de errores: convenio sobre el valor devuelto por una funcin

if (f() < 0) error() if (f() == 0) ok()

En Java los errores se gestionan mediante excepciones

El lenguaje C, diapositiva 13 (22/08/06)

dit UPM

Declaracin de funciones

Declaracin o definicin previa a su uso:


int mifunc(int a, int b); /* declaracion */ /* a partir de aqu se puede invocar mifunc */ int mifunc(int a, int b){return a+b;} /*definicion*/

La declaracin de funciones suele hacerse en ficheros .h Se utiliza void para declarar funciones sin argumentos:
int mifunc(void); /* En Java sera: int mifunc() */ () significa argumentos no especificados

El lenguaje C, diapositiva 14 (22/08/06)

dit UPM

Sobrecarga lista variable de argumentos

En C no existe sobrecarga de funciones:


void mifuncion(int a){ ... } void mifuncion(float b ){ ... } error: mifuncion already defined

Pero pueden definirse funciones con nmero variable de argumentos:


printf("%d %f\n", x, f); printf("%c", c);

La declaracin es:
printf(char* fmt, );

Al menos debe conocerse un argumento

El lenguaje C, diapositiva 15 (22/08/06)

dit UPM

Tipos derivados en C

Enumerados Punteros Matrices (o vectores) y cadenas de caracteres. Estructuras Uniones

El lenguaje C, diapositiva 16 (22/08/06)

dit UPM

Enumeracin

Define un subconjunto dentro de los enteros Enumeracin con valores asignados de forma implcita o explcita. Cada elemento tiene un identificador
enum { vacio = 0, lleno = 1, borrado = 2 } var; enum { vacio, lleno, borrado } var;

El lenguaje C, diapositiva 17 (22/08/06)

dit UPM

Definicin de tipos
typedef enum { vacio = 0, lleno = 1, borrado = 2 } estado; estado var;

Permite dar nombre a cualquier tipo til para tipos derivados

El lenguaje C, diapositiva 18 (22/08/06)

dit UPM

Peculiaridades sobre tipos


Equivalencia estructural Dos modalidades para algunos tipos:

Tradicional: enum estado {vacio, lleno, borrado}; enum estado v1, v2, v3;

Ansi: typedef enum {vacio, lleno, borrado} estado; estado v1, v2, v3;
El lenguaje C, diapositiva 19 (22/08/06)

dit UPM

Matrices (vectores)

Secuencia de tamao conocido de elementos homogneos


Accesibles mediante un ndice (0 .. MAX-1) Dimensin: nmero de ndices necesarios Tipo base: cualquiera Tipo ndice: expresin entera

typedef double tipo_matriz [ MAX ] ; tipo_matriz v; for (i = 0; i < MAX ; i++) v [ i ] = d ;

Las cadenas de caracteres son matrices de char terminadas en \0 (no existe tipo String)
char mensaje[] = "Hola amigo\n";

El lenguaje C, diapositiva 20 (22/08/06)

dit UPM

Punteros

Variables que guardan direcciones de memoria de variables de un tipo base

Apunta a una variable de tipo base En Java es implcita (excepto la reserva de memoria)

La gestin de memoria es explcita

Aritmtica de punteros Permiten el paso por referencia en funciones

Permite devolver valores a travs de parmetros

El lenguaje C, diapositiva 21 (22/08/06)

dit UPM

Punteros

Declaracin de variables
int y; int* py; (tambin int *py;)

direccin

La declaracin no implica la existencia del objeto apuntado


py

6000

5000

Esto es peligroso Puede producir, sobreescrituras, violaciones,..

Asignacin de valores
y = 7;

& es el operador direccin * es el operador indireccin (desreferenciar)


*py (es igual a 7) py = &y;

6000

El lenguaje C, diapositiva 22 (22/08/06)

dit UPM

Ejemplo
#include <stdio.h> void myStrCopy (char *dest, char *src) { while (*src != '\0') *(dest++) = *(src++); *dest = '\0'; } int main (void) { char *s = "Cadena largaaaaaaaaa"; char t[] = "Cadena corta"; printf ("%s, %s\n", s, t); myStrCopy (t, s); printf ("%s, %s\n", s, t); } Impredecibledespusdecopia!!!!

El lenguaje C, diapositiva 23 (22/08/06)

dit UPM

Ejemplo

En Java se genera el siguiente mensaje de error en tiempo de ejecucin:


Cadena largaaaaaaaaa, Cadena corta java.lang.StringIndexOutOfBoundsException: String index out of range: 12 at java.lang.StringBuffer.setCharAt(Unknown Source) at Strcpy.myStrCopy(Strcpy.java:15) at Strcpy.main(Strcpy.java:7)

El lenguaje C, diapositiva 24 (22/08/06)

dit UPM

Puntero NULL

Valor comn para todos los tipos puntero Porttil, definido en <stdlib.h> Asignacin
pc = pv = NULL;

Significa que no apunta a ningn sitio No se puede desreferenciar *pc no existe

El lenguaje C, diapositiva 25 (22/08/06)

dit UPM

Parmetros por referencia


void swap (int* px, int* py) { int temp; temp = *px; *px = *py; *py = temp; } int a, b; swap (&a, &b);
El lenguaje C, diapositiva 26 (22/08/06)

dit UPM

Referencias en Java
// En Java no se puede pasar referencia a tipo bsico class IntValue { int n; IntValue(int x){ n = x;} static int a.n b.n } } IntValue a, b; a= new IntValue(3); IntValue.swap(a, b);
El lenguaje C, diapositiva 27 (22/08/06)

void swap (IntValue a, IntValue b){ tmp = a.n; =b.n; =tmp;

b= new IntValue(5);

dit UPM

Punteros y matrices

Matriz = puntero constante al comienzo El tamao de una matriz debe conocerse a priori (excepto parmetros) Los punteros permiten hacer matrices de tamao variable, submatrices, etc.

El lenguaje C, diapositiva 28 (22/08/06)

dit UPM

Punteros y matrices
int a[3]; int *pa; pa = & a[0]; pa = a; x = *pa; x = *(pa + 1); x = *(pa + i);

x = a[0]; x = a[1]; x = a[i];

a[0]
El lenguaje C, diapositiva 29 (22/08/06)

a[1]

a[2]

dit UPM

Ruptura de reglas de tipado


int tabla[3]; int *pi; void* pv; char *pc; pi= tabla; *pi= 97; *(pi+1)= 98; pv= pi; pc= pv; *pc=x; *(pc+1) =y; 97 x y

*pi

*(pi+1)

*(pi+2)

98

*pc
El lenguaje C, diapositiva 30 (22/08/06)

*(pc+1)

*(pc+2)

dit UPM

Aritmtica de punteros

Se les puede sumar y restar enteros


El incremento subyacente es multiplicado por el tamao del tipo base Se entiende que el puntero puede apuntar a un array indefinido de elementos del tipo base Nos da la distancia entre elementos del array

Se pueden restar entre s

No se pueden sumar entre s (ni otras operaciones)

El lenguaje C, diapositiva 31 (22/08/06)

dit UPM

Argumentos de main
int main(int argc, char**argv, char** envp) int main(int argc, char* argv[], char* envp[]) /* en Java era: void main(String[])) */ > ping cuentas argv = argc = 2
ping\0 cuentas\0 NULL NULL

envp =
PATH=/home/lprs\0 INCLUDE=/usr/include\0 TMP=/tmp\0

El lenguaje C, diapositiva 32 (22/08/06)

dit UPM

Estructuras

Agregacin de elementos posiblemente heterogneos Campos accesibles mediante el nombre typedef struct { int lclave; int lvalor; int lreg; int nreg; void* dreg; } desc;
// Equivalente en Java

public class desc { int lclave; int lvalor; int lreg; int nreg; Object dreg; }

El lenguaje C, diapositiva 33 (22/08/06)

dit UPM

Acceso a los campos

Un campo es una variable del tipo del campo


desc d, d2; d2.nreg = (d.nreg / 100) + 1;

Punteros a estructuras
desc *pd, *pd2; (*pd2).nreg = (*pd).nreg/100 + 1; pd2->nreg = pd->nreg/100 + 1;

-> Operador especial para acceso a campos desde un puntero a la estructura, unin

El lenguaje C, diapositiva 34 (22/08/06)

dit UPM

Uniones

Superposicin de elementos heterogneos Campos excluyentes en el tiempo Ocupa la memoria del campo mayor Inseguras (no incluyen clave del tipo activo)
typedef union { int float ... } valores; i; f;

El lenguaje C, diapositiva 35 (22/08/06)

dit UPM

Punteros y funciones

Se puede apuntar a la memoria donde comienza una funcin Se define el tipo de las funciones

que tienen el mismo tipo de retorno y los mismos tipos de argumentos

Las funciones definidas que lo cumplan son valores del tipo Vlido para callbacks

El lenguaje C, diapositiva 36 (22/08/06)

dit UPM

Punteros a funcin
typedef double (*freal)(double); freal f; double ident(double x) { return x;} float integral(freal f, double a, double b) { double x, i, dx; dx = (b-a)/100000.0; for (x = a, i = 0.0; x <= b; x+= dx) i = i + f(x)*dx; return i; } f= ident; printf("%5.3f\n", integral(f, 0.0, 1.0)); f= sin; printf("%5.3f\n", integral(f, 0.0, 3.141592));
El lenguaje C, diapositiva 37 (22/08/06)

dit UPM

Preprocesador
xDefinicin de constantes
#define PI 3.14159264 #define LONGCAB (4 * sizeof (int))

Macros
#define area_circulo (r) PI * r * r
y = area_circulo(a+b); y = PI * a+b * a+b;

#define area_circulo (r) (PI * (r) * (r))

El lenguaje C, diapositiva 38 (22/08/06)

dit UPM

Inclusin de ficheros
#include asocv.h #include <stdio.h>

Proteccin frente a cargas repetidas


#ifndef ASOCV #define ASOCV ... #endif

El lenguaje C, diapositiva 39 (22/08/06)

dit UPM

Compilacin condicional
#ifdef MSDOS borra (c:\\TMP\\xx); #endif #ifdef UNIX borra (/tmp/xx); #endif #if MACH == MC88000 #else ... #endif ... ... #elif MACH == IAPX803386

El lenguaje C, diapositiva 40 (22/08/06)

dit UPM

Bibliografa
1. Tipos de datos simples 2. Estructuras de control 3. Funciones 4. Datos estructurados 5. Punteros 6. Preprocesador
[Kernighan],cap. 2 [Kernighan],cap. 3 [Kernighan],cap. 4 [Kernighan],cap. 5,6 [Kernighan],cap. 5 [Kernighan],cap. 4

El lenguaje C, diapositiva 41 (22/08/06)

dit UPM

Вам также может понравиться