lunes, 1 de julio de 2013

Aprende C++: Una primera ojeada a las variables (y cin)

Una declaración como x = 5; es bastante obvia. Como podrías adivinar, le asignamos a x el valor 5, pero, ¿qué es exactamente x? x es una variable.

Variables

 

Una variable en C++ es un nombre para una trozo de memoria que puede usarse para almacenar información. Puedes imaginarte una variable como si fuese un buzón, donde colocamos y recibimos información. Todos los ordenadores tienen memoria, llamadas RAM (memoria de acceso aleatorio, en inglés), que está disponible para que los programas la usen. Cuando una variable es declarada, una trozo de esa memoria es asignada a aquella variable.

En esta sección, solo estamos considerando variables enteras. Una variable entera (int x; por ejemplo) es una variable que sólo puede guardar un valor entero (1, 2, 3, -1, -2, -16, 15, 7658 etc.)

Para poder declarar una variable, normalmente usamos una declaración. He aquí un ejemplo de la declaración de una variable llamada x como una variable entera (que solo puede almacenar un número entero).

int x;

Cuando una declaración se ejecuta por la CPU, un trozo de memoria de la RAM se asigna. Por ejemplo, digamos que una variable x se le asigna un lugar en la memoria, el 140. Cuando el programa ve el valor x en una expresión o declaración, sabe que debería mirar en la ubicación 140 de la memoria.

Una de las operaciones más comunes realizadas con una variable es la asignación. Para ello usamos un operador de asignación, más conocido como "igual", el símbolo "=". Cuando la CPU ejecuta una declaración como x = 5; se traduce como "coloca el valor 5 en la ubicación 140".

Más tarde en nuestro programa, podríamos imprimir en pantalla el valor usando cout:

cout << x; //imprime el valor de x (en la ubicación de memoria 140)

En C++, las variables también son conocidas como l-values. Un l-value es una valor que tiene una dirección en la memoria. Como todas las variables tienen direcciones, todas las variables son l-values. Se llamaron así porque son los únicos valores que pueden estar en el lado izquierdo (left) de una declaración de asignación. Cuando hacemos una asignación, el lado izquierdo del "=" debe ser un l-value. por lo que una declaración como 5 = 6; provocaría un error en la compilación, porque 5 no es un l-value. El valor 5 no tiene una memoria, por lo que no se le puede asignar nada a 5. 5 significa 5 y su valor no puede variar. Cuando se le asigna un valor a un l-value, el valor actual es sobreescrito.

Lo contrario de un l-value es un r-value. Un r-value se refiere a cualquier valor al que se le puede asignar a un l-value. Los r-values siempre son equivalentes a un sólo valor. Un ejemplo de r-values sería un número (5, que equivale a 5), una variable (x que equivale a un valor al que le hayas asignado) o expresiones (como 2+x, que equivale al valor de x más 2).

He aquí algunos ejemplos de algunas declaraciones de asignación.

int y; // declara y como una variable entera
y = 4; // 4 equivale a 4, que es asignada a y
y = 2 + 5; // 2 + 5 equivale a 7, que es asignado a y

int x; // declara x como una variable entera
x = y; // y equivale a 7, que es asignado a x
x = x; // x es igual a 7, que es asignado a x (inútil)
x = x + 1; // x + 1 equivale a 8, que es asignado a x

Hay dos cosas importantes que se deben saber. Primero, no hay garantía de que tu variable se le asignará la misma ubicación en la memoria cada vez que inicies tu programa. Puede que la primera vez que inicies el programa, a x se le asigne la dirección 140, pero puede que en la siguiente vez se la 168. Segundo, cuando una variable se le asigna una dirección, el valor de esa dirección no está definido (en otras palabras, será cualquier valor que haya estado antes allí).

Esto puede provocar resultados interesantes (y con interesantes me refiero a muy peligrosos). Considerando el siguiente programa:

// #include "stdafx.h" // Quítale el comentario si usas Visual Studio
#include <iostream>

int main()
{
     using namespace std;  // nos da acceso a cout
     int x;                // declara una variable entera

     // imprime el valor de x en la pantalla (peligroso, no la hemos iniciado)
    cout << x << endl;
}

En este caso, el ordenador le asignará alguna memoria a x. Entonces, le enviará el valor que reside en esa dirección de la memoria a cout, que lo imprimirá en pantalla. Pero, ¿qué valor imprimirá? ¡Quién sabe!. Puedes probar a iniciar este programa en tu compilador y ver qué valor te muestra. Los compiladores más recientes te notificarán de que hay un error.

Una variable a la que no se le ha asignado un valor, se llama variable no iniciada. Son muy peligrosas ya que pueden provocar problemas intermitentes (debido a que tienen diferentes valores cada vez que inicies el programa). Esto puede hacerlas muy difíciles de reparar. Los compiladores modernos te mostrarán alertas a la hora de compilar si detectan una variable de este tipo.

Una buena regla es siempre asignar un valor a las variables cuando son declaradas. C++ lo hace bastante fácil permitiéndote asignar un valor en la misma línea en la que declaras la variable.

int x = 0; // declara una variable entera y se le asigna el valor 0

Esto asegura que tu variable siempre tendrá un valor consistente, haciéndola más fácil de reparar en caso de que provoque errores.

Un truco de los programadores con experiencia, es asignar un valor inicial a una variable que esté fuera del rango de los valores que tengan sentido en esa variable. Por ejemplo, si tuviéramos una variable para almacenar la cantidad de gatos que una señora tiene, haríamos lo siguiente:

int gatos = -1;

Tener -1 gatos no tiene sentido, por lo que si más adelante hiciéramos esto:

cout << gatos << " gatos" << endl;

e imprimiese el valor -1, sabríamos que la variable no fue modificada.

Regla: siempre asigna valores a las variables cuando las declares

Hablaremos sobre las variables con más detalle pronto.

cin


cin es el opuesto de cout: mientras que cout imprime en pantalla los datos a la consola, cin lee datos de la consola. Ahora que tienes una comprensión básica de las variables, podemos usar cin para conseguir un valor que introduzca el usuario y asignarlo a una variable.

// #include "stdafx.h" // Quítale el comentario si usas Visual Studio
#include <iostream>

int main()
{
     using namespace std;  // nos da acceso a cout
     cout << "Introduzca un numero: "; // pide al usuario un numero
     int x;
     cin >> x; // lee lo que introduzca el usuario y almacena el valor a x
     cout << "Has introducido " << x << endl;
     return 0;
}

Prueba a compilar este programa por tí mismo. Cuando inicies el programa, te pedirá que introduzcas un número y esperará que lo hagas. Cuando hayas introducido el número (y pulsado enter), se te mostrará en pantalla "Has introducido" y el número que colocaste.

Es una manera fácil de conseguir datos del usuario, usaremos cin en varios de los ejemplos más adelante. 

Siguiente entrada: una ojeada a las funciones 

No hay comentarios:

Publicar un comentario