Fundamentos de lenguajes y programación en C++
Este curso está diseñado para consolidar los conceptos básicos que aparecen en los cuestionarios de introducción a la programación con C++. Cada sección aborda una pregunta típica, explica…

En C++, ¿qué ocurre si se intenta compilar un programa que contiene una instrucción sin el punto y coma al final?
¿Cuál de los siguientes enunciados describe mejor la diferencia entre un compilador y un intérprete?
Si declaras `unsigned short var1;` y luego asignas `var1 = 70000;`, ¿qué ocurre?
¿Qué operador se usa para obtener la longitud de una cadena `string` en C++?
Al ejecutar `cout << 4 / 3 << endl;` en C++, ¿qué salida se obtiene y por qué?
¿Cuál es la diferencia esencial entre una variable local y una global en C++?
¿Qué ocurre si se usa `cin >> edad;` y el usuario introduce un texto no numérico?
En la expresión `a += b;`, ¿qué operación se realiza exactamente?
¿Cuál es el efecto de la directiva `#define ANCHURA 10` en el código C++?
Fundamentos de lenguajes y programación en C++
Este curso está diseñado para consolidar los conceptos básicos que aparecen en los cuestionarios de introducción a la programación con C++. Cada sección aborda una pregunta típica, explica la teoría subyacente y ofrece ejemplos prácticos para que puedas aplicar lo aprendido.
Ventajas de los lenguajes de alto nivel
Los lenguajes de alto nivel se diferencian del lenguaje máquina por su independencia del hardware y su portabilidad. Esta característica permite que el mismo código fuente se ejecute en distintas arquitecturas sin necesidad de reescribirlo.
Imagina una receta de cocina que funciona tanto en una estufa eléctrica como en una de gas: el plato sale igual, aunque el utensilio cambie.
- Abstracción de la arquitectura física.
- Mayor legibilidad y mantenibilidad.
- Acceso a bibliotecas y herramientas que simplifican el desarrollo.
Errores comunes de sintaxis en C++
Olvidar el punto y coma
En C++ cada sentencia debe terminar con ;. Si se omite, el compilador genera un error de sintaxis y no produce un ejecutable. El proceso de compilación se detiene, lo que obliga al programador a corregir el problema antes de continuar.
- El error se detecta en la fase de análisis léxico/sintáctico.
- El mensaje del compilador indica la línea y la posición del problema.
- Corregir el punto y coma permite que el resto del código se compile sin inconvenientes.
Compilador vs intérprete
La diferencia esencial radica en el momento y la forma en que el código fuente se traduce a código ejecutable.
- Compilador: traduce todo el programa a código máquina o a un binario intermedio antes de la ejecución. El proceso es único y el ejecutable resultante es independiente del código fuente.
- Intérprete: traduce y ejecuta línea a línea durante la ejecución, lo que permite una mayor interactividad pero suele ser más lento.
Esta distinción es crucial al elegir herramientas para proyectos grandes (compiladores) o para scripts rápidos (intérpretes).
Tipos de datos y desbordamiento
Overflow en tipos sin signo
Al declarar unsigned short var1; y asignarle 70000, el valor excede el rango máximo de 0 a 65535. El número se almacena mediante aritmética modular, quedando 70000 mod 65536 = 4464. No se produce error de compilación, pero el valor resultante puede ser inesperado.
- Los tipos sin signo nunca representan valores negativos.
- El desbordamiento ocurre silenciosamente en tiempo de ejecución.
- Para evitarlo, valida los rangos antes de asignar o usa tipos más amplios (
unsigned int,uint32_t).
Manipulación de cadenas en C++
Obtener la longitud de un std::string
La clase std::string ofrece los métodos length() y size(), ambos devuelven el número de caracteres almacenados. No se debe usar sizeof (que devuelve el tamaño del objeto en bytes) ni la función C strlen(), que solo funciona con arreglos de char terminados en \0.
std::string texto = "Hola";std::size_t n = texto.length(); // n = 4- Ambos métodos son equivalentes y están optimizados.
Operaciones aritméticas y tipos
División entera
Cuando se escribe cout << 4 / 3 << endl;, ambos operandos son enteros. C++ realiza una división entera, descartando la parte fraccionaria y devolviendo 1. Para obtener un resultado con decimales, al menos uno de los operandos debe ser de tipo flotante (float o double).
- Ejemplo con conversión:
cout << 4.0 / 3 << endl; // 1.33333 - La regla de promoción de tipos determina el tipo resultante.
- Usar cast explícito mejora la legibilidad:
(double)4 / 3.
Alcance de variables
Variables locales vs globales
Una variable local se declara dentro de una función o bloque y solo es visible dentro de ese contexto. En cambio, una variable global se declara fuera de cualquier función y es accesible desde cualquier parte del programa (salvo que se oculte con un nombre idéntico en un ámbito interno).
- Las variables locales favorecen el encapsulamiento y reducen efectos colaterales.
- Las globales pueden simplificar el intercambio de datos, pero aumentan el acoplamiento.
- Buenas prácticas: limitar el uso de globals y preferir paso de parámetros.
Manejo de entrada con cin
Entrada no numérica en variables enteras
Si se ejecuta cin >> edad; y el usuario escribe texto que no representa un número, la extracción falla. El flujo cin queda en estado de error (failbit) y la variable edad conserva su valor anterior (o 0 si no estaba inicializada). Es necesario limpiar el flujo con cin.clear() y descartar la entrada incorrecta.
- Ejemplo de manejo de error:
int edad = 0; if(!(cin >> edad)){ cin.clear(); cin.ignore(std::numeric_limits::max(), '\n'); std::cerr << "Entrada inválida. Intente de nuevo." << std::endl; } - El compilador no detecta este error; ocurre en tiempo de ejecución.
- Validar siempre la entrada del usuario mejora la robustez del programa.
Resumen y buenas prácticas
Los conceptos revisados forman la base para escribir código C++ correcto y mantenible. Recuerda:
- Usar siempre
;al final de cada sentencia. - Preferir compiladores para proyectos grandes y entender sus mensajes de error.
- Conocer los rangos de los tipos de datos y validar valores antes de asignarlos.
- Utilizar los métodos de
std::stringpara trabajar con texto. - Ser consciente de la división entera y aplicar conversiones cuando sea necesario.
- Mantener el alcance de las variables lo más limitado posible.
- Gestionar adecuadamente los flujos de entrada para evitar estados de error.
Dominar estos fundamentos te permitirá avanzar rápidamente hacia temas más avanzados como punteros, gestión de memoria dinámica y programación orientada a objetos en C++.
