Explicación del primer programa en C

Explicación del primer programa en C

En la clase anterior instalamos el compilador GCC y creamos el ejemplo más simple de hello world. En esta lección vamos a analizar este ejemplo línea por línea. Primero veamos el código:

#include <stdio.h>

int main()
{
    printf("hello, world\n");
    return 0;
}
Lenguaje del código: Arduino (arduino)

El código es muy sencillo, solo sirve para imprimir una línea de texto.

A continuación analizaremos cada línea del código de arriba hacia abajo.

1. #include <stdio.h>

En la primera clase mencionamos brevemente el preprocesado, y esta primera línea es una instrucción de preprocesado. ¿Cómo lo sabemos? Por el símbolo #.

#: Marcador de instrucción de preprocesado, enviado al preprocesador y ejecutado en el primer paso de la compilación.

include: Palabra clave para importar archivos de cabecera, su función es copiar todo el código del archivo indicado dentro del programa actual.

<stdio.h>: Archivo de cabecera estándar de entrada y salida (standard input output). Contiene funciones para imprimir en pantalla y leer entradas del teclado, la función printf que usamos más abajo está definida aquí.

Estrictamente hablando, el preprocesado no forma parte de la sintaxis del lenguaje C. El preprocesado de C no es un componente de la sintaxis central de C, es una etapa independiente que el compilador ejecuta antes de la compilación propiamente dicha. Forma parte del flujo completo de compilación, pero no pertenece al sistema sintáctico y semántico nativo del lenguaje C.

En resumen, un programa de preprocesado separado realiza sustituciones de texto. En este caso, #include <stdio.h> reemplaza esta línea por todo el contenido del archivo stdio.h. Supongamos que stdio.h solo tuviera el texto AAAAAAAAA.

Entonces, antes de pasar el código al compilador, quedaría así:

 AAAAAAAAA

int main()
{
    printf("hello, world\n");
    return 0;
}
Lenguaje del código: Arduino (arduino)

Por supuesto esto es solo una hipótesis, el contenido real del archivo de cabecera es mucho más complejo. Los curiosos pueden abrir el archivo para revisarlo.

Este archivo de cabecera se guarda en tu ordenador, la ruta varía según el sistema operativo:

Sistemas Linux/Unix: Normalmente en /usr/include/stdio.h

Windows (Visual Studio): En VC/include/stdio.h

macOS (Xcode): En /Applications/Xcode.app/.../usr/include/stdio.h

Puedes usar herramientas de búsqueda para localizar este archivo en tu equipo.

¿Ahora entiendes básicamente cómo funciona el preprocesado?

Si eliminas la línea #include <stdio.h>, el compilador no reconocerá printf y generará un error. Prueba a borrar esta línea y compilar con gcc para ver el resultado.

Después de borrar el archivo de cabecera

Al volver a compilar aparecerá un mensaje de error

2. int main()

main = Función de punto de entrada de los programas C

  1. Al ejecutar cualquier programa C, el sistema operativo empieza automáticamente por la función main. Solo puede existir una única función main por programa.
  2. int: Tipo de valor devuelto por la función, abreviatura de integer (entero).
  3. (): Indica que se trata de una función; dentro se pueden escribir parámetros, los paréntesis vacíos significan que no recibe parámetros.

Esta sintaxis de main se heredó en la mayoría de lenguajes de programación posteriores, es el único punto de arranque del programa. Al hacer doble clic en un archivo exe o ejecutar un comando en la terminal (como hello), el sistema operativo llama automáticamente a esta función main.

El int del principio indica el tipo de retorno de la función. Más adelante, cuando definamos nuestras propias funciones, tendremos que especificar siempre este tipo, lo veremos en clases posteriores.

Los paréntesis () sirven para declarar los parámetros que acepta la función; aquí están vacíos, así que no recibe ninguno. También existe una versión con parámetros:

int main(int argc, char *argv[])Lenguaje del código: CSS (css)

Esta escritura acepta dos parámetros: uno de tipo entero y un array de cadenas, lo explicaremos en próximas lecciones.

Los parámetros de main los envía el sistema operativo, ¿de dónde salen esos valores?

Seguramente has usado herramientas de línea de comandos como el comando ping. Por ejemplo, ping 12.36.4.xxx comprueba la conexión de red: ping corresponde al programa ping.exe, y la dirección IP 12.36.4.xxx es un parámetro enviado a la función main de ping.exe.

Igual con nuestro programa hello: si ejecutas hello abc en la terminal, abc se pasa como parámetro. Las variables dentro de los paréntesis de main reciben estos valores introducidos por el usuario y transmitidos por el sistema operativo.

Recuerda esto por ahora: main es el único punto de entrada del programa, solo puede haber una, el sistema operativo la invoca y le pasa los argumentos de la línea de comandos.

3. { } Llaves

Delimitan el cuerpo de la función: { marca el inicio del código de la función, } el final. Todo el código de la función va entre ambas llaves.

4. printf("hello, world\n");

  • printf: Abreviatura de print format, función de impresión formateada que muestra texto en la consola.
  • Comillas dobles " ": Encierran una cadena constante, el texto que queremos imprimir va dentro.
  • \n: Carácter de escape, salto de línea: después de imprimir el texto, el cursor pasa automáticamente a la línea siguiente.
  • ;: Marcador de fin de instrucción en C. Cada instrucción ejecutable debe terminar en punto y coma; si se olvida, habrá error de compilación.

La letra f al final del nombre de la función significa format (formato), lo profundizaremos más adelante. Por ahora entiende que esta línea muestra el texto hello, world\n en consola y que \n añade un salto de línea automático.

5. return 0;

  • return: Devuelve un valor entero a la función main y finaliza su ejecución. ¿Por qué hace falta return? Porque declaramos que main devuelve int, así que debemos retornar un entero dentro de la función.
  • 0: Convención estándar que significa que el programa terminó correctamente sin errores, informa al sistema operativo del estado de ejecución.
    • Devolver 0 = Ejecución exitosa del programa
    • Devolver un número distinto de 0 (ej: return 1;) = Finalización anómala con error

Los estándares C modernos permiten omitir return 0; al final de main, el compilador lo agrega automáticamente. No obstante, se recomienda escribirlo explícitamente a los principiantes para seguir las convenciones.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *