Score %0 (0 correct0 incorrect20 unanswered)

P1. ¿Cuál es la salida de este código?

vector<int> v(22);
bool b = (v[6]);
printf("%d", !b);
  • Falso
  • 0
  • 1
  • Este código tiene un error.

P2. ¿Cuál de las siguientes razones se considera una mala práctica al usar esta línea? (Alternativa: ¿Por qué se considera una mala práctica usar esta línea?)

using namespace std;
  • El código compilado siempre es más grande debido a todos los símbolos importados.
  • Si el código utiliza una función definida en dos bibliotecas diferentes con el mismo prototipo pero posiblemente con implementaciones diferentes, habrá un error de compilación debido a la ambigüedad.
  • Incluye automáticamente todos los archivos de encabezado en la biblioteca estándar (cstdint, cstdlib, cstdio, iostream, etc).
  • Hace que el compilador haga cumplir la inclusión exclusiva de archivos de encabezado pertenecientes a la biblioteca estándar, generando un error de compilación cuando se incluye un archivo de encabezado diferente.

Referencia

P3. ¿Cuál es el tamaño más pequeño que puede ocupar en memoria una variable del tipo child_t?

typedef struct{
    unsigned int  age    : 4;
    unsigned char gender : 1;
    unsigned int  size   : 2;
}child_t;
  • 7 bits.
  • 25 bytes.
  • 1 bit.
  • 1 byte.

Referencia

P4. ¿Cuáles son los vectores v1 y v2 después de ejecutar el código?

std::vector<int> v1{1,2,3},v2;
v2=v1;
v1.push_back(4);
v2.push_back(5);
  • Error
  • v1:{1,2,3,4}; v2:{5};
  • v1:{1,2,3,4,5}; v2:{1,2,3,4,5};
  • v1:{1,2,3,4}; v2:{1,2,3,5};

P5. ¿Cuál de las siguientes afirmaciones es verdadera sobre la diferencia entre punteros e iteradores?

union {
    uint16_t a;
    uint32_t b;
    int8_t c;
} u1;
  • Mientras que los punteros son variables que contienen direcciones de memoria, los iteradores son funciones genéricas utilizadas para recorrer contenedores. Esta función permite al programador implementar código de lectura y escritura a medida que se recorre el contenedor.
  • Incrementar un iterador siempre significa acceder al siguiente elemento en el contenedor (si hay alguno), sin importar el contenedor. Incrementar el puntero significa apuntar al siguiente elemento en la memoria, no siempre al siguiente elemento.
  • Los punteros son variables que contienen direcciones de memoria, mientras que el iterador es un entero sin signo que se refiere a desplazamientos en matrices.
  • Todos los iteradores están implementados con punteros, por lo que todos los iteradores son punteros pero no todos los punteros son iteradores.

Referencia

P6. ¿Cuál es el almacenamiento ocupado por u1?

union {
    uint16_t a;
    uint32_t b;
    int8_t c;
} u1;
  • 4 bytes
  • 7 bytes
  • 8 bytes
  • 2 bytes

Referencia

P7. ¿Qué operador se puede sobrecargar?

  • ?:
  • new
  • ::
  • .

Referencia

P8. ¿Cuál de las siguientes muestra el contenido del vector apuntado por v1 y v2 después de ejecutar este código?

std:: vector<int> *v1 = new std::vector<int>({1,2,3});
std:: vector<int> *v2;
v2=v1;
v1->push_back(4);
v2->push_back(5);
  • *v1:{1,2,3,4}; *v2:{5};
  • *v1:{1,2,3,4,5}; *v2:{1,2,3,4,5};
  • Error
  • *v1:{1,2,3,4}; *v2:{1,2,3,5};

v1 y v2 apuntan al mismo vector.

P9. ¿Cuál de las siguientes no es una diferencia entre una clase y una estructura?

  • Debido a que las estructuras forman parte del lenguaje de programación C, existe cierta complejidad entre las estructuras de C y C++. Esto no ocurre con las clases.
  • Las clases pueden tener funciones miembro; las estructuras son privadas.
  • El especificador de acceso predeterminado para los miembros de una estructura es público, mientras que para los miembros de la clase es privado.
  • Los parámetros de tipo de plantilla se pueden declarar con clases, pero no con la palabra clave struct.

Las plantillas se pueden utilizar tanto con clases como con estructuras. Referencia Referencia

P10. Suponga que necesita mantener una estructura de datos con permiso para acceder a algún recurso basado en los días de la semana, pero no puede usar una variable bool para cada día. Necesita usar un bit por día de la semana. ¿Cuál de las siguientes es una implementación correcta de una estructura con campos de bits para esta aplicación?

  • A
typedef struct {
    int sunday:1;
    int monday:1;
    // more days
    int friday:1;
    int saturday:1;
} weekdays;
  • B
typedef char[7]: weekdays;
  • C
typedef struct {
    bit sunday:1;
    bit monday:1;
    // more days
    bit friday:1;
    bit saturday:1;
} weekdays;

  • D
