Un programa C est� formado por un conjunto de funciones que al menos contiene la funci�n main. Una funci�n se declara con el nombre de la funci�n precedido del tipo de valor que retorna y una lista de argumentos encerrados entre par�ntesis. El cuerpo de la funci�n est� formado por un conjunto de declaraciones y de sentencias comprendidas entre llaves. Veamos un ejemplo de utilizaci�n de funciones:
#include <stdio.h> #define VALOR 5 #define FACT 120 int fact_i ( int v ) { int r = 1, i = 0; while ( i <= v ) { r = r * i; i = i + 1; } return r; } int fact_r ( int v ) { if ( v == 0 ) return 1; else return v * fact_r(v-1); } main() { int r, valor = VALOR; if ( (r = fact_i(valor)) != fact_r(valor) ) printf("Codificaci�n err�nea!!.\n"); else if ( r == FACT ) printf("Codificaci�n correcta.\n"); else printf("Algo falla!!.\n"); }
Se definen dos funciones, fact_i y fact_r, adem�s de la funci�n main. Ambas toman como par�metro un valor entero y devuelven otro entero. La primera calcula el factorial de un n�mero de forma iterativa, mientras que la segunda hace lo mismo de forma recursiva.
Todas las l�neas que comienzan con el s�mbolo # indican una directiva del precompilador. Antes de realizar la compilaci�n en C se llama a un precompilador cuya misi�n es procesar el texto y realizar ciertas sustituciones textuales. Hemos visto que la directiva #include incluye el texto contenido en un fichero en el fuente que estamos compilando. De forma parecida, #define nombre texto sustituye todas las apariciones de nombre por texto. As�, en el fuente, la palabra VALOR se sustituye por el n�mero 5.
El valor que debe devolver una funci�n se indica con la palabra return. La evaluaci�n de la expresi�n debe dar una valor del mismo tipo de dato que el que se ha definido como resultado. La declaraci�n de una variable puede incluir una inicializaci�n en la misma declaraci�n.
Se debe tener muy en cuenta que en C todos los argumentos son pasados 'por valor'. No existe el concepto de paso de par�metros 'por variable' o 'por referencia'. Veamos un ejemplo:
int incr ( int v ) { return v + 1; } main() { int a, b; b = 3; a = incr(b); /* a = 4 mientras que b = 3. No ha cambiado despu�s de la llamada. */ }
En el ejemplo anterior el valor del par�metro de la funci�n incr, aunque se modifique dentro de la funci�n, no cambia el valor de la variable b de la funci�n main. Todo el texto comprendido entre los caracteres /* y */ son comentarios al programa y son ignorados por el compilador. En un fuente C los comentarios no se pueden anidar.