La mayoría de los lenguajes de programación le permiten dividir un programa desordenado y de larga ejecución en fragmentos ordenados y con nombres. Estos fragmentos se denominan funciones. Le permiten reutilizar código en lugar de reescribir la misma lógica una y otra vez. Una función toma entradas, conocidas como parámetros, y genera un resultado. En C, puedes pasar tantos parámetros como necesites. Al compilador no le importa el orden de las funciones en su archivo fuente, siempre que conozca el nombre de la función antes de intentar ejecutarla.
Tocamos esto brevemente con la función rand. Es la función más simple posible. No toma nada y devuelve un número entero.
La línea int rand() le dice al compilador que rand es una función. No acepta parámetros y devuelve un número entero. Esta versión específica no tiene variables locales. Si fuera así, se ubicarían justo debajo de la llave de apertura {. C le permite declarar variables en cualquier lugar después de {. Existen hasta que se alcanza el } coincidente. Luego desaparecen. Mientras están vivas, las variables locales viven en la pila del sistema.
Tenga en cuenta la falta de un punto y coma después de rand(). Si accidentalmente ingresa uno, recibirá una enorme cascada de mensajes de error del compilador que no tienen sentido. Incluso sin parámetros, debes usar los paréntesis. Sin ellos, no estás declarando una función. Simplemente estás declarando un número entero.
La declaración de devolución y los múltiples puntos de salida
La declaración return es fundamental para cualquier función que proporcione un resultado. Establece el valor que se devolverá y sale de la función inmediatamente. Puede colocar varias declaraciones de devolución en una sola función para crear múltiples puntos de salida.
Si olvida la declaración de retorno en una función que debería devolver un valor, la función sale cuando llega a la llave de cierre. Devuelve un valor basura aleatorio. La mayoría de los compiladores modernos le avisarán si no devuelve un valor específico. C admite la devolución de cualquier tipo: int, float, char, struct y más.
Hay varias formas correctas de llamar a la función rand. La más común es la asignación:
Aquí, la variable x obtiene el valor devuelto por rand. Debes incluir los paréntesis en la llamada, incluso si no hay parámetros. Sin ellos, x recibe la dirección de memoria de la función rand. Rara vez eso es lo que pretendías.
También puedes llamarlo dentro de una condición:
O simplemente ignore el resultado:
En el último caso, la función se ejecuta pero el valor devuelto se descarta. Quizás no quieras hacer esto con rand, pero muchas funciones usan el valor de retorno como código de error. Si sabe que un error es imposible, descartar el código está bien.
Manejo de devoluciones nulas
A veces no quieres devolver nada. Utilice un tipo de devolución “void” para esto.
Esta función genera texto pero no devuelve ningún valor. Lo llamas así:
Nuevamente, incluya los paréntesis. Si los omite, no se llama a la función. Se compilará correctamente en muchos sistemas, pero no hará nada.
Parámetros y código C antiguo
Las funciones C pueden aceptar parámetros de cualquier tipo. Aquí hay una función que calcula el factorial de un número:
El parámetro “i” se pasa como un número entero. Para pasar varios parámetros, sepárelos con comas.
C ha evolucionado. De vez en cuando verá código antiguo escrito en el “estilo antiguo”. Se parece a esto:
Necesitas poder leer esta notación antigua. Se ejecuta exactamente de la misma manera. Es simplemente una sintaxis diferente. Debe utilizar el “nuevo estilo”, conocido como ANSI C, donde los tipos se declaran en la lista de parámetros. Utilice únicamente el estilo antiguo si sabe que está enviando el código a alguien con un compilador que no sea ANSI.
Por qué esto es importante para los usuarios cotidianos
Es posible que no escriba funciones C a diario. Pero comprender cómo funcionan cambia su forma de pensar sobre el software. Cada vez que hace clic en un botón en una aplicación web, es probable que una función procese ese clic, verifique los parámetros y devuelva un estado. Si alguna vez ha visto un “error de tiempo de ejecución” o un “desbordamiento de pila”, se ha encontrado con los límites de estos mecanismos.
La distinción entre pasar un valor y pasar una referencia (la dirección de memoria) es una fuente común de errores. En los lenguajes de alto nivel, esto suele estar oculto. En C, es explícito. Saber que “rand” sin paréntesis devuelve una dirección, no un número, ahorra horas de depuración.
El debate entre el estilo antiguo y el nuevo se resuelve en gran medida para los nuevos proyectos. ANSI C es el estándar. Pero todavía existen bases de código heredadas. Saber leer int add(i,j) int i; int j; evita que te quedes atascado en un código que parece incorrecto pero que funciona perfectamente. Es una cuestión de alfabetización.
¿Realmente te importa la pila? Si su programa falla inesperadamente, el seguimiento de la pila es su única pista. Las variables locales que desaparecen cuando llegan a la llave de cierre no es un error. Es una característica. Mantiene el uso de la memoria predecible.
No existe una manera perfecta de escribir código. Sólo existe la forma que se compila y la que no. Mantenga los paréntesis. Cuida tus devoluciones. Y no asuma que el compilador le salvará de sus propios errores de sintaxis. No lo hará.







