typedef struct {
    bit sunday;
    bit monday;
    // more days
    bit friday;
    bit saturday;
} weekdays;

Referencia NOTA: La sintaxis correcta es que el tamaño de cada variable es de 1 bit. bit no es un tipo en C++.

P11. ¿Qué es un lvalue?

  • Es una expresión constante, es decir, una expresión compuesta por constantes y operaciones.
  • Es una expresión que representa un objeto con una dirección.
  • Es una expresión adecuada para el operando del lado izquierdo en una operación binaria.
  • Es un valor de ubicación, es decir, una dirección de memoria adecuada para asignar a un puntero o referencia.

P12. ¿Qué hace el especificador de tipo auto en esta línea de código (desde C++11)?

auto x = 4000.22;
  • Especifica que el tipo de x se deducirá del inicializador, en este caso, double.
  • Especifica que el tipo de x es automático, lo que significa que puede asignarse diferentes tipos de datos a lo largo del programa.
  • Especifica que x es una variable con duración de almacenamiento automática.
  • Especifica que se asignará más memoria para x en caso de que necesite más espacio, evitando la pérdida de datos debido a un desbordamiento.

P13. ¿Qué es una plantilla de clase?

  • Clase escrita con el paradigma de programación genérica, especificando el comportamiento en términos de parámetro de tipo en lugar de tipo específico.
  • Superclase en blanco destinada a la herencia y el polimorfismo.
  • Clase que solo consta de una variable miembro, sin constructor, destructor o funciones miembro.
  • Código fuente esquelético de una clase donde el programador debe completar partes específicas para definir los tipos de datos y algoritmos utilizados.

Referencia

P14. ¿Cuál es el operador ternario equivalente a este fragmento de código?

if(x)
    y=a;
else
    y=b;
  • y=a?b:x;
  • y=if(x?a:b);
  • y=(x&a)?a:(x&b)?b:0;
  • y=x?a:b;

Referencia

P15. ¿Cuál es la salida del siguiente código?

#include <iostream>

int main(){
    int x=10, y=20;
    std::cout << "x = " << x++ << " and y = " << --y << std::endl;
    std::cout << "x = " << x-- << " and y = " << ++y << std::endl;
    return(0);
}
  • x = 10 y y = 20
    x = 11 y y = 19
  • x = 11 y y = 19
    x = 10 y y = 20
  • x = 10 y y = 19
    x = 11 y y = 20
  • x = 11 y y = 20
    x = 10 y y = 19

P16. ¿Cuál es el significado de las dos partes especificadas entre paréntesis en un bucle for basado en rango, separadas por dos puntos?

  • La primera es una declaración de variable que contendrá un elemento en una secuencia. La segunda es la secuencia a recorrer.
  • La primera es un iterador, y la segunda es el valor de incremento que se agregará al iterador.
  • La primera es la variable de iteración. La segunda es un std::pair que especifica el rango (inicio y fin) en el que la variable iterará.
  • La primera es un objeto contenedor. La segunda es un std::pair que especifica el rango (inicio y fin) en el que los elementos se accederán dentro del bucle.

P17. ¿Cuál es la salida del siguiente código?

int8_t a=200;
uint8_t b=100;
if(a>b)
    std::cout<<"greater";
else
    std::cout<<"less";
  • No hay salida porque hay una excepción al comparar un int8_t con un uint8_t.
  • mayor
  • menor
  • No hay salida porque hay un error de compilación.

Nota: una variante de la pregunta a continuación.

P18. ¿Cuál es la salida de este bloque de código?

int8_t a=200;
uint8_t b=100;
std::cout<<"a="<<(int)a;
std::cout<<", b="<<(int)b;
  • a=-56, b=100
  • a=-55, b=100
  • a=200, b=-156
  • a=200, b=100

Nota: La conversión implícita de 'int' a 'int8_t' (también conocido como 'signed char') cambia el valor de 200 a -56

P19. ¿Cuál es la salida después de ejecutar este fragmento de código?

int x=5, y=2;
if(x & y) {
    /*_part A_*/
}
else {
    /*_part B_*/
}
  • La parte A se ejecuta porque x==5 (verdadero) e y==2 (verdadero), por lo tanto, la operación AND se evalúa como verdadera.
  • La parte B se ejecuta porque (x & y) da como resultado 0, o falso.
  • La parte A se ejecuta porque (x & y) da como resultado un valor distinto de cero, o verdadero.
  • La parte B se ejecuta porque la instrucción (x & y) es inválida, por lo tanto, es falsa.

Referencia

P20. ¿Cuál es una definición válida para la función get_length, que devuelve la longitud de una cadena terminada en nulo?

  • A
int get_length(char *str) {
    int count=0;
    while(str[count++]);
    return count-1;
}
  • B
int get_length(char *str) {
    int count=0;
    while(str!=NULL){
        count++;
        str++;
    }
    return count;
}
  • C
int get_length(char *str) {
    int count=0;
    while((*str)++)
        count++;
    return count;
}
  • D
int get_length(char *str) {
    int count=0;
    while(str++)
        count++;
    return count;
}