Diferencia entre revisiones de «Programación en C/Primer programa en C»

Contenido eliminado Contenido añadido
Muevo lo de los comentarios
Modifico la estructura del capítulo, sacando comentarios relacionados a vim y codificación de colores.
Línea 6:
</noinclude>
 
DennisEn Ritchie, autor principal del lenguaje C, junto con Brian Kernighan, presentaron en su famosoel libro "El Lenguaje de Programación C", Kernighan y Ritchie introdujeron al lenguaje C conutilizando un sencillo programa que mostraba un saludo por la pantalla. Desde entonces se hizo tradición empezar con cualquier lenguaje de programación con esteel ejemplo del '''[[w:Hola mundo|Hola mundo]]'''.
 
En particular en C se involucran muchas partes y sintaxis del lenguaje, por lo quecual noes podemosespecialmente evitarútil presentarloverlo como el primer ejemplo de programación en C.
 
'''Ejemplo: Hola mundo'''
<source lang=c>
/* Inclusión de archivos */
#include <stdio.h> /*Incluimos el archivo de cabecera "standard input output"*/
#include <stdio.h>
 
/* Función principal */
int main (int argc,char **argv) /*Creamos la función principal (main = principal)*/
int main (int argc,char **argv)
{
{
printf("Hola mundo\n"); /*Usamos printf() para mostrar un mensaje en la pantalla*/
/* Impresión por pantalla y salida del programa*/
return(0);
printf("Hola mundo\n");
return 0;
}
</source>
 
Para poder editar y ejecutar este programa será necesario utilizar algún editor y luego un compilador, como se explicó en la sección [Programación_en_C/Herramientas Herramientas necesarias].
Si compilamos este programa y lo ejecutamos el resultado será:
 
Si se tiene el compilador <code>gcc</code> en un entorno UNIX o GNU/Linux, la forma sencilla de compilar y ejecutar será:
Hola mundo
 
<pre>
<!-- Esto hay que ponerlo en un apéndice sobre compilación -->
$ gcc holamundo.c
Para crear el programa podemos utilizar cualquier editor de texto simple (no un editor de texto con formato como OpenOffice.org). Si utilizamos el editor [[:w:Vim|<code>vim<code>]] podremos, con el comando <pre>:syntax on</pre> aprovecharnos de las claves visuales en forma de colores con que se muestra aquí el programa. Después de grabarlo (por ejemplo, con el nombre <code>holamundo.c</code>), lo [[:w:Compilar|compilamos]] y ejecutamos, con (respectivamente):
$ ./a.out
Hola Mundo
$
</pre>
 
Es decir que el compilador genera un archivo, en este caso llamado a.out, y la salida generada por ese archivo es "Hola mundo". A continuación una explicación detallada dobre el proceso de compilación del programa.
$ gcc holamundo.c
$ ./a.out
Hola Mundo
$
 
== Compilar un programa ==
{{:Programación en C/Compilar un programa}}
 
== Diseccionando el "Hola Mundo" ==
 
HaA llegadocontinuación elveremos momento de ver cualcuál es la estructura básica de un programa en '''C''', ypara de saberpoder porentender qué hacenhace faltacada tantasuna líneasde cuandolas enlíneas [[:w:BASIC|BASIC]],de pornuestro ejemplo, basta unsencillo programa de una línea para exactamente lo mismo:.
 
Es probable que lo primero que salte a la vista sea la línea:
<font color="red" size=1>EJEMPLO BASIC:</font>
 
<source lang=c>
<code>print "Hola Mundo"</code>
printf("Hola mundo\n");
</source>
 
Esta es la línea que hace aparecer la cadena <code>Hola Mundo</code> en nuestra pantalla. Notamos que en C la '''sentencia''' para imprimir algo por pantalla es <code>printf()</code> y, además, hay que colocar paréntesis alrededor de lo que queremos imprimir para utilizarla.
Lo primero que reconocemos en nuestro programa, al compararlo con el programa de una línea en BASIC, es la línea
 
Esto se debe a que en C, <code>printf</code> es una '''función''', que imprime su '''argumento''' (la cadena <code>Hola Mundo\n</code>) en la pantalla. Se denomina '''invocar''' una función a la acción de utilizarla para que realice una acción.
<code>printf(</code><font color="red"><code>"Hola Mundo</code><font color="purple"><code>\n</code></font><code>"</code></font><code>);</code>
 
Podemos observar también que la cadena a imprimir termina con una extraña combinación: <code>\n</code>. La combinación <code>\n</code> no representa a dos caracteres independientes, sino que representa un único carácter no imprimible: el salto de línea. Sin el salto de línea, el resultado al ejecutar el programa sería:
que resulta muy parecida. Efectivamente, esta línea es la que hace aparecer la cadena <code>Hola Mundo</code> en nuestra pantalla. Podemos ver que, en '''C''', la orden para imprimir algo es <code>printf()</code> y no simplemente <code>print<code><font color="red"><sub>BASIC</sub></font>, y, además, que hay que utilizar paréntesis.
 
Esto se debe a que en '''C''', que es un ejemplo paradigmático de [[:w:Programación estructurada|programación estructurada]], no se utilizan órdenes sino funciones. <code>printf</code> es una función, que imprime su argumento (la cadena <font color="red"><code>"Hola Mundo</code><font color="purple"><code>\n</code></font><code>"</code></font>) en la pantalla.
 
Podemos observar también que la cadena a imprimir termina con una extraña combinación en color púrpura: <font color="purple"><code>\n</code></font>, mientras que el resto de la cadena aparece en rojo. Esto es una indicación visual de que la combinación <font color="purple"><code>\n</code></font> no son dos caracteres independientes, sino que representa un único carácter no imprimible, el salto de línea. Sin el salto de línea, el resultado al ejecutar el programa sería:
 
<pre>
Línea 59 ⟶ 61:
</pre>
 
Es decir que no eshay ensalto absolutode línea entre la cadena impresa, y la siguiente entrada de la línea de órdenes, que no es lo que esperábamos.
 
Lo último a notar en la línea es que termina con un punto y coma. En '''C''', todas las sentencias (órdenes) terminan con un punto y coma. Al principio puede parecer obvio dónde termina una sentencia, pero ya veremos más adelante que no lo es tanto.
 
Observemos ahora la otrasiguiente sentencia del programa, la que dice simplemente:
 
<source lang=c>
<font color="orange"><code>return</code></font><code>(</code><font color="red"><code>0</code></font><code>);</code>
return 0;
</source>
 
yLuego conde laesta quesentencia, acabatermina el programa. Efectivamente,Se trata de la pseudofuncióninstrucción <font color="orange"><code>return</code></font><code>()</code> finaliza el programa, diciéndole al sistema que el '''valor de retorno''' (unel código que el sistema operativo utiliza para saber si el programa ha funcionado bien o ha dado fallos) es 0, es decir, correcto.
 
Estas dos sentencias se encuentran encerradas entre llaves. De esta manera, forman un bloque, es decir, un grupo de sentencias que se ejecutarán siempre de correlativa.
<table align="right"><tr><td><table border=1 cellspacing="0" cellpadding="3">
<tr><th colspan=2>Código de colores en <code>vim</code></th></tr>
<tr><td>anaranjado</td><td>palabras reservadas</td></tr>
<tr><td rowspan=2>rojo</td><td>constantes</td></tr>
<tr><!--td rowspan=2>rojo</td--><td>ficheros incluídos</td></tr>
<tr><td rowspan=2>púrpura</td><td>caracteres no imprimibibles</td></tr>
<tr><!--td rowspan=2>púrpura</td--><td>órdenes de preprocesador</td></tr>
<tr><td>verde</td><td>tipos de datos</td></tr>
<tr><td>azul</td><td>comentarios</td></tr>
</table></td></tr></table>
Hemos visto hasta ahora tres colores, el anaranjado, que se utiliza para las palabras reservadas del lenguaje, el rojo, para las constantes (sean constantes de cadena o constantes numéricas) y el púrpura, para las combinaciones que indican caracteres no imprimibles dentro de una constante de cadena. Aparte, vimos el azul en la parte sobre [[Programación en C/Fundamentos de programación#Comentarios|comentarios]].
 
¿Y qué es esa línea que precede (en realidad, que da nombre) al bloque? Pues es la definición de una función, la función <code>main</code>. En C (y en mucha de la programación estructurada), todo se hace a base de funciones, como la arriba comentada <code>printf</code>. La función <code>main</code> es especial, porque es la que contiene el programa completo. Es decir, cuando el ordenador va a ejecutar el programa, comienza a hacerlo por el principio de la función <code>main</code>, y cuando ésta acaba, el programa también.
Siguiendo con nuestra disección del programa, vemos que las dos sentencias se encuentran encerradas entre llaves. De esta manera, forman un bloque, es decir, un grupo de sentencias que se ejecutarán siempre de la manera correlativa que comentábamos [[Programación en C (fundamentos):Fundamentos de programación#Tipos de lenguajes|al principio]].
 
¿Y qué es esa línea que precede (en realidad, que da nombre) al bloque? Pues es la definición de una función, la función <code>main</code>. En '''C''' (y en mucha de la programación estructurada), todo se hace a base de funciones, como la arriba comentada <code>printf</code>. La función <code>main</code> es especial, porque es la que contiene el programa completo. Es decir, cuando el ordenador va a ejecutar el programa, comienza a hacerlo por el principio de la función <code>main</code>, y cuando ésta acaba, el programa también.
 
La línea:
 
<source lang=c>
<font color="green"><code>int</code></font><code> main(</code><code><font color="green">int</font> argc,<font color="green">char</font> **argv</code><code>)</code>
int main (int argc,char **argv)
</source>
 
indica al compilador que la función que viene a continuación, entre llaves, se llama <code>main</code>, cuyos argumentos son <code><font color="green">int argc</fontcode> argcy <code>char **argv</code>,( que representan a la cantidad de parámetrosargumentos cuandoingresados seal compilaejecutar el ejecutableprograma )y <code><fonta color="green">char</font>los valores de estos **argv</code>(argumentos que recibe)respectivamente, y da como resultado un número entero (<font color="green"><code>int</code></font>), que es el <font color="red"><code>0</code></font> de la pseudofuncióninstrucción <font color="orange"><code>return</code></font><code>()</code>. En un capítulo posterior podrá ver un ejemplo del uso de estos parámetros.
 
Finalmente, y un tanto aparte (está separada del resto por una línea en blanco), tenemos la línea
 
<font color="purple"><code>#include</code></font><code> </code><font color="red"><code><stdio.h></code></font>
 
que parece bastante distinta al resto del programa, y que, además, parece no tener sentido, puesto que ya hemos definido la función <code>main</code> que hace todo el trabajo.
 
Efectivamente, esa línea no es parte del programa, aunque sea imprescindible. La línea es una instrucción del [[w:Preprocesador|preprocesador de '''C''']], como nos lo indica el símbolo <font color="purple"><code>#</code></font>, y lo que hace es incluir en ese punto el contenido de otro fichero, antes (de ahí el nombre de preprocesado) de que comience la compilación. El fichero <font color="red"><code>stdio.h</code></font> es el que contiene la definición de la función <code>printf()</code>, que antes utilizamos pero que nunca llegamos a escribir nosotros mismos, porque ya estaba escrita para nosotros, ya que es parte de la [[w:Biblioteca estándar de C|biblioteca estándar de '''C''']].
 
==Comentando el "Hola Mundo"==
 
Como vimos en [[Programación en C/Fundamentos de programación#Comentarios|el capítulo anterior]], los comentarios son muy importantes para cualquier programador. Veamos ahora cómo podría quedar el mismo programa adecuadamente comentado:
 
<source lang=c>
#include <stdio.h>
/*
</source>
holamundo.c
 
Que parece bastante distinta al resto del programa, y que, además, parece no tener sentido, puesto que ya hemos definido la función <code>main</code> que hace todo el trabajo.
Envite, 2004
para el wikilibro "Programación en C"
tomado del Dominio Público
*/
 
Efectivamente, esa línea no es parte del programa, aunque sea imprescindible. La línea es una instrucción del [[w:Preprocesador|preprocesador de C]], como nos lo indica el símbolo <code>#</code>, y lo que hace es incluir en ese punto el contenido de otro fichero, antes (de ahí el nombre de preprocesador) de que comience la compilación. El fichero <code>stdio.h</code> es el que contiene la definición de la función <code>printf()</code>, que antes utilizamos pero que no escribimos, ya que forma parte de la [[w:Biblioteca estándar de C|biblioteca estándar de C]].
#include <stdio.h> /*Necesario para la función printf()*/
 
int main(void) /*Función principal del programa*/
{
printf("Hola Mundo\n"); /*imprime la cadena*/
return(0); /*sale del programa: correcto*/
}
</source>
 
<!-- Tomado del capítulo anterior: ARREGLAR -->
== Comentarios ==
 
Línea 127 ⟶ 100:
Muchas veces, se trabaja en equipo y no todos programan de la misma manera, aquí los comentarios son fundamentales.
 
Un comentario en '''C''' es todo lo que se encuentre entre los símbolos <font color="blue"><code>/*</code></font> y <font color="blue"><code>*/</code></font>. Hay que tener en cuenta que los comentarios no se pueden anidar: si dentro de un comentario hay un <font color="blue"><code>/*</code></font>, seguirá siendo el primer <font color="blue"><code>*/</code></font> el que finalice el comentario, no se esperará al segundo:.
 
<font color="red" size=1>EJEMPLO ERRÓNEO:</font>
 
<font color="blue"><code>/*Esto es un /*comentario*/</code></font><code>*/</code>
 
Hay otro tipo de comentarios en '''C''', procedentes del lenguaje [http://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C++ C++]: <font color="blue">//</font>. Todo lo que esté después de estos signos, hasta el final de la línea, se considerará un comentario y el compilador no lo tomará en cuenta.
Este tipo de comentarios no existía inicialmente en '''C''', pero varios compiladores empezaron a aceptarlos, hasta que finalmente se normalizó en el estándar C99.
 
Hay otro tipo de comentarios en C, procedentes del lenguaje '''[[w:C++|C++]]''', e incorporadas al estándar de C a partir de C99: <code>//</code>. Todo lo que esté después de estos signos, hasta el final de la línea, se considerará un comentario y el compilador no lo tomará en cuenta.
 
En el ejemplo presentado pueden verse tres líneas con comentarios, que documentan someramente las distintas funcionalidades del código. En los próximos capítulos podrán verse mejores usos de los comentarios dentro del código.
 
<noinclude>