Blag/content/posts/002-hola-mundo.md

145 lines
4.1 KiB
Markdown
Raw Normal View History

2022-01-24 22:25:30 +01:00
---
2022-01-24 22:38:08 +01:00
title: "Hola mundo"
2022-01-24 22:25:30 +01:00
date: 2022-01-24T20:32:57+01:00
draft: false
2022-01-24 22:38:57 +01:00
weight: 2
2022-01-24 22:25:30 +01:00
---
# Hola mundo
## Escribiendo y ejecutando hola mundo.
Es una tradición entre los programador comenzar a aprender un lenguaje
escribiendo hola mundo en pantalla con el mismo.
El programa más simple para hacer esto en C es:
```c
#include <stdio.h>
int
main (int argc, char **argv) {
printf ("%s\n", "Hello world!!!");
return 0;
}
```
Si introducimos este código en un fichero llamado `hola_mundo.c` ya
tendremos un programa capaz de escribir Hello world en pantalla; no
obstante el ordenador aun no es capaz de entender dicho programa debido
a que está escrito en lenguaje humano.
Para compilarlo a lenguje máquina necesitaremos el compilador de C
`gcc`.
Si usas una distribución basada en Debian puedes obtenerlo usando:
```shell
sudo apt update && sudo apt install build-essential
```
Una vez tengamos el compilador instalado podrás compilar tu código usando:
```shell
gcc hola_mundo.c -o hola_mundo
```
Y ejecutarlo con:
```shell
./hola_mundo
```
```
Hello world!!!
```
## Explicando los conceptos nuevos introduccidos en el programa.
Este programa a pesar de ser muy simple es muy bueno para explicar muchos
conceptos del lenguaje C a los recien llegados al lenguaje analizemoslo
por partes:
```
#include <stdio.h>
```
Esta línea incluye una parte de la librería estandar de C que se encarga
de manipular como su nombre indica io (Entrada/Salida).
Hemos tenido que importar los nombres de esa librería o header en nuestro
programa para tener la función `printf` disponible que se encarga de
pintar en pantalla, lo veremos más adelante.
```
int
main (int argc, char **argv) {
```
En estas dos líneas estamos abriendo la función main, que es la función que
será la primera en ser ejecutada en los programas escritos en C.
El primer `int` indica que esta función retornará un entero, en es caso
de la función main este entero se usará como el estado de salida
del proceso.
0 significa que todo ha ido bien, pero para hacer nuestro
programa útil para shell scripting a veces necesitaremos indicar que ha ido
mal, para ello solo tendremos que indicar un estado distinto de 0.
`main` es el nombre de la función que podremos usar en otras funciones para
llamarla
```
(int argc, char **argv)
```
Siempre que un programa hecho en C quiera parsear sus parámetros necesariamente
tendrá que dejar esta firma de parametros en su función main, si no nos
importan los parámetros podríamos haber escrito:
```
(void)
```
`int argc` indica el numero de parámetros recibidos en nuestro programa.
`char **argv`
Un tipo seguido de un * indica que el mismo es un puntero, un puntero
puede guardar una dirección de memoria que te permite acceder a una o
más instancias de un tipo de dato, en este caso se usan punteros para guardar
lo que comúnmente se conocerían en otros lenguajes como arrays.
Osea `char **` significa puntero a puntero de char o array de arrays de char.
En C los strings se suelen representar como `char *` por tanto también podríamos
verlo como un array de strings.
En C un array que no hayamos creado nosotros es muy dificil saber su tamaño,
otros lenguages te permiten hacer cosas como `length (argv)` para
remediar esto, pero C al ser un lenguaje de bajo nivel espera que sea
el programador quien se encargue de ello.
`char **argv` no lo hemos creado nosotros; sin embargo podemos usar argc para
conocer su tamaño.
Pero, ¿Y el tamaño de los strings contenidos por argv?
Para evitar tener que propagar el tamaño de cada string en C se usa una
convención de que todos los strings terminan en un caracter nulo, por lo
que con la función strlen podremos saber el tamaño de un string sin que
nos lo hayan pasado.
`printf ("%s\n", "Hello world!!!");` La función printf usa format strings
para funcionar, el primer argumento define como se renderizaran los siguientes,
es decir `%s` significa pintar el primer argumento como un string `\n` imprimir un salto de línea.
`return 0;` indica finalizar el programa con estado de retorno 0.
```
}
```
Simplemente termina la función y con ella el programa.