1 Toma de contacto

Me parece que la forma más rápida e interesante de empezar, y no perder potenciales seguidores de este curso, es mediante un ejemplo. Veamos nuestro primer programa C++. Esto nos ayudará a establecer unas bases que resultarán muy útiles para los siguientes ejemplos que irán apareciendo.

int main()
{
   int numero;

   numero = 2 + 2;
   return 0;
}

No te preocupes demasiado si aún no captas todos los matices de este pequeño programa. Aprovecharemos la ocasión para explicar algunas de las peculiaridades de C++, aunque de hecho, este programa es casi un ejemplo de programa C. Y aunque eso es otro tema, podemos decir ahora que C++ incluye a C. En general, un programa en C podrá compilarse usando un compilador de C++. Pero ya veremos este tema en otro lugar, y descubriremos en qué consisten las diferencias.

Iremos repasando, muy someramente, el programa, línea a línea:

- Primera línea: "int main()"

Se trata de una línea muy especial, y la encontrarás en todos los programas C y C++. Es el principio de la definición de una función. Todas las funciones C y C++ toman unos valores de entrada, llamados parámetros o argumentos, y devuelven un valor salida o retorno. La primera palabra: "int", nos dice el tipo del valor de retorno de la función, en este caso un número entero (integer). La función "main" siempre devuelve un entero. La segunda palabra es el nombre de la función, en general será el nombre que usaremos cuando queramos usar o llamar a la función.

Podemos considerar una función como una caja que procesa ciertos datos de entrada para dar como retorno ciertos datos de salida.

C++ se basa en gran parte en C, y C fue creado en la época de los lenguajes procedimentales y está orientado a la programación estructurada. Por lo tanto, C++ tiene también características válidas para la programación estructurada.

La programación estructurada parte de la idea de que los programas se ejecutan secuencialmente, línea a línea, sin saltos entre partes diferentes del programa, con un único punto de entrada y un punto de salida.

Pero si ese tipo de programación se basase sólo en esa premisa, no sería demasiado útil, ya que los programas serían poco manejables llegados a un cierto nivel de complejidad.

La solución es crear funciones o procedimientos, que se usan para realizar ciertas tareas concretas y/o repetitivas.

Por ejemplo, si frecuentemente necesitamos mostrar un texto en pantalla, es mucho más lógico agrupar las instrucciones necesarias para hacerlo en una función, y usar la función como si fuese una instrucción cada vez que queramos mostrar un texto en pantalla.

La diferencia entre una función y un procedimiento está en si devuelven valores cada vez que son invocados. Las funciones devuelven valores, y los procedimientos no.

Lenguajes como Pascal hacen distinciones entre funciones y procedimientos, pero C y C++ no existe esa diferencia. En éstos sólo existen funciones y para crear un procedimiento se usa una función que devuelva un valor vacío.

Llamar o invocar una función es ejecutarla, la secuencia del programa continúa en el interior de la función, que también se ejecuta secuencialmente, y cuando termina, se regresa a la instrucción siguiente al punto de llamada.

Las funciones a su vez, pueden invocar a otras funciones.

De este modo, considerando la llamada a una función como una única instrucción (o sentencia), el programa sigue siendo secuencial.

En este caso "main" es una función muy especial, ya que nosotros no la usaremos nunca explícitamente, es decir, nunca encontrarás en ningún programa una línea que invoque a la función "main". Esta función será la que tome el control automáticamente cuando el sistema operativo ejecute nuestro programa.

Otra pista por la que sabemos que "main" es una función son los paréntesis: todas las definiciones de funciones incluyen una lista de argumentos de entrada entre paréntesis, en nuestro ejemplo es una lista vacía, es decir, nuestra función no admite parámetros.

Picadora
Picadora

La picadora de nuestro dibujo admite ciertos parámetros de entrada, por ejemplo, carne. También proporciona valores de salida o retorno, si introducimos carne saldrá carne picada, si se trata de queso, la salida será queso picado, etc.

Aunque dedicaremos varios capítulos a las funciones, podemos contar ahora algo más sobre parámetros y valores de retorno.

No siempre se proporcionan parámetros a las funciones, o a veces no se porporcionan parámetros evidentes. Por ejemplo, una función que lea una tecla no necesita ningún parámetro de entrada, aunque muchos parámetros queden implícitos en la propia función.

Del mismo modo, también existen funciones que no dan una salida, al menos no una salida evidente. Por ejemplo, una función que espere un tiempo determinado. En este caso no hay salida, sólo transcurrirá un lapso de tiempo.

- Segunda línea: "{"

Aparentemente es una línea muy simple, las llaves encierran el cuerpo o definición de la función. Más adelante veremos que también tienen otros usos.

- Tercera línea: "int numero;"

Esta es nuestra primera sentencia, todas las sentencias terminan con un punto y coma. Esta concretamente es una declaración de variable. Una declaración nos dice, a nosotros y al compilador, que usaremos una variable, a la que llamaremos "numero" de tipo int integer (entero). Esta declaración obliga al compilador a reservar un espacio de memoria para almacenar la variable "numero", pero no le da ningún valor inicial. En general contendrá "basura", es decir, un valor indeterminado e impredecible, que dependerá del contenido de esa zona de memoria en el momento en que se reservó el espacio. En C++ es obligatorio declarar las variables que se usarán en el programa.

Nota importante: C y C++ distinguen entre mayúsculas y minúsculas, así que "int numero;" es distinto de "int NUMERO;", y también de "INT numero;" o de "int NuMeRo;.

- Cuarta línea: ""

Una línea vacía. Esta línea no sirve para nada, al menos desde el punto de vista del compilador, pero ayuda para separar visualmente la parte de declaración de variables de la parte de código que va a continuación. Se trata de una división arbitraria. Desde el punto de vista del compilador, tanto las declaraciones de variables como el código son sentencias válidas. La separación nos ayudará a distinguir visualmente dónde termina la declaración de variables. Una labor análoga la desempeña el tabulado de las líneas: ayuda a hacer los programas más fáciles de leer.

- Quinta línea: "numero = 2 + 2;"

Se trata de otra sentencia, ya que acaba con punto y coma. Esta es una sentencia de asignación. Le asigna a la variable "numero" el valor resultante de evaluar la expresión correspondiente a la operación "2 + 2".

- Sexta línea: "return 0;"

De nuevo una sentencia, "return" es una palabra reservada, propia de C++. Indica al programa que debe abandonar la ejecución de la función y continuar a partir del punto en que se la llamó. El 0 es el valor de retorno de nuestra función, recordemos que la función "main" debe retornar un valor integer, entero. Por convenio, cuando "main" retorna con 0 indica que todo ha ido bien. Un valor distinto suele indicar un error. Imagina que nuestro programa es llamado desde un fichero de comandos, un fichero "bat" o un "script". El valor de retorno de nuestro programa se puede usar para tomar decisiones dentro de ese fichero. Pero somos nosotros, los programadores, los que decidiremos el significado de los valores de retorno.

- Séptima línea: "}"

Esta es la llave que cierra el cuerpo o definición de la función.

Lo malo de este programa, a pesar de sumar correctamente "2+2", es que aparentemente no hace nada:

No acepta datos externos y no proporciona ninguna salida de ningún tipo. En realidad es absolutamente inútil, salvo para fines didácticos, que es para lo que fue creado. De modo que no te preocupes si decides probarlo con un compilador y no pasa nada, es normal. Paciencia, iremos poco a poco.

En los siguientes capítulos veremos tres conceptos básicos: variables, funciones y operadores. Después estaremos en disposición de empezar a trabajar con ejemplos más interactivos.