Preguntas y respuestas: Lenguajes C y C++

Repasa Lenguajes C y C++: aquí tienes una selección de preguntas de todos los niveles, con respuesta y explicación. Para ponerte a prueba sin ver las respuestas, juega a los quizzes.

Jugar a los quizzes de Lenguajes C y C++

Fácil

¿Quién diseñó el lenguaje C en los Bell Labs, a principios de los años 1970?

Respuesta : Dennis Ritchie

Dennis Ritchie diseñó el lenguaje C en los Bell Labs, donde sirvió para escribir el sistema operativo Unix.

¿Quién creó el lenguaje C++?

Respuesta : Bjarne Stroustrup

Bjarne Stroustrup empezó su trabajo a principios de los años 1980, bajo el nombre «C with Classes», antes de convertirlo en C++.

¿Qué función constituye el punto de entrada de un programa C o C++?

Respuesta : main

La ejecución de un programa C o C++ empieza en la función main, sea cual sea el archivo fuente que la contenga.

En C++, ¿qué objeto de la biblioteca estándar envía datos a la salida estándar?

Respuesta : std::cout

std::cout es el flujo de salida estándar de C++; std::cin, por su parte, lee la entrada.

¿Qué hace la directiva #include <stdio.h> antes de la compilación propiamente dicha?

Respuesta : Inserta el contenido del archivo indicado en el código fuente

El preprocesador sustituye la directiva por el texto del archivo de cabecera indicado, aquí stdio.h, antes de que trabaje el compilador.

En C++, ¿qué paradigma añade a C la introducción de las clases, para organizar el código en torno a objetos?

Respuesta : La programación orientada a objetos

C es un lenguaje procedimental. C++ añade las clases y, con ellas, la programación orientada a objetos, conservando la sintaxis de C.

¿Cuál es el índice del primer elemento de un array en C o en C++?

Respuesta : 0

Los índices de los arrays empiezan en 0: un array de n elementos se indexa de 0 a n menos 1.

Tras la instrucción int x = 10 / 4 ; en C, ¿qué valor contiene la variable x?

Respuesta : 2

Los dos operandos son enteros: la división es entera, y el resultado 2,5 se trunca a 2.

Medio

En la instrucción p = &x ;, ¿qué produce el operador & aplicado a la variable x?

Respuesta : La dirección de memoria de x

El operador & devuelve la dirección de x, que el puntero p puede almacenar. El operador * sirve para acceder al valor apuntado.

En C++, ¿qué hace la declaración int &r = x ;?

Respuesta : Crea un alias: r designa el mismo objeto que x

Una referencia es un alias del objeto designado: no crea una copia y debe inicializarse en el momento de declararla.

En C y en C++, ¿dónde se colocan las variables locales de una función, fuera de la asignación dinámica?

Respuesta : En la pila (stack)

Las variables locales viven en la pila y desaparecen al terminar la función. El montículo sirve para la asignación dinámica, con malloc o new.

¿Qué función de la biblioteca C libera un bloque de memoria reservado con malloc?

Respuesta : free

free devuelve al sistema la memoria reservada con malloc. En C++, un objeto creado con new se libera con delete.

¿Qué se entiende por fuga de memoria?

Respuesta : Un bloque reservado dinámicamente que ya no se libera ni es accesible

Hay fuga cuando un bloque reservado dinámicamente no se libera aunque el programa ya no pueda acceder a él. La memoria queda reservada sin utilidad.

Con int t[4] ; e int *p = t ;, ¿qué designa la expresión p + 2?

Respuesta : El elemento t[2]

En aritmética de punteros, p + 2 avanza dos elementos, no dos bytes: la expresión designa t[2].

En C++, ¿cuál es la diferencia por defecto entre struct y class?

Respuesta : Los miembros de una struct son públicos por defecto; los de una class son privados

struct y class ofrecen las mismas posibilidades en C++; solo cambia el acceso por defecto: public para struct, private para class.

En C++, ¿cuándo se llama al destructor de un objeto local?

Respuesta : Cuando el objeto sale de su ámbito

El destructor se llama automáticamente cuando un objeto local sale de su ámbito, lo que permite liberar sus recursos. El constructor, en cambio, se ejecuta al crearlo.

Difícil

¿Qué estándar de C++ introdujo las lambdas, la palabra clave auto y la semántica de movimiento?

Respuesta : C++11

C++11 introdujo las lambdas, la palabra clave auto, la semántica de movimiento y los hilos de la biblioteca estándar.

¿Qué puntero inteligente de la STL posee por sí solo el objeto que apunta, sin contador de referencias?

Respuesta : std::unique_ptr

unique_ptr destruye el objeto al salir de su ámbito. No puede copiarse, solo se puede mover.

¿Qué designa el principio RAII en C++?

Respuesta : Adquirir un recurso en un constructor y liberarlo en el destructor

RAII, por Resource Acquisition Is Initialization, vincula la duración de un recurso a la de un objeto: la liberación se produce automáticamente al salir del ámbito.

¿Qué hace std::move(x) cuando se aplica a un objeto x?

Respuesta : Convierte x en una referencia rvalue, sin mover nada por sí mismo

std::move es un simple cast: permite que el constructor o el operador de movimiento tomen los recursos de x.

¿Qué contenedor de la STL almacena pares clave-valor únicos, ordenados por clave, con accesos en tiempo logarítmico?

Respuesta : std::map

std::map se apoya en un árbol equilibrado: claves únicas, recorrido ordenado y búsqueda en O(log n). unordered_map, en cambio, usa una tabla hash sin orden.

Tras int n = 3 ; auto f = [n]() { return n * 2 ; } ; y luego n = 10 ;, ¿qué devuelve f()?

Respuesta : 6

La captura [n] copia el valor de n en el momento de crear la lambda: f devuelve 3 por 2, es decir 6, aunque n cambie después.

Con int t[3] y una variable i que vale 5, ¿qué ocurre al leer t[i] en C++?

Respuesta : El comportamiento es indefinido: el programa puede fallar o producir un valor cualquiera

Leer fuera de límites con [] es un comportamiento indefinido. Para std::vector, la función at() comprueba los límites y lanza std::out_of_range.

En C++, ¿qué palabra clave colocada delante de una función miembro permite que una llamada mediante un puntero a la clase base ejecute la versión de la clase derivada?

Respuesta : virtual

Sin esta palabra clave, la llamada se resuelve según el tipo del puntero. Con ella, la elección se hace según el tipo real del objeto, en ejecución.

Temas relacionados

Jugar a los quizzes de Lenguajes C y C++