Professional Documents
Culture Documents
Lenguaje de Programacin C
Introduccin al
Lenguaje de Programacin C
Mayo 2013
Introduccin al
Lenguaje de Programacin C
Contenido
A modo de Presentacin .......................................................................................... 3
Historia y caractersticas del lenguaje C ................................................................ 4
Pasos para la creacin de una aplicacin en lenguaje C ................................. 7
Entorno de Programacin Integrado .................................................................... 12
Estructura de un programa en C ........................................................................... 14
Identificadores .......................................................................................................... 16
Palabras reservadas (C89) ...................................................................................... 17
Variables, alcance y tiempo de vida .................................................................... 21
Tipos de variables ..................................................................................................... 24
Declaracin de variables ........................................................................................ 25
Constantes................................................................................................................. 34
Operadores y expresiones ...................................................................................... 37
Instrucciones (sentencias ejecutables) ................................................................. 49
Funciones y parmetros .......................................................................................... 62
Arreglos, Estructuras, Uniones y Enumeraciones .................................................. 72
Apuntadores ............................................................................................................. 81
La biblioteca estndar ............................................................................................ 97
Entrada y Salida ...................................................................................................... 100
Archivos .................................................................................................................... 102
Memoria Dinmica................................................................................................. 107
Alias, referencias pendientes y basura ............................................................... 109
Funciones con un nmero de parmetros variables ........................................ 109
Pase de parmetros a la funcin main............................................................... 113
El preprocesador .................................................................................................... 114
Llamadas a otros lenguajes de programacin ................................................. 117
Caso de estudio: implementar un comando del sistema ................................ 119
Algoritmos y aplicaciones ..................................................................................... 120
Bibliografa recomendada .................................................................................... 125
ANEXOS .................................................................................................................... 126
Mayo 2013
Introduccin al
Lenguaje de Programacin C
A modo de Presentacin
La presente gua nace como una necesidad de tener una herramienta concisa
para la enseanza del lenguaje de programacin C, en la Universidad Catlica
Andrs Bello Guayana. Est orientada como un instrumento de aprendizaje del
lenguaje y/o de consulta para los estudiantes de la carrera de Ingeniera en
Informtica, con la finalidad de apoyar el uso el lenguaje tanto en cursos bsicos
como el de Algoritmos y Programacin y cursos avanzados tales como Sistemas
Operativos y Sistemas Distribuidos. Sin embargo la misma puede ser utilizada por
cualquier lector interesado en el aprendizaje o uso del lenguaje,
Se asume que el lector tiene nociones bsicas en algoritmos y programacin, es
por esta razn que se que desde un principio se muestran ejemplos de programas
completos para que el lector se inicie lo ms pronto posible en el lenguaje. Sin
embargo los nuevos programadores, con nociones bsica en ingles, podrn leer y
asimilar los concepto del lenguajes.
El contenido trata desde los usos ms elementales hasta los ms avanzados del
lenguaje. Mientras se abarca cada uno de los temas se muestran ejemplos de
programas completos y funcionales que ejemplifican los conceptos expuestos, la
idea es que el lector utilice estos ejemplos en el entorno de programacin de su
preferencia, los compile y ejecute, observando y analizando tanto el cdigo
como los resultados, para posteriormente modificarlos y experimentar. Estos
ejemplos intentan mostrar principios bsicos de la programacin tales como la
simplicidad, la claridad y la generalidad, con la finalidad que el lector pueda
desarrollar un buen estilo de programacin, ya que un programa bien escrito es
ms sencillo de entender y modificar; y tal vez lo ms importante que tiene una
mayor probabilidad de ser correcto.
Mayo 2013
Introduccin al
Lenguaje de Programacin C
Mayo 2013
Introduccin al
Lenguaje de Programacin C
Mayo 2013
Introduccin al
Lenguaje de Programacin C
condicional.
Flujo
de
control
sencillo,
aunque
no
soporta
multiprogramacin,
Mayo 2013
Introduccin al
Lenguaje de Programacin C
Compilador
Intrprete
Compilador-Intrprete
Compilador
Enlazador
gcc
Ejecutable
a.out
Ahora en detalle, los pasos para la creacin de una aplicacin en C, son las
siguientes:
Crear el programa fuente para lo cual se utiliza un editor.
Compilacin del programa, C proporciona ciertas facilidades del lenguaje
por medio de un preprocesador, que conceptualmente es el primer paso
separado en la compilacin, entre sus funcionalidades se pueden nombrar:
inclusin de archivos, substitucin de macros, compilacin condicional. As
mismo C tiene soporte de compilacin por separado, es decir se un
programa se puede escribir en mltiples archivos y cada uno de ellos
compilado por separado, lo cual tiene como ventaja en que un cambio en
uno de los archivos no requiere la compilacin del programa completo.
Mayo 2013
Introduccin al
Lenguaje de Programacin C
Encabezado
Encabezado
Encabezado
Encabezado
Encabezado
<stdio.h>
colas.h
calculos.h
colas.h
calculos.h
Fuente
Preprocesador
Fuente
Fuente
colas.c
calculos.c
Objeto
Objeto
Objeto
Principal.o
colas.o
calculos.o
Editor
Principal.c
Compilador
Librerias
Enlazador
Ejecutable
[Depurador]
Mayo 2013
miSimulador
Introduccin al
Lenguaje de Programacin C
Ahora todos ellos se compilan por separados y luego se enlazan para producir la
aplicacin miSimulador. Recordemos que el proceso de compilacin se puede
automatizar utilizando la herramienta make, la cual lee las instrucciones y las
dependencias de un archivo (makefile) y ejecuta los comandos que permiten
generar el cdigo ejecutable.
Cuando se escriben programas, se pueden cometer errores (bugs). De hecho, los
programadores comenten errores y la probabilidad de que el programa funcione
a la primera vez es prcticamente cero. Por lo tanto, el desarrollo de un programa
siempre incorpora una etapa de depuracin (debugging), que consiste en buscar
y resolver los errores cometidos durante la programacin. Para facilitar la etapa
de depuracin es conveniente usar herramientas especializadas para estos
efectos. La ms comn es el depurador o tambin llamado debugger.
Un depurador es una herramienta que permite intervenir durante la ejecucin de
un programa, para saber cmo se est ejecutando. Un depurador permite, entre
otras funciones:
Ejecutar paso a paso un programa (stepping).
Establecer puntos de detencin (breakpoints).
Examinar el contenido de las variables y objetos.
Conocer el encadenamiento de llamadas de procedimientos.
Retomar la ejecucin hasta un nuevo punto de detencin.
Este es un buen punto para recordar que en un mundo lleno de complejidades,
se puede perder de vista los principios bsicos:
Simplicidad, mantiene los programas breves y manejables
Claridad, garantizan que sean fciles de entender, tanto para las personas
como para las mquinas
Generalidad, significa que trabajaran bien en una amplia gama de
Mayo 2013
Introduccin al
Lenguaje de Programacin C
correctos y es algo que no es difcil. El cdigo debe ser claro y sencillo, y evitar
trucos ingeniosos y estructuras poco usuales.
Como ejemplo de lo anteriormente comentado, se puede observar el siguiente
cdigo:
/*
* UCAB Guayana
* Introduccion al Lenguaje C
*/
#include <stdio.h>
#include <stdlib.h>
// Realizar la conversin de notacin decimal a binario
// de un numero entero positivo
int main(int argc, char **argv){
unsigned int n=5,p=1;
unsigned long b=0;
printf("%d",n);
for(;n;n>>=1,p*=10)
b+=p*(n&1);
printf(" en binario es: %lu\n",b);
return 0;
}
/* --- Fin ejemplo --- */
Mayo 2013
10
Introduccin al
Lenguaje de Programacin C
/*
* UCAB Guayana
* Introduccion al Lenguaje C
*/
#include <stdio.h>
#include <stdlib.h>
// Realizar la conversin de notacin decimal a binario
// de un numero entero positivo
int main(int argc, char **argv){
unsigned int n=5,p=1;
unsigned long b=0;
printf("%d",n);
while(n!=0){
b=b+p*(n%2);
p=p*10;
n=n/2;
}
printf(" en binario es: %lu\n",b);
return 0;
}
Es oportuno el momento, para resaltar que la gua est elaborada de tal forma
que los cdigos de ejemplo son programas que pueden ser ejecutados, lo que se
debe realizar el copiar y pegar en el IDE de su preferencia, ejecutarlos y observar
los resultados. As mismo se invita al lector a jugar con los cdigos
modificndolos, ejecutndolos y explicando los resultados.
Mayo 2013
11
Introduccin al
Lenguaje de Programacin C
Mayo 2013
12
Introduccin al
Lenguaje de Programacin C
Mayo 2013
13
Introduccin al
Lenguaje de Programacin C
Estructura de un programa en C
Los programas en C pueden estar formados por una o ms funciones, aunque la
nica funcin que debe estar presente en la funcin main(), siendo la funcin que
se invoca de primero cuando el programa se ejecuta, aunque main no es una
palabra clave se trata como si lo fuera, los archivos de los programas en C tienen
extensin .c para los programas o librerias y .h para los encabezados (ya sean del
programador o de las libreras estndares) definiciones de tipos, estructura y
prototipos de las funciones en otros archivos o mdulos.
Aunque un programa en C puede estar formado solamente por construcciones
propias del lenguaje, los compiladores de C incorporan bibliotecas estndar que
proporcionan funciones para algunas de las tareas ms usuales, por ejemplo
entrada y salida ya sea por consola o por archivo, manejo de caracteres y
cadenas de caracteres, funciones matemticas, memoria dinmica, etc.
Ahora, la estructura general de un programa en C, junto con nuestro primer
programa (en el archivo hola.c), se muestra a continuacin
Declaraciones globales
tipo funcin(parmetros){
/*
* UCAB Guayana
* Introduccion al Lenguaje C
*/
Declaraciones locales
#include <stdio.h>
secuencia de instrucciones
int main(void){
printf("Hola Mundo\n");
return 0;
}
}
int main(int argc, char **argv){
Declaraciones locales
secuencia de instrucciones
}
Mayo 2013
14
Introduccin al
Lenguaje de Programacin C
comentarios
en
una
sola
lnea
comenzando
con
//
Mayo 2013
15
Introduccin al
Lenguaje de Programacin C
Identificadores
Un mecanismo fundamental de abstraccin en un lenguaje de programacin, es
el uso de nombres o identificadores, para denotar entidades o constructores del
lenguaje.
Un identificador, sirven para nombrar variables, etiquetas, funciones, y otros
objetos definidos por el programador, puede estar compuesto de cualquier
combinacin de letras (minsculas y maysculas), dgitos y el smbolo underscore
'_'. La nica restriccin es que el primer carcter debe ser una letra o un
underscore. Un identificador no puede coincidir con una palabra clave de C y
con identificadores previamente definidos en el mismo mbito.
Ejemplos de identificadores:
Vlidos:
x
y2
suma_1
_t
TABLA
No vlidos:
4num
x
orden-no
ind lis
Observaciones
No
se
limita
la
longitud
de
los
identificadores.
Pero
algunas
Mayo 2013
16
Introduccin al
Lenguaje de Programacin C
double
int
struct
break
else
long
switch
case
enum
register
typedef
char
extern
return
union
const
float
short
unsigned
continue
for
signed
void
default
goto
sizeof
volatile
do
if
static
while
_Bool
_Complex
restrict
_Imaginary
Mayo 2013
17
Introduccin al
Lenguaje de Programacin C
Tipos de datos
C utiliza 5 palabras reservadas para definir los tipos de datos fundamentales. A
diferencia de otros lenguajes, un determinado tipo de datos puede ir cualificado
por un conjunto de modificadores.
Los tipos de datos fundamentales son:
char
carcter
int
entero
float
real
double
void
sin tipo
Modificadores
A excepcin del tipo void, los tipos de datos bsicos pueden tener diferentes
modificadores precedindolos, que pueden alterar su significado ajustndolo ms
a las necesidades del programador, a continuacin se muestra la lista de
modificadores:
signed
con signo
unsigned
sin signo
Mayo 2013
18
Introduccin al
Lenguaje de Programacin C
short
corto
long
largo
Tamao Bits
Rango de valores
char
-128 a 127
unsigned char
0 a 255
signed char
-128 a 127
int
16 (o 32)
-32.768 a 32.767
unsigned int
16 (o 32)
0 a 65.535
signed int
16 (o 32)
-32.768 a 32.767
short int
16
-32.768 a 32.767
16
0 a 65.535
16
-32.768 a 32.767
long int
32
-2.147.483.648 a 2.147.483.647
32
0 a 4.294.967.295
32
-2.147.483.648 a 2.147.483.647
64
64
enum
16
0 a 65.535
float
32
double
64
long double
64
Mayo 2013
19
Introduccin al
Lenguaje de Programacin C
Se pueden definir nuevos nombre para los tipos de datos existentes utilizando la
palabra clave typedef, que realmente no crea un nuevo tipo de datos sino que
define un nuevo nombre para un tipo ya existente. La forma de utilizarlos es:
typedef tipo nombre;
Donde tipo es cualquier tipo de datos valido, ya sea un tipo base o una
estructura, por ejemplo:
typedef unsigned char byte;
El programa a continuacin muestra el tamao de las diferentes tipos, para lo
cual usaremos el operador sizeof que calcula el tamao, en bytes, de cualquier
tipo o variables.
/*
* UCAB Guayana
* Introduccion al Lenguaje C
*/
#include <stdio.h>
int main(void){
int a;
float f;
printf("Size
printf("Size
printf("Size
printf("Size
printf("Size
printf("Size
printf("Size
printf("Size
return 0;
of
of
of
of
of
of
of
of
char: %d\n",sizeof(char));
short: %d\n",sizeof(short));
int: %d\n",sizeof(int));
long int: %d\n",sizeof(long int));
float: %d\n",sizeof(float));
double: %d\n",sizeof(double));
a: %d\n",sizeof(a));
f: %d\n",sizeof(f));
}
/* --- Fin ejemplo --- */
Mayo 2013
20
Introduccin al
Lenguaje de Programacin C
Nombre
Valor
Localizacin
Nombre
Valor
Localizacin
Mayo 2013
21
Introduccin al
Lenguaje de Programacin C
123
Mayo 2013
22
Introduccin al
Lenguaje de Programacin C
Mayo 2013
23
Introduccin al
Lenguaje de Programacin C
Tipos de variables
Un programa compilado en C tiene cuatro regiones lgicas de memoria
diferentes, cada una de ellas para propsitos especficos, las cuales se muestran
a continuacin:
Aunque la disposicin fsica de cada una de ellas puede diferir entre los diferentes
tipos de procesadores y entre las diferentes implementacin del lenguaje. La
figura anterior muestra de forma conceptual como aparece un programa en C
en la memoria. La primera regin contiene el cdigo del programa, en la
siguiente regin se guardan las variables globales (datos estticos) ambas
regiones se asignan en tiempo de compilacin. Las dos regiones restante son
asignadas en tiempo de ejecucin y son la pila (stack) y el montn (heap), la pila
mantiene entre otros las direcciones de retornos, los parmetros reales y las
variables locales (datos automticos) y finalmente el montn es la regin que
puede utilizarse, de forma explcita, mediante las funciones de administracin de
memoria dinmica (datos dinmicos) y se utilizan a travs de apuntadores
(pointers).
Mayo 2013
24
Introduccin al
Lenguaje de Programacin C
Declaracin de variables
La forma general de declaracin es:
<tipo> lista_de_variables;
int numero1, numero2;
long int l;
Las variables globales y static solo son inicializadas al principio del
programa, las variable locales automticas se inicializan cada vez que se
entra en el bloque. Las variables globales y static que no hayan sido
inicializadas toman automticamente el valor inicial de cero y las locales
auto tendrn valores desconocidos.
Mayo 2013
25
Introduccin al
Lenguaje de Programacin C
recordar que dentro del mismo mbito no se pueden realizar declaraciones con
el mismo identificador
En la prctica ocurre que cada identificador solo tiene alcance (es visible) en
algunas regiones de su mbito, que podran ser discontinuas. La razn por la que
un identificador deja de tener alcance (o ser visible) dentro de su mbito es que
sea ocultado por otra declaracin explcita que utiliza el mismo identificador. La
Mayo 2013
26
Introduccin al
Lenguaje de Programacin C
#include <stdio.h>
int numero1, numero2;
Variable Global
Parmetro Formal
}
int funcion2(void){
int numero1, numero2;
Variable local
}
int funcion3(void){
int numero1, numero2;
if (numero1==numero2){
int numero1, numero2;
}
}
A continuacin se muestra un ejemplo donde se pueden observar los conceptos
de mbito y alcance de las variables.
Mayo 2013
27
Introduccin al
Lenguaje de Programacin C
/*
* UCAB Guayana
* Introduccion al Lenguaje C
*/
#include <stdio.h>
int a=0;
void funcion1(int a){
printf("En funcion1 el valor de a:%d\n",a);
}
void funcion2(int p){
int a=p;
printf("En funcion2 el valor de a:%d\n",a);
funcion1(a+1);
}
int main(void){
int a=1;
printf("En main el valor de a:%d\n",a);
funcion2(a+1);
return 0;
}
/* --- Fin ejemplo --- */
mbitos de un programa en C
En C los trminos local y global se utilizan para describir, en forma general, la
diferencia entre identificadores que se declaran entre un bloque y los que se
declaran fuera de todos los bloques.
Sin embargo en C de definen de forma ms especifica esas categoras, el
estndar define cuatro mbitos que determinan la visibilidad de un identificador,
los cuales se describen a continuacin:
Mayo 2013
28
Introduccin al
Lenguaje de Programacin C
Calificadores de acceso
Controlan las formas que se acceden o se modifican las variables.
const
No pueden ser modificadas por el programa, solo inicializar.
const int a=10;
/*
* UCAB Guayana
* Introduccion al Lenguaje C
*/
#include <stdio.h>
void nocambiar(const char parametro){
printf("desde no cambiar p:%d\015",parametro);
}
int main(void){
const unsigned char b=0xFF;
nocambiar(b);
printf("%d\n",b);
return 0;
}
Mayo 2013
29
Introduccin al
Lenguaje de Programacin C
volatile
El valor de una variable puede cambiar por medios no explcitamente
especificados por el programa. por ejemplo una direccin de una variable
se le paso a una rutina que maneja un timer o puerto de entrada y salida,
en este caso el valor de la variable puede ser cambiado sin una instruccin
de asignacin explicita del programa. Esto puede ser importante de
notificar al compilador para efecto de optimizacin, ya que el mismo
puede asumir que la variable no cambia.
Se puede utilizar const y volatile junto, por ejemplo un puerto en la
direccin 30H y cuyo valor puede cambiar exclusivamente por una
condicin externa.
const volatile char *puerto = (const volatile char *) 0x30;
char c;
extern char c;
int main(){
void func23(void){
x=123;
}
Mayo 2013
y=10;
}
30
Introduccin al
Lenguaje de Programacin C
static
Cuando es variable local se crea un almacenamiento permanente, con
alcance en el bloque que es declarada y cuando la variable es global se
le indica que solo es conocida en el archivo que se declara.
int veces(void){
static cuentas=0;
int veces(void){
cuentas++;
cuentas++;
return cuentas;
return cuentas;
/*
* UCAB Guayana
* Introduccion al Lenguaje C
*
* archivo: modulo1.c
*/
#include <stdio.h>
#include <stdlib.h>
extern int valor;
void funcion1(void);
int cuenta(void){
static int cuentas=0;
cuentas++;
return cuentas;
}
Mayo 2013
31
Introduccin al
Lenguaje de Programacin C
int main(void) {
funcion1();
printf("valor: %d\n",valor);
printf("cuentas: %d\n",cuenta());
printf("cuentas: %d\n",cuenta());
return EXIT_SUCCESS;
}
/* --- Fin archivo modulo1.c --- */
/*
* UCAB Guayana
* Introduccion al Lenguaje C
*
* archivo: modulo2.c
*/
#include <stdio.h>
#include <stdlib.h>
int valor=5;
void funcion1(void){
printf("desde funcion1 valor: %d\n",valor);
}
/* --- Fin archivo modulo2.c --- */
register
Se le pide al compilador que mantenga el valor en un registro del CPU en
lugar de la memoria, donde normalmente se almacenan las variables, esto
con el fin de realizar operaciones mucho ms rpido.
register int temp;
A continuacin se muestra un ejemplo del uso de register
/*
* UCAB Guayana
* Introduccion al Lenguaje C
*/
#include <stdio.h>
Mayo 2013
32
Introduccin al
Lenguaje de Programacin C
int main(void){
register char c='a';
for(;c<='z';c++)
printf("%c",c);
return 0;
}
/* --- Fin ejemplo --- */
auto
Utilizado para declara variables locales, sin embargo todas las variables
que no son globales, se asumen auto.
/*
* UCAB Guayana
* Introduccion al Lenguaje C
*/
#include <stdio.h>
void funcion1(void){
auto int a=1;
printf("En funcion1 el valor de a:%d\n",a);
a=a+1;
}
void funcion2(void){
static int a=1;
printf("En funcion2 el valor de a:%d\n",a);
a=a+1;
}
int main(void){
funcion1();
funcion1();
funcion1();
funcion2();
funcion2();
funcion2();
return 0;
}
/* --- Fin ejemplo --- */
Mayo 2013
33
Introduccin al
Lenguaje de Programacin C
Constantes
Refieren a valores fijos que no pueden ser modificados por el programa, tambin
se le conocen como literales, pueden ser de cualquier tipo bsico de datos. La
forma que se representa cada constate depende de su tipo.
Enteras:
123
-123
012
/* en octal 10 */
0xA
/* en hexadecimal 10 */
3500L
/* long int */
10000U
/* unsigned int */
Reales:
123.45
1.15f
/* float */
1001.2L
/* long double */
47e-4
.25E7
Caracteres:
Los caracteres imprimibles se escriben entre apostrofes:
'a'
'Z'
Para ls no imprimibles se utiliza \
Mayo 2013
'\n'
/* salto de lnea */
'\r'
/* retorno carro */
'\f'
/* salto de pgina */
34
Introduccin al
Lenguaje de Programacin C
'\t'
/* tabulador */
'\b'
/* espacio atrs */
'\v'
/* tabulador vertical */
'\\'
/* barra invertida */
'\''
/* comillas simples */
'\'
/* comillas dobles */
'\Const'
/* constante octal */
'\xConst'
/* constante hexadecimal*/
Enumeradas
enum dias{Domingo, Lunes, Martes, Miercoles, Jueves,
Viernes, Sabado};
Las enumeraciones son un conjunto de constantes enteras con un nombre
y el valor del primer smbolo en la enumeracin es 0 y cada smbolo
restante recibe un valor que es mayor en 1 que el smbolo que lo precede.
Se puede especificar el valor de uno o ms smbolos utilizando un
inicializador, a los smbolos que le siguen a uno inicializado se le asignan
valores consecutivos.
enum colores {amarillo = 1, azul, rojo, verde=10,
magenta, naranja};
Ahora el valor de estos smbolos son:
amarillo
azul
rojo
verde
10
magenta
11
naranja
12
Mayo 2013
35
Introduccin al
Lenguaje de Programacin C
Mayo 2013
36
Introduccin al
Lenguaje de Programacin C
Operadores y expresiones
El lenguaje C es sumamente rico en operadores incorporados, entre los que se
tienen:
Asignacin
A diferencia de muchos otros lenguajes en C la asignacin es un
operador y no una instruccin.
Lvalue = expresin
Num = 5
Asignaciones mltiples, se puede asignar a muchas variables el mismo
valor utilizado asignaciones mltiples en una sola instruccin, por
ejemplo:
x = y = z = 0
Recordemos que al ser la asignacin una expresin, se puede utilizar en
cualquier expresin.
c = (a = 4) + (b = 5);
Cuando se mezcla variables de diferentes tipos en una expresin de
asignacin, la regla de conversin es que el lado derecho de la
asignacin se convierte al tipo del lado izquierdo. En caso de enteros a
caracteres o enteros largos a enteros, se pierden los bits ms
significativos, ahora en el caso de flotantes a caracteres o enteros se
asigna la parte entera y en el caso de float a double y double a long
double se puede tener una posible prdida de precisin resultando del
redondeo. En el caso de conversiones de int a float, de float a double y
similares solo se cambia el tipo de representacin sin aadir precisin.
Mayo 2013
37
Introduccin al
Lenguaje de Programacin C
Aritmticos
Negacin
-x
Suma
x+y
Substraccin
x-y
Multiplicacin
x*y
Divisin
x/y
Modulo
x%y
Relacinales
Igual
==
x==y
Diferente
x!=y
Mayor que
>
x>y
x>=y
Menor que
x<y
<
x<=y
Mayo 2013
38
Introduccin al
Lenguaje de Programacin C
Lgicos
Negacin
!x
&&
||
p&&q
p||q
!p
Bits
Complemento
~x
And
&
x&y
Or
x|y
Xor
x^y
Corrimiento der.
>>
x>>y
Corrimiento izq.
<<
x<<y
(negacin)
Mayo 2013
39
Introduccin al
Lenguaje de Programacin C
p&q
p|q
p^q
~p
Asignacin Compuesta
x=x+y
+=
x+=y
-=
x-=y
*=
x*=y
/=
x/=y
%=
x%=y
&=
x&=y
|=
x|=y
^=
x^=y
>>=
x>>=y
<<=
x<<=y
Incrementales y decrementales
x=x+1
++
x++
++x
x=x-1
--
x---x
Mayo 2013
40
Introduccin al
Lenguaje de Programacin C
Miscelneos
Condicional
x?y:z
Direccin
&
&x
Indireccin
*x
Coma
x,y
Tamao
sizeof()
sizeof(X)
Selector campo
x.y
Selector campo
->
x->y
Elemento arreglo
[]
x[y]
Conversin tipo
(tipo)
(tipo)x
equivale a (*x).y
Que
if (a == 0) // pregunta por si a es igual a cero
Adicionalmente esta ltima, se puede escribir como
if(!a) // pregunta por si a es igual a cero
Mayo 2013
41
Introduccin al
Lenguaje de Programacin C
Operador
Asociatividad
MAYOR
() [] -> .
Izq. A Der.
Der. A Izq.
Unario
*/%
Izq. A Der.
Multiplicativo
+-
Izq. A Der.
Aditivo
<< >>
Izq. A Der.
Corrimiento
Izq. A Der.
Relacional
== =
Izq. A Der.
Igualdad
&
Izq. A Der.
And bits
Izq. A Der.
Xor bits
Izq. A Der.
0r bits
&&
Izq. A Der.
And Lgico
||
Izq. A Der.
Or Lgico
Der. A Izq.
Condicional
Der. A Izq.
Asignacin
Izq. A Der.
Coma
MENOR
Nombre
Evaluacin en Cortocircuito
En relacin con los operadores lgicos && y || son evaluados de izquierda a
derecha y la evaluacin se detiene tan pronto se conoce el resultado ya seas
falso en los and (&&) y verdadero en los or (||), es decir se realiza una evaluacin
en cortocircuito.
Mayo 2013
42
Introduccin al
Lenguaje de Programacin C
/*
* UCAB Guayana
* Introduccion al Lenguaje C
*/
#include <stdio.h>
int main(void){
int i,j,k=0;
i=j=1;
printf("i:%d j:%d k:%d\n",i,j,k);
printf("i+=2:%d j-=1:%d \n",i+=2,j-=1);
i=j=1;
printf("i:%d j:%d \n",i,j);
printf("i++:%d ++j:%d \n",i++,++j);
Mayo 2013
43
Introduccin al
Lenguaje de Programacin C
Evaluacin en cortocircuito
/*
* UCAB Guayana
* Introduccion al Lenguaje C
*/
#include <stdio.h>
#include <stdlib.h>
int ia[] = {2,4,7,10,14,16,20,24,25,30,35};
int busquedaSecuencialOrdenado(int value,int array[], int size){
register int i;
for(i=0; i<size && array[i]<value; i++);
if(i<size && value==array[i])
return i;
return -1;
}
int main(void){
printf("esta en %d\n",busquedaSecuencialOrdenado(20,ia,11));
return 0;
}
Mayo 2013
44
Introduccin al
Lenguaje de Programacin C
Mayo 2013
45
Introduccin al
Lenguaje de Programacin C
scanf("%d",&i);
printf("%d es %s\n",i,i&1?"Impar":"Par");
return 0;
}
/* --- Fin ejemplo --- */
Mayo 2013
46
Introduccin al
Lenguaje de Programacin C
/*
* UCAB Guayana
* Introduccion al Lenguaje C
*/
#include <stdio.h>
int main(void){
int i,j;
for(i=0,j=10;i<j;i++,j--)
printf("Maximo %d\n",i>j?i:j);
return 0;
}
/* --- Fin ejemplo --- */
Expresiones
Una expresin es una sucesin de operadores y operandos debidamente
relacionados, las expresiones combinan variables, constantes y llamadas a
funciones para producir nuevos valores, especificando los operadores lo que va a
ser realizado. Los operandos de diferente tipos que aparecen en una expresin se
convierten a un mismo tipo, tal cual como se especifica a continuacin.
Conversin de tipo:
Implcita se realiza automticamente por el compilador y a esta operacin
se le denomina promocin:
En una asignacin se convierte el tipo al lvalue.
En una expresin todos se convierte a un nico tipo, usando el criterio de
convertirlos todos al tipo del mayor Tamao
char o short int
unsigned char o unsigned short unsigned
int unsigned long unsigned long float double
Mayo 2013
47
Introduccin al
Lenguaje de Programacin C
Mayo 2013
48
Introduccin al
Lenguaje de Programacin C
O la instruccin vaca
;
Instrucciones de bloques
Los bloques comienzan con una llave que abre y acaban con una llave que
Mayo 2013
49
Introduccin al
Lenguaje de Programacin C
Mayo 2013
50
Introduccin al
Lenguaje de Programacin C
adicionales.
/*
* UCAB - Guayana
* Introduccion al Lenguaje C
*/
#include <stdio.h>
#include <stdlib.h>
int main(void){
int i=0;
printf("Inicio\n");
while(1){
for(;;){
if(i==10) goto salir;
printf("\tValor i:%d\n",i);
i++;
}
}
salir:
printf("Fin\n");
return 0;
}
Mayo 2013
51
Introduccin al
Lenguaje de Programacin C
m=x>y?x:y;
tasa = 0.15 * pago;
; /* instruccion vacia */
Seleccin
C contempla los if y el switch como instrucciones de seleccin.
if(exp)
instruccin
+
Mayo 2013
52
Introduccin al
Lenguaje de Programacin C
if(exp)
instruccin (verdadero)
else
instruccin (falso)
case valor:
instrucciones
+
+
[default:
instrucciones]
}
El switch es una instruccin de seleccin mltiple, que compara el
resultado de una expresin exp con una lista de valores (enteros o
Mayo 2013
53
Introduccin al
Lenguaje de Programacin C
la
correspondencia
se
ejecutan
las
instrucciones
Iteracin
Las instrucciones de iteracin (bucles) permiten ejecutar una instruccin o
un conjunto de ellas, mientras se cumpla una determinada condicin. C
contempla tres instrucciones de iteracin: while, do-while y for.
Mayo 2013
54
Introduccin al
Lenguaje de Programacin C
while (exp)
instruccin
+
do
instruccin
while(exp);
+
-
Mayo 2013
55
Introduccin al
Lenguaje de Programacin C
int vector[100];
int main(void){
int i=0, media, suma = 0;
do{
suma += vector [i++];
}while (i < 100);
media = suma / 100;
return 0;
}
for(exp1;exp2;exp3)
instruccin
exp1;
while (exp2) {
instruccin
exp3;
}
Mayo 2013
56
Introduccin al
Lenguaje de Programacin C
utilizar
for
while,
si
no
hay
inicializaciones
Mayo 2013
57
Introduccin al
Lenguaje de Programacin C
Mayo 2013
58
Introduccin al
Lenguaje de Programacin C
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int i,p=0;
printf("Antes del for\n");
for(i=0;i<10;i++){
printf("La primera del for\n");
if(++p==1) continue;
if(p==2)break;
printf("La ultima del for\n");
}
printf("Despues del for\n");
return EXIT_SUCCESS;
}
Mayo 2013
59
Introduccin al
Lenguaje de Programacin C
if(i==5)
break;
else
printf("while: %d\n",i--);
do
printf("do-while:%d\n",j);
while(j!=0);
}
/* --- Fin ejemplo --- */
Mayo 2013
60
Introduccin al
Lenguaje de Programacin C
Mayo 2013
61
Introduccin al
Lenguaje de Programacin C
Funciones y parmetros
El lenguaje C slo permite funciones, no hay procedimientos. La forma de
declarar las funciones es la siguiente:
<tipo> identificador(lista parmetros formales){
declaraciones
enunciados
}
Donde tipo es el tipo del dato que devuelve la funcin, que si no aparece se
asume siempre del tipo int y nombre es el identificador de la funcin.
Si una funcin acepta argumentos, se debe declara las variables que reciban los
valores de los argumentos, la declaracin de los parmetros sigue al nombre de
la funcin. Los parmetros de una funcin se comportan como cualquier otra
variable local de la funcin.
En C, las listas de parmetros formales y de parmetros reales no tienen por qu
coincidir en nmero, e incluso en tipo, adicionalmente se pueden definir
funciones con parmetros de longitud variable, como es el caso del la funcin
printf().
En los lenguajes de programacin se contempla principalmente dos formas de
pasar parmetros a una funcin, la primera es por valor donde se copia el valor
de un argumento en el parmetro formal de la subrutina, en este caso los
cambios efectuados sobre el parmetro no afectan al argumento. La segunda
forma es un paso por referencia, donde se utiliza la direccin del argumento en el
parmetro y los cambios realizados dentro de la subrutina en los parmetros se
reflejan en los argumentos.
En C, slo existe paso de parmetros por valor excepto los arreglos que pasan por
referencia. Esto significa, en general, que el cdigo de la funcin puede alterar los
Mayo 2013
62
Introduccin al
Lenguaje de Programacin C
Para terminar la ejecucin de una funcin se usa la sentencia return. Su sintaxis es:
return [expresin];
Donde la expresin es el valor que retorna la funcin y debe ser del mismo tipo
Mayo 2013
63
Introduccin al
Lenguaje de Programacin C
que el de la funcin.
/*
* UCAB Guayana
* Introduccion al Lenguaje C
*/
#include <stdio.h>
#include <stdlib.h>
int buscar(int e, int array[], int size){
register int i;
for(i=0;i<size;i++)
if(array[i]==e)
return i;
return -1; // No se encuentra
}
int main(int argc,char **argv){
int a[]={2,5,8,9,10};
printf("Esta en:%d\n", buscar(8,a,5));
return 0;
}
/* --- Fin ejemplo --- */
Mayo 2013
64
Introduccin al
Lenguaje de Programacin C
Prototipos de funciones
En la forma apropiada de escribir programas, todas las funciones deben estar
declaradas antes de ser utilizadas, para lo cual se puede declarar el prototipo de
la funcin antes de invocarla, aunque los prototipos no son obligatorios se
recomienda su uso, ya que permite que el compilador realice comprobaciones
de tipos entre los argumentos utilizados en la llamada (parmetros reales) y en la
definicin de la funcin (parmetros formales), as como del numero de
argumentos.
La forma de escribir el prototipo de una funcin es la siguiente:
<tipo> identificador (<tipo parmetro_1>, <tipo parmetro_N>);
A continuacin se muestra el uso de prototipo de funciones, observe que la
funcin swap() est definida luego de la funcin main().
/*
* UCAB Guayana
* Introduccion al Lenguaje C
*/
#include <stdio.h>
#include <stdlib.h>
void swap(int *, int *);
// Prototipo de la funcion
Mayo 2013
65
Introduccin al
Lenguaje de Programacin C
swap(&a,&b);
printf("a:%d b:%d\n",a,b);
return 0;
}
void swap(int *x, int *y){
int t;
t=*x;
*x=*y;
*y=t;
}
/* --- Fin ejemplo --- */
Funciones recursiva
C soporta el llamado recursivo de una funcin, es decir una funcin que se llame
a s misma. La recursin es el proceso de definir algo en trminos de s mismo.
Cuando se llama a una funcin, se asigna espacio en la pila de ejecucin para
los parmetros y las variables locales, el cdigo de la funcin se ejecuta sobre
estas entradas en la pila desde el principio. Adicionalmente en la pila se guarda el
punto donde se reanudar la ejecucin cuando se retorne de la funcin. Es decir
cuando una funcin se llama a s misma, no se crea una copia de ella, solo se
asigna espacio en la pila para los nuevos parmetros y las variables locales y al
retornar de la llamada se tienen en la pila los variables locales y los parmetros
antiguos y se reanuda la ejecucin en el punto inmediato a donde se realizo la
llamada recursiva dentro de la funcin.
Por lo general las soluciones iterativas son ms eficientes que las recursivas, hay
que recordar que en soluciones recursivas se tiene la sobrecarga de las repetidas
llamadas a la funcin, que podran llegar desbordar la pila, como es el caso de
una funcin recursiva descontrolada. La principal ventaja de las funciones
recursivas es que se puede utilizar para crear algoritmos ms claros y sencillos.
Adicionalmente hay problemas que su solucin es naturalmente recursivas y
Mayo 2013
66
Introduccin al
Lenguaje de Programacin C
Mayo 2013
67
Introduccin al
Lenguaje de Programacin C
return 1;
}
m=hanoi(n-1,desde,usando,hasta);
printf("%c --> %c\n",desde,hasta);
m+=hanoi(n-1,usando,hasta,desde);
return m+1;
}
int main(void){
printf("movimientos:%d\n",hanoi(3,'A','B','C'));
return 0;
}
/* --- Fin ejemplo --- */
Mayo 2013
68
Introduccin al
Lenguaje de Programacin C
/*
* UCAB Guayana
* Introduccion al Lenguaje C
*/
#include <stdio.h>
struct punto{
int x,y;
} p1;
/* funcion minima */
nada(){}
void saludo(void){
printf("Operaciones con puntos\n");
}
void imprime(struct punto p){
printf("punto: %d,%d\n",p.x,p.y);
}
struct punto suma(struct punto p1, struct punto p2){
struct punto t;
t.x = p1.x + p2.x;
t.y = p1.y + p2.y;
return t;
}
int main(int argc,char **argv){
struct punto p1 = {1,2},p2;
saludo();
imprime(p1);
p2=p1;
imprime(p2);
p2=suma(p1,p2);
imprime(p2);
nada();
return 0;
}
/* --- Fin del programa --- */
Mayo 2013
69
Introduccin al
Lenguaje de Programacin C
Funciones inline
C99 aadio la palabra clave inline que se aplica a funciones, precediendo una
funcin la palabra reservada inline se le indica al compilador que optimice la
llamada a esa funcin, eso significa que ha de expandir el cdigo de la funcin
insertndolo en la llamada. Siendo esto una solicitud que pudiera ser ignorada.
Una para utilizar funciones inline es tener cdigo eficiente mientras se mantiene un
enfoque estructurado basado en funciones.
/*
* UCAB Guayana
* Introduccion al Lenguaje C
*/
#include <stdio.h>
int vector[20]=
{30,35,38,58,14,15,50,27,10,20,12,85,49,65,86,60,25,90,5,16};
void imprimir(int x[],int n){
register int i;
for(i=0;i<n;i++)
printf("%d ",x[i]);
printf("\n");
}
inline void swap(int *x, int *y){
int t;
t=*x;
*x=*y;
*y=t;
}
void ordenarSeleccion(int array[],int size){
register int i,j;
int e;
for(i=0; i<size-1; i++){
e=i;
for(j=i+1; j<size; j++)
if(array[e]>array[j])
e=j;
if(i!=e)
swap(&array[i],&array[e]);
}
Mayo 2013
70
Introduccin al
Lenguaje de Programacin C
}
int main(void){
imprimir(vector,20);
ordenarSeleccion(vector,20);
imprimir(vector,20);
return 0;
}
/* --- Fin ejemplo --- */
Mayo 2013
71
Introduccin al
Lenguaje de Programacin C
Mayo 2013
72
Introduccin al
Lenguaje de Programacin C
Mayo 2013
73
Introduccin al
Lenguaje de Programacin C
primer ndice indica las filas y el segundo las columnas) es decir que el
ndice ms a la derecha cambia ms rpido que el de ms a la izquierda
cuando se recorren los elementos en la memoria.
En C89 se deben declarar las dimensiones de los arreglos con dimensiones
constantes, sin embargo C99 permite la declaracin de arreglos locales de
longitud variables.
int vector(int n){ // en C99 arreglos de longitud variable
int i,vector[n];
for(i=0;i<n;i
vector[i]=i;
return i;
}
Mayo 2013
74
Introduccin al
Lenguaje de Programacin C
Mayo 2013
75
Introduccin al
Lenguaje de Programacin C
Mayo 2013
76
Introduccin al
Lenguaje de Programacin C
Uniones: Permite que una misma parte de la memoria sea definida como
dos o ms tipos.
Union numero{
int entero;
float real;
}
Campo Bits: tipo especial de estructura o unin que permite el fcil acceso
a bits individuales. Se declaran de la siguiente forma:
tipo nombre: longitud;
Y no es necesario nombrarlos, por ejemplo:
Mayo 2013
77
Introduccin al
Lenguaje de Programacin C
Struct estado{
unsigned: 4;
unsigned cts:1;
unsigned drs:1;
}
Enumeraciones: Una lista de constantes enteros con nombres.
La declaracin tendr la siguiente forma:
enum nombre { lista_de_enumeracion } ;
Ejemplo:
/*
* UCAB Guayana
* Introduccion al Lenguaje C
*/
#include <stdio.h>
enum dias{Domingo, Lunes, Martes, Miercoles, Jueves, Viernes,
Sabado};
int main(int argc,char **argv){
enum dias dia;
for(dia=Domingo;dia<=Sabado;dia++){
printf("%d\n",dia);
}
return 0;
}
/* --- Fin del programa --- */
Mayo 2013
78
Introduccin al
Lenguaje de Programacin C
Mayo 2013
79
Introduccin al
Lenguaje de Programacin C
#include <stdio.h>
int buscar(int e,int a[],int t){
register int i;
for(i=0;i<t;i++)
if(a[i]==e)
return i;
return -1;
}
int main(void){
int a[]={2,3,6,8,10,12,23,15,22,1,9,7};
printf("Buscar 12:%d\n",buscar(12,a,12));
printf("Buscar 25:%d\n",buscar(25,a,12));
return 0;
}
/* --- Fin ejemplo --- */
Mayo 2013
80
Introduccin al
Lenguaje de Programacin C
Apuntadores
Los apuntadores son una de las caractersticas ms tiles y a la vez ms peligrosas
de que dispone el lenguaje C. En C se permite declarar una variable que
contiene la direccin de otra variable, o sea, un apuntador. Cuando se declara
un apuntador ste contiene una direccin arbitraria, si leemos a dnde apunta
nos dar un valor indefinido y si se escribe en tal direccin estamos variando el
contenido de una posicin de memoria que no conocemos por lo que podemos
hacer que el sistema tenga comportamientos no deseados, por lo que antes de
hacer uso de un puntero debemos asignarle una direccin de memoria en
nuestro espacio de trabajo.
La forma de declarar un apuntador es la siguiente:
tipo *nombre;
Por ejemplo la declaracin:
int i, *p=&i;
Se muestra grficamente:
El tipo indica al tipo de datos a los que apuntar el apuntador, pero como efecto
de la declaracin se reservar espacio en memoria para guardar un apuntador,
no para el tipo de datos al que apunta es decir la declaracin de un apuntador
no lleva asociada la reserva de espacio para el tipo de datos apuntado.
Existe un carcter especial que se usa como prefijo y aplicado a las variables
indica la direccin de memoria que ocupa la variable, no el contenido (valor).
Este smbolo es &. Adems existe otro prefijo, *, que aplicado a una variable de
tipo puntero indica el contenido de la direccin a la que apunta dicho
apuntador. A estos dos smbolos se les llama direccin e indireccin (contenido)
Mayo 2013
81
Introduccin al
Lenguaje de Programacin C
respectivamente.
/*
* UCAB Guayana
* Introduccion al Lenguaje C
*/
#include <stdio.h>
int main(void){
int i,*ip;
i=0;
ip=&i;
*ip=5;
printf("i:%d\n",i);
return 0;
}
/* --- Fin ejemplo --- */
Aritmtica de apuntadores
A los apuntadores se les puede aadir o restar una cierta cantidad entera.
Admiten comparaciones e incrementos y decrementos. Cuando un apuntador es
incrementado en uno pasa a apuntar al siguiente elemento del arreglo al que
apuntaba, no al siguiente byte, es decir, se incrementa en el nmero de bytes
que ocupa el tipo al que apunta. Si p es un apuntador a un elemento de un
arreglo p++ incrementa el apuntador para apuntar al siguiente elemento (de
forma similar funciona p-- pero apuntado al elemento anterior). No solo esta
limitado a funciones auto incremento o auto decremento
por ejemplo la
Mayo 2013
82
Introduccin al
Lenguaje de Programacin C
/*
* UCAB Guayana
* Introduccion al Lenguaje C
*/
#include <stdio.h>
#include <malloc.h>
char *ms = "HOLA MUNDO";
int mystrlen(const char *s){
const char *p = s;
while(*p)
p++;
return p-s;
}
int main(void){
printf("ms:%s\n",ms);
printf("Longitud ms:%d\n",mystrlen(ms));
return 0;
}
/* --- Fin ejemplo --- */
Apuntadores a apuntadores
Se puede hacer un apuntador que apunte a otro apuntador que apunte a una
variable. Esta situacin se denomina apuntador de apuntador o indireccin
mltiples.
Mayo 2013
83
Introduccin al
Lenguaje de Programacin C
Mayo 2013
84
Introduccin al
Lenguaje de Programacin C
Aunque los arreglos y los apuntadores estn ntimamente relacionados, hay que
estar muy claro que existe una diferencia importante entre estas dos
declaraciones:
char msg_a[] = HOLA MUNDO
// Arreglo
char *msg_p = HOLA MUNDO // Apuntador
Veamos:
Mayo 2013
85
Introduccin al
Lenguaje de Programacin C
msg_a:
\0
msg_p:
H
\0
Mayo 2013
86
Introduccin al
Lenguaje de Programacin C
imprime(a);
imprime(b);
merge(b,a,c);
imprime(c);
return 0;
}
/* --- Fin ejemplo --- */
Mayo 2013
87
Introduccin al
Lenguaje de Programacin C
Mayo 2013
88
Introduccin al
Lenguaje de Programacin C
/*
* UCAB Guayana
* Introduccion al Lenguaje C
*/
#include <stdio.h>
int main(void){
int i=5;
const int *ip=&i;
*ip=2;
printf("%d",*ip);
return 0;
/* operacion invalida */
}
/* --- Fin ejemplo --- */
Arreglos de apuntadores
Al igual que de cualquier otro tipo de dato se permite declarar un array de
punteros. La forma de hacerlo es:
tipo *nombre[expresion1][expresion2];
int
Mayo 2013
*iap[5];
89
Introduccin al
Lenguaje de Programacin C
float *afp[];
void (*funciones[3])()={funcion1,funcion2,funcion3};
A continuacin se muestra el uso de arreglos de apuntadores:
/*
* UCAB Guayana
* Introduccion al Lenguaje C
*/
#include <stdio.h>
void print_error(const int num){
static char *err[]={
"Error numero cero",
"Error numero uno",
"Error numero dos",
"Error numero tres"
};
printf("Error (%d):%s\n",num,err[num]);
}
int main(void){
print_error(2);
return 0;
}
/* --- Fin ejemplo --- */
Mayo 2013
90
Introduccin al
Lenguaje de Programacin C
Para cba , al ser un arreglo bidimensional, se reserva 4x8 sizeof(char) ahora para
cpa, al ser un arreglo de apuntadores a caracteres, se reserva 4xsizeof(char *). En
el caso en que cpa apunte a elementos de 8 sizeof(char) entonces se tiene 4x8x
sizeof(char) + 4xsizeof(char *). Ahora la ventaja del arreglo de apuntadores es que
los reglones pueden ser de longitudes diferentes.
Apuntadores a estructuras
Existe una pequea variacin a la hora de acceder a una estructura mediante un
apuntador, por ejemplo, (*p).miembro se puede escribir como p->miembro.
/*
* UCAB Guayana
* Introduccion al Lenguaje C
*/
#include <stdio.h>
Mayo 2013
91
Introduccin al
Lenguaje de Programacin C
struct campos{
char campo1;
int campo2;
int campo3[4];
} e, *ep, ea[4];
int main(void){
e.campo1='a';
e.campo2=25;
ep=&e;
printf("campo1:%c\n",(*ep).campo1);
printf("campo2:%d\n",ep->campo2);
ea[2].campo3[1]=123;
printf("ea[2].campo3[1]:%d\n",ea[2].campo3[1]);
return 0;
}
/* --- Fin ejemplo --- */
Estructuras autoreferenciadas
Una estructura no puede contener un miembro de tipo incompleto (que no est
declarado), por lo tanto es imposible declarar estructuras (o uniones) que
contengan una instancia de ellas mismas. Sin embargo adems de dar nombre a
una estructura, los rtulos permiten la definicin de estructuras autoreferenciadas,
es decir estructura que contienen un apuntador (o apuntadores) a una instancia
de ella misma. Debido a que se pueden ser declarados apuntadores a tipos
incompletos.
Como ejemplo de estructuras autoreferenciadas se tienen las estructuras
dinmicas, tales como las lista simplemente o doblemente enlazadas, arboles
binarios, etc.
A continuacin se muestra la declaracin de un nodo de un rbol binario
struct abNodo{
char clave[20];
int cuenta;
struct abNodo *izq;
struct abNodo *der;
};
Mayo 2013
92
Introduccin al
Lenguaje de Programacin C
Como se puede observar en la estructura abNodo los campos izq y der, son
apuntadores a una estructura abNodo, en este caso apuntadores a los nodos hijo
izquierdo y derecho.
/*
* UCAB Guayana
* Introduccion al Lenguaje C
*/
#include <stdio.h>
void intercambia1(int x,int y){
int z;
z=x;
x=y;
y=z;
}
void intercambia2(int *x,int *y){
int z;
z=*x;
*x=*y;
*y=z;
}
int main(void){
int a=2,b=3;
printf("a:%d b:%d\n",a,b);
intercambia1(a,b);
printf("a:%d b:%d\n",a,b);
intercambia2(&a,&b);
printf("a:%d b:%d\n",a,b);
return 0;
Mayo 2013
93
Introduccin al
Lenguaje de Programacin C
}
/* --- Fin ejemplo --- */
Apuntadores a funciones
Es posible crear apuntadores que apunten a funciones, en lugar de datos los
apuntadores a funciones apuntan a cdigo ejecutable. Los apuntadores a
funcin permiten pasar a una funcin como argumento a otra funcin.
Un ejemplo de arreglo de funciones:
/*
* UCAB Guayana
* Introduccion al Lenguaje C
*/
#include <stdio.h>
void funcion1(){
printf("Funcion 1\n");
}
void funcion2(){
printf("Funcion 2\n");
}
void funcion3(){
printf("Funcion 3\n");
}
int main(void){
void (*funciones[3])()={funcion1,funcion2,funcion3};
int opcion;
printf("Opcion (1-3) => ");
scanf("%d",&opcion);
if(opcion>=1 && opcion <=3)
(*funciones[opcion-1])();
else
printf("Error en opcion\n");
return 0;
}
/* --- Fin ejemplo --- */
Mayo 2013
94
Introduccin al
Lenguaje de Programacin C
Apuntadores genricos
Un apuntador void * se denomina un apuntador genrico, y se utiliza para
especificar un apuntador cuya base se desconoce. En C se puede asignar un
apuntador void * a cualquier otro tipo de apuntador y viceversa .
Mayo 2013
95
Introduccin al
Lenguaje de Programacin C
void* permite especificar a una funcin un parmetro que pueda recibir cualquier
tipo de apuntador como argumento. Tambin se utiliza para referirse a la
memoria en bruto (caso de la funcin malloc) cuando se desconoce el
significado de la memoria.
Conversin de apuntadores
Se puede convertir un tipo de apuntador en otro tipo de apuntador, las dos
categoras son las que involucran apuntadores void * y las que no.
Apuntadores y los enteros no son intercambiables, siendo el cero la nica
excepcin (puede ser asignada y se puede comparar) se emplea la constante
simblica NULL en lugar del cero con frecuencia.
Mayo 2013
96
Introduccin al
Lenguaje de Programacin C
La biblioteca estndar
En el lenguaje C toda la entrada y salida de un programa se realiza a travs de
funciones definidas en Bibliotecas. Tambin se encuentran definidas en
bibliotecas otros tipos de funciones. Dichas bibliotecas, o la mayora, son estndar
(las funciones en ellas definidas tienen nombres estndar) lo que facilita la
portabilidad de los programas. Al inicio de cada archivo se debe indicar las
declaraciones de las bibliotecas que se utilizarn. Esto se realiza utilizando la
directiva #include, cuya sintaxis es:
#include nombre_archivo
Donde nombre_archivo es el archivo de encabezado, donde se realizan las
definiciones de la bibliotecas, se coloca entre signos de menor y mayor
(<nombre_archivo>) o entre comillas dobles ("nombre_archivo") segn el lugar en
que haya que buscar el archivo ya sea en los directorios asignados por defecto a
los archivos incluye o en el actual.
Estos archivos de definiciones suelen tener la extensin .h (de header, cabeceras)
y contienen definiciones necesarias para la utilizacin de las funciones contenidas
en la biblioteca.
Por ejemplo:
#include <stdio.h>
Incluye la cabecera para usar la biblioteca de entrada/salida desde el directorio
estndar
#include "stdio.h"
Igual al anterior pero las busca en el directorio actual
#include "c:\proyecto\colas.h"
Incluye el archivo colas.h del directorio proyecto
Mayo 2013
97
Introduccin al
Lenguaje de Programacin C
conio.h
ctype.h
Manejo de caracteres.
errno.h
Informes de error.
float.h
io.h
malloc.h
math.h
setjmp.h
signal.h
stdarg
stdio.h
stdlib.h
string.h
time.h
signal.h
sys/sem.h
sys/shm.h
sys/socket
Mayo 2013
98
Introduccin al
Lenguaje de Programacin C
void funcion4(void){
printf("Primera de Funcion4\n");
longjmp(env,1);
printf("Segunda de Funcion4\n");
}
void funcion3(void){
printf("Primera de Funcion3\n");
funcion4();
printf("Segunda de Funcion3\n");
}
void funcion2(void){
printf("Primera de Funcion2\n");
funcion3();
printf("Segunda de Funcion3\n");
}
void funcion1(void){
printf("Primera de Funcion1\n");
funcion2();
printf("Segunda de Funcion1\n");
}
int main(void){
if(setjmp(env)==0){
printf("Ahora vamos a llamar las funciones\n");
funcion1();
}
else
printf("Regresamos con \"un salto no local\"\n");
printf("Ahora si salimos\n");
return 0;
}
/* --- Fin ejemplo --- */
Mayo 2013
99
Introduccin al
Lenguaje de Programacin C
Entrada y Salida
Los principales archivos estndar definidos en toda aplicacin en C son:
int printf(const char *format, ...) Imprime por la salida estndar una
secuencia de caracteres cuya estructura est definida en la string format.
Se permite dar salida a cualquier tipo de dato predefinido. La string format
tiene la estructura de una string normal pero admite adems caracteres de
conversin (%) para indicar qu tipo de dato se ha de imprimir.
La estructura de una cadena de formato es:
%[flags][.width][.prec][F|N|h|l]type
donde type es un caracter de conversin. El campo flag afecta al tipo de
justificacin; width a la anchura utilizada para imprimir; .prec a la precisin
a la hora de escribir nmeros en coma flotante. El ltimo campo opcional
afecta a la interpretacin del argumento.
%c Carcter
%d Entero decimal
%g Menor entre %e y %f
Mayo 2013
100
Introduccin al
Lenguaje de Programacin C
%s Strings (cadenas)
int fprintf(FILE *fp,const char *format, ...) Escribe en el archivo descrito por fp
datos con el formato indicado por format.
int fscanf(FILE *fp,const char *format, ...) Lee del archivo descrito por fp.
Tanto esta llamada como la anterior son las equivalentes de printf y scanf
que operan sobre ficheros.
Mayo 2013
101
Introduccin al
Lenguaje de Programacin C
Archivos
Almacenar datos en memoria principal, podra ser temporal al terminal la
ejecucin del programa los datos se perderan. Una forma de conservarlos
permanentemente es haciendo el uso de archivos, lo cual no solo nos dara la
posibilidad de almacenamiento permanente sino la capacidad de almacenar
grandes cantidades de datos. Normalmente asociamos los archivos a dispositivos
de almacenamiento secundario, especialmente los discos. Entonces, un archivo
se puede ver como una secuencia de bytes sin formato almacenados en un
dispositivo que y que puede ser tratado como una unidad lgica. La forma en
que estos bytes son organizados dentro del archivo (formato) pueden ser muy
variados y a depender de
significado.
La gestin de los archivos es realizada por el sistema de operacin, el cual provee
de un conjunto de primitivas para su manipulacin, El Sistema de Operacin
proporciona servicios a travs de un conjuntos de llamadas al sistema, que son
funciones dentro del sistema que pueden ser invocadas por los programas de
usuarios.
En Unix/Linux el sistema de archivo esta organizado de forma jerrquica con un
nodo principal conocido como root,
Mayo 2013
102
Introduccin al
Lenguaje de Programacin C
Entre las operaciones bsicas sobre archivos se tiene las de abrir y cerrar un
archivo, la de llevar o leer un byte o un conjunto de ellos (bloque, lnea o registro)
a un rea del programa (buffer o algn tipo de almacenamiento temporal) de un
tamao idntico o mayor de la cantidad de bytes ledos.
El sistema de
Operacin facilita la lectura en el orden en que aparecen los bytes o los bloques
dentro del archivo, de forma anloga se llevar o escribir un rea del programa a
un archivo, al escribir en un archivo se colocan en posicin inmediata siguiente al
byte o los bytes colocados previamente.
Adicionalmente existe una instruccin, funcin o marca que nos indican que se
ha alcanzado el final del archivo o eof (end of file).
Como se menciono previamente pueden existir muchos tipos de archivos, una
forma de organizar la informacin en un archivo puede ser haciendo uso de un
registro, es decir un grupo de campos relacionados, entonces se puede ver el
archivo como un conjunto de registros, para facilitar su recuperacin se podra
seleccionar un campo del registro, o una combinacin de ellos, como una clave
lo cual lo identificara de forma nica al registro. Por ejemplo en el caso de
registro de una persona su nmero de cedula. Teniendo en cuenta esto los
archivos se podran organizar de diversas formas, la ms comn se conoce como
secuencial, donde los registros se organizar de forma consecutiva, posiblemente
ordenado por algn criterio, para leer un archivo secuencial se comienza por el
principio y se lee un registro a la vez hasta llegar al registro deseado. Esta
organizacin suele ser til en procesamiento por lotes donde se procesan todos
los registros y no necesariamente todos los registros tienen el mismo tamao, lo
que puede complicar la modificacin de un registro. Para realizar las operaciones
de actualizacin de los registros, usualmente se vuelve a escribir la totalidad del
archivo.
Mayo 2013
103
Introduccin al
Lenguaje de Programacin C
Otra forma de llegar al registro deseado utilizar archivos de acceso directo que
explotan la capacidad de los discos para acceder directamente a cualquier
rea o bloque dada una direccin o desplazamiento, es decir se pueden tratar
de forma anloga a un arreglo. En este tipo de organizacin se requiere una
forma de asociar el contenido de un registro con su posicin, y los registros suelen
ser todos del mismo tamao. Al tener los registros la misma longitud los datos
pueden ser actualizados sin necesidad de reescribir la totalidad del archivo
Manipulacin de archivos en C
En C los archivos se ven como un flujo secuencial de bytes, que terminan con
marcador de fin de archivo. Cuando se abre un archivo se le asocia un flujo que
no es ms que una estructura de tipo FILE. Al empezar la ejecucin de un
programa se abren automticamente tres archivos y sus flujos correspondientes,
la entrada estndar (stdin), la salida estndar (stdout) y el error estndar (stderr).
Normalmente stdin est conectado al teclado y stdout y stderr se conectan a la
Mayo 2013
104
Introduccin al
Lenguaje de Programacin C
Mayo 2013
105
Introduccin al
Lenguaje de Programacin C
/*
* UCAB Guayana
* Introduccion al Lenguaje C
*/
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[]){
FILE *af, *ad;
int c;
if(argc != 3){
fprintf(stderr, "Error en argumentos\n");
exit(EXIT_FAILURE);
}
if((af=fopen(argv[1],"r"))==NULL){
fprintf(stderr, "No se puede abrir %s\n",argv[1]);
exit(EXIT_FAILURE);
}
if((ad=fopen(argv[2],"w"))==NULL){
fprintf(stderr, "No se puede abrir %s\n",argv[2]);
exit(EXIT_FAILURE);
}
while((c=getc(af))!=EOF)
putc(c,ad);
fclose(af);
fclose(ad);
printf("%s copiado en %s\n", argv[1], argv[2]);
exit(EXIT_SUCCESS);
}
/* fin del ejemplo */
Mayo 2013
106
Introduccin al
Lenguaje de Programacin C
Memoria Dinmica
Aunque
el
lenguaje
NO
define
ninguna
facilidad
para
asignacin de
Mayo 2013
107
Introduccin al
Lenguaje de Programacin C
/*
* UCAB Guayana
* Introduccion al Lenguaje C
*/
#include <stdio.h>
#include <malloc.h>
char *B, *A = "HOLA MUNDO";
int mystrlen(const char *s){
const char *p = s;
while(*p)
p++;
return p-s;
}
void mystrcpy(char *d,const char *f){
while(*d++=*f++);
}
char *mystrdup(const char *f){
char *p;
p = (char *)malloc(mystrlen(f)+1);
if(p!=NULL)
mystrcpy(p,f);
return p;
}
int main(void){
printf("A:%s\n",A);
printf("Longitud A:%d\n",mystrlen(A));
B = mystrdup(A);
printf("B:%s\n",B);
return 0;
}
/* --- Fin ejemplo --- */
Mayo 2013
108
Introduccin al
Lenguaje de Programacin C
/*
* UCAB Guayana
* Introduccion al Lenguaje C
*/
Mayo 2013
109
Introduccin al
Lenguaje de Programacin C
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char **argv){
int *xp, *yp;
xp = (int *) malloc(sizeof(int));
*xp = 5;
yp = xp;
*yp = 10;
printf("*xp: %d\n",*xp);
return 0;
}
/* --- Fin ejemplo --- */
Referencias pendientes
Las referencias pendientes es un segundo problema que se puede presentar con
el uso de apuntadores. Una referencia pendiente es una localizacin que ha sido
desasignada del entorno, pero a la que el programa puede tener acceso
todava, es decir una localizacin puede ser accedida ms all de su tiempo de
vida.
char *i2a(int numero){
char buffer[20];
sprintf(buffer,"%d",numero);
return buffer;
}
Mayo 2013
110
Introduccin al
Lenguaje de Programacin C
dinmica
/*
* UCAB Guayana
* Introduccion al Lenguaje C
*/
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char **argv){
int *xp;
xp = (int *) malloc(sizeof(int));
*xp = 5;
free(xp);
printf("*xp: %d\n",*xp);
return 0;
}
/* --- Fin ejemplo --- */
Mayo 2013
111
Introduccin al
Lenguaje de Programacin C
Mayo 2013
112
Introduccin al
Lenguaje de Programacin C
Mayo 2013
113
Introduccin al
Lenguaje de Programacin C
El preprocesador
El preprocesador se ejecuta al comenzar el proceso de compilacin, es decir una
fase previa a ste, y se encarga de realizar ciertas tareas bsicas; entre estas
tareas estn la inclusin de archivos, expansin de macros y procesar de
directivas.
Las directivas del preprocesador empiezan por # y las principales son:
#include
Incluir archivos.
#define
#undef
Mejor:
Mayo 2013
114
Introduccin al
Lenguaje de Programacin C
Mejor:
/*
* UCAB Guayana
* Introduccion al Lenguaje C
*/
#include <stdio.h>
#define MAX(X,Y) ((X)>(Y)?(X):(Y))
int main(void){
int a,b;
printf("Un entero:");
scanf("%d",&a);
printf("Otro entero:");
scanf("%d",&b);
#ifdef DEPURAR
printf("valor a:%d\n",a);
printf("valor b:%d\n",b);
#endif
printf("Maximo entre %d y %d es %d\n",a,b,MAX(a,b));
return 0;
}
/* --- Fin ejemplo --- */
Mayo 2013
115
Introduccin al
Lenguaje de Programacin C
i1 = f1 = REDONDEAR(f);
i2 = f2 = TRUNCAR(f);
f3 = P_DECIMAL(f);
c1 = '0'+i1;
c2 = '0'+i2;
c3+=('A'-'a');
printf("+-+-+-+-+-+-+-+-+-+\n");
#ifdef DEPURAR
printf("f:%f f1:%f f2:%f f3:%f\n",f,f1,f2,f3);
printf("c1:%c c2:%c c3:%c\n",c1,c2,c3);
#endif
printf("+-+-+-+-+-+-+-+-+-+\n");
return 0;
}
/* --- Fin ejemplo --- */
Mayo 2013
116
Introduccin al
Lenguaje de Programacin C
Archivo en C
#include <stdio.h>
extern void fortfunc_(int *a, int *b);
int main(){
int a=1,b=2;
printf("Antes a:%d b:%d\n",a,b);
fortfunc_(&a, &b);
printf("Despues a:%d b:%d\n",a,b);
return 0;
}
Archivo en Fortran77
subroutine fortfunc(i,j)
integer i
integer j
i=5
j=6
Mayo 2013
117
Introduccin al
Lenguaje de Programacin C
return
end
Salida
E:\Pruebas
Antes a:1 b:2
Despues a:5 b:6
Mayo 2013
118
Introduccin al
Lenguaje de Programacin C
Mayo 2013
119
Introduccin al
Lenguaje de Programacin C
Algoritmos y aplicaciones
A continuacin se muestran algunos programas que pueden ser de inters
Mayo 2013
120
Introduccin al
Lenguaje de Programacin C
printf("%d ",i);
printf("}\n");
}
Conjunto C_union(Conjunto A, Conjunto B){
return A|B;
}
Conjunto C_interseccion(Conjunto A, Conjunto B){
return A&B;
}
int main(void){
char *r[2]={"No","Si"};
Conjunto A,B,C;
A=C_vaciar();
B=C_vaciar();
A=C_meter(A,0);
A=C_meter(A,5);
A=C_meter(A,10);
B=C_meter(B,10);
B=C_meter(B,15);
C=C_union(A,B);
printf("A:");
C_imprime(A);
printf("B:");
C_imprime(B);
printf("A Union B:");
C_imprime(C);
printf("A Interseccion B:");
C_imprime(C_interseccion(A,B));
C=C_sacar(C,10);
printf("C:");
C_imprime(C);
printf("%d %s pertenece a C",5,r[C_pertenece(C,5)]);
return 0;
}
/* --- Fin ejemplo --- */
Mayo 2013
121
Introduccin al
Lenguaje de Programacin C
Mayo 2013
122
Introduccin al
Lenguaje de Programacin C
Mayo 2013
123
Introduccin al
Lenguaje de Programacin C
int main(void) {
int i=0;
BiCola mbp;
mbp = inicializarBiCola(10);
for(i=0;i<6;i++){
BiColaPonerFrente(mbp,i);
i++;
BiColaPonerAtras(mbp,i);
}
while(BiColaQuitarFrente(mbp,&i))
printf("%d ",i);
printf("\n");
for(i=0;i<6;i++){
BiColaPonerFrente(mbp,i);
i++;
BiColaPonerAtras(mbp,i);
}
while(BiColaQuitarAtras(mbp,&i))
printf("%d ",i);
printf("\n");
for(i=0;i<11;i++)
BiColaPonerAtras(mbp,i);
while(BiColaQuitarFrente(mbp,&i))
printf("%d ",i);
printf("\n");
for(i=0;i<11;i++)
BiColaPonerFrente(mbp,i);
while(BiColaQuitarAtras(mbp,&i))
printf("%d ",i);
printf("\n");
for(i=0;i<11;i++)
BiColaPonerFrente(mbp,i);
while(BiColaQuitarFrente(mbp,&i))
printf("%d ",i);
printf("\n");
for(i=0;i<11;i++)
BiColaPonerAtras(mbp,i);
while(BiColaQuitarAtras(mbp,&i))
printf("%d ",i);
return EXIT_SUCCESS;
}
Mayo 2013
124
Introduccin al
Lenguaje de Programacin C
Bibliografa recomendada
Deitel P.J. & Deitel H.M., Como programar en C/C++, Prentice Hall, 1995.
Mayo 2013
125
Introduccin al
Lenguaje de Programacin C
ANEXOS
Mayo 2013
126
Introduccin al
Lenguaje de Programacin C
Anexo A
Ejemplo de algunas declaraciones que pueden ser de ayuda y utilidad para
entender o hacer declaraciones, sobre todo cuando se utilizan apuntadores.
int i; // integer variable
int *p; // pointer to integer variable
int a[]; // array of integer
int f(); // function with return value integer
int **pp; // pointer to pointer to integer
int (*pa)[]; // pointer to an array of integer
int (*pf)(); // pointer to a function with return value integer
int *ap[]; // array of pointers to integer
int *fp(); // function, which returns a pointer to an integer
int ***ppp; // pointer to a pointer to a pointer to integer
int (**ppa)[]; // pointer to a pointer to an array of integer
int (**ppf)(); // pointer to a pointer to a function with return value integer
int *(*pap)[]; // pointer to an array of pointers to integer
int *(*pfp)(); // pointer to function with return value pointer to integer
int **app[]; // array of pointer to pointer to integer
int (*apa[])[];// array of pointers to array of integer
int (*apf[])();// array of pointers to functions with return value integer
int ***fpp(); // function with return value pointer to pointer to pointer to int
int (*fpa())[];// function with return value pointer to array of integers
int (*fpf())();// function with return value pointer to function, which returns an integer
Mayo 2013
127
Introduccin al
Lenguaje de Programacin C
Manual de gcc
GCC(1)
GNU Tools
GCC(1)
NAME
gcc, g++ - GNU project C and C++ Compiler (gcc-2.96)
SYNOPSIS
gcc [ option | filename ]...
g++ [ option | filename ]...
WARNING
The information in this man page is an extract from the
full documentation of the GNU C compiler, and is limited
to the meaning of the options.
This man page is not kept up to date except when volunteers want to maintain it.
If you find a discrepancy
between the man page and the software, please check the
Info file, which is the authoritative documentation.
If we find that the things in this man page that are out
of date cause significant confusion or complaints, we will
stop distributing the man page. The alternative, updating
the man page when we update the Info file, is impossible
because the rest of the work of maintaining GNU CC leaves
us no time for that. The GNU project regards man pages as
obsolete and should not let them take time away from other
things.
For complete and current documentation, refer to the Info
file `gcc' or the manual Using and Porting GNU CC (for
version 2.0). Both are made from the Texinfo source file
gcc.texinfo.
DESCRIPTION
The C and C++ compilers are integrated.
Both process
input files through one or more of four stages: preprocessing, compilation, assembly, and linking. Source filename suffixes identify the source language, but which name
you use for the compiler governs default assumptions:
gcc
g++
Mayo 2013
the
language
and
128
Introduccin al
Lenguaje de Programacin C
.c
.C
.cc
.cxx
.m
.i
.ii
.s
.S
.h
Com-
Object file
Archive file
Linking is always the last stage unless you use one of the
-c, -S, or -E options to avoid it (or unless compilation
errors stop the whole process). For the link stage, all
.o files corresponding to source files, -l libraries,
unrecognized filenames (including named .o object files
and .a archives) are passed to the linker in command-line
order.
OPTIONS
Options must be separate: `-dr' is
`-d -r '.
quite
different
from
Most `-f' and `-W' options have two contrary forms: -fname
and -fno-name (or -Wname and -Wno-name).
Only the nondefault forms are shown here.
Here is a summary of all the options, grouped by type.
Explanations are in the following sections.
Overall Options
-c -S -E -o file -pipe -v -x language
Language Options
-ansi -fcond-mismatch -fdollars-in-identifiers
-fexternal-templates -fno-asm -fno-builtin -fhosted
-fno-hosted -ffreestanding -fno-freestanding
-fno-strict-prototype -fsigned-bitfields
-fsigned-char -funsigned-bitfields -funsigned-char
-fwritable-strings -traditional -traditional-cpp
-trigraphs
Warning Options
-fsyntax-only -pedantic -pedantic-errors -w -W
-Wall -Waggregate-return -Wcast-align -Wcast-qual
-Wchar-subscript -Wcomment -Wconversion -Werror
Mayo 2013
129
Introduccin al
Lenguaje de Programacin C
Mayo 2013
130
Introduccin al
Lenguaje de Programacin C
Mayo 2013
131
Introduccin al
Lenguaje de Programacin C
-mtrailing-colon
i960 Options
-mcpu-type -mnumerics -msoft-float
-mleaf-procedures -mno-leaf-procedures -mtail-call
-mno-tail-call -mcomplex-addr -mno-complex-addr
-mcode-align -mno-code-align -mic-compat
-mic2.0-compat -mic3.0-compat -masm-compat
-mintel-asm -mstrict-align -mno-strict-align
-mold-align -mno-old-align
DEC Alpha Options
-mfp-regs -mno-fp-regs -mno-soft-float -msoft-float
System V Options
-G -Qy -Qn -YP,paths -Ym,dir
Code Generation Options
-fcall-saved-reg -fcall-used-reg -ffixed-reg
-finhibit-size-directive -fnonnull-objects
-fno-common -fno-ident -fno-gnu-linker
-fpcc-struct-return -fpic -fPIC -freg-struct-return
-fshared-data -fshort-enums -fshort-double
-fvolatile -fvolatile-global -fverbose-asm
Mayo 2013
132