Score %0 (0 correct0 incorrect20 unanswered)

Q1. Qual è l'output di questo codice?

vector<int> v(22);
bool b = (v[6]);
printf("%d", !b);
  • Falso
  • 0
  • 1
  • Questo codice ha un errore.

Q2. Quale delle seguenti è una ragione per cui l'utilizzo di questa riga è considerato una cattiva pratica? (Alternativa: Perché l'utilizzo di questa riga è considerato una cattiva pratica?)

using namespace std;
  • Il codice compilato è sempre più grande a causa di tutti i simboli importati.
  • Se il codice utilizza una funzione definita in due diverse librerie con lo stesso prototipo ma possibilmente con implementazioni diverse, ci sarà un errore di compilazione dovuto all'ambiguità.
  • Include automaticamente tutti i file di intestazione nella libreria standard (cstdint, cstdlib, cstdio, iostream, ecc).
  • Fa sì che il compilatore imponga l'inclusione esclusiva dei file di intestazione appartenenti alla libreria standard, generando un errore di compilazione quando viene incluso un diverso file di intestazione.

Reference

Q3. Qual è la dimensione minima che una variabile del tipo child_t può occupare in memoria?

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

Reference

Q4. Quali sono i vettori v1 e v2 dopo l'esecuzione del codice?

std::vector<int> v1{1,2,3},v2;
v2=v1;
v1.push_back(4);
v2.push_back(5);
  • Errore
  • 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};

Q5. Quale delle seguenti affermazioni è vera sulla differenza tra puntatori e iteratori?

  • Mentre i puntatori sono variabili che contengono indirizzi di memoria, gli iteratori sono funzioni generiche utilizzate per attraversare i contenitori. Questa funzione consente al programmatore di implementare codice di lettura e scrittura mentre il contenitore viene attraversato.
  • Incrementare un iteratore significa sempre accedere all'elemento successivo nel contenitore (se presente), indipendentemente dal contenitore. Incrementare il puntatore significa puntare all'elemento successivo in memoria, non sempre all'elemento successivo.
  • I puntatori sono variabili che contengono l'indirizzo di memoria mentre l'iteratore sono interi senza segno che si riferiscono a offset in array.
  • Tutti gli iteratori sono implementati con puntatori quindi tutti gli iteratori sono puntatori ma non tutti i puntatori sono iteratori.

Reference

Q6. Quanto spazio occupa u1?

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

Reference

Q7. Quale degli operatori seguenti può essere sovraccaricato?

  • ?:
  • new
  • ::
  • .

Reference

Q8. Qual delle seguenti mostra i contenuti del vettore puntato da v1 e v2 dopo aver eseguito questo codice?

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};
  • Errore
  • *v1:{1,2,3,4}; *v2:{1,2,3,5};

v1 e v2 puntano allo stesso vettore.

Q9. Quale delle seguenti non è una differenza tra una classe e una struttura?

  • Poiché le strutture fanno parte del linguaggio di programmazione C, c'è una certa complessità tra le strutture di C e C++. Questo non è il caso delle classi.
  • Le classi possono avere funzioni membro; le strutture sono private.
  • Il specificatore di accesso predefinito per i membri di una struttura è pubblico, mentre per i membri della classe è privato.
  • I parametri di tipo modello possono essere dichiarati con classi, ma non con la parola chiave struct.

I modelli possono essere utilizzati sia con classi che con strutture Referenza Reference

Q10. Supponiamo che tu abbia bisogno di mantenere una struttura dati con il permesso di accedere a una risorsa basata sui giorni della settimana, ma non puoi usare una variabile bool per ogni giorno. Devi usare un bit per ogni giorno della settimana. Quale delle seguenti è un'implementazione corretta di una struttura con campi di bit per questa applicazione?

  • 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;

Reference NOTA: La sintassi corretta è che ogni dimensione della variabile è di 1 bit. bit non è un tipo in C++.

Q11. Cos'è un lvalue?

  • È una espressione costante, ovvero un'espressione composta da costanti e operazioni.
  • È un'espressione che rappresenta un oggetto con un indirizzo.
  • È un'espressione adatta per l'operando del lato sinistro in un'operazione binaria.
  • È un valore di posizione, ovvero un indirizzo di memoria adatto per l'assegnazione a un puntatore o riferimento.

Q12. Cosa fa il specificatore di tipo auto in questa riga di codice (da C++11)?

auto x = 4000.22;
  • Specifica che il tipo di x sarà dedotto dall'inizializzatore - in questo caso, double.
  • Specifica che il tipo di x è automatico, il che significa che può essere assegnato diversi tipi di dati durante il programma.
  • Specifica che x è una variabile con durata di archiviazione automatica.
  • Specifica che verrà allocata più memoria per x nel caso in cui necessiti di più spazio, evitando la perdita di dati dovuta all'overflow.

Q13. Una classe template è un _?

  • classe scritta con il paradigma di programmazione generica, specificando il comportamento in termini di parametro di tipo anziché tipo specifico.
  • superclasse in bianco destinata all'ereditarietà e al polimorfismo.
  • classe che consiste solo di una variabile membro, senza costruttore, distruttore o funzioni membro.
  • codice sorgente scheletrico di una classe in cui il programmatore deve compilare parti specifiche per definire i tipi di dati e algoritmi utilizzati.

Referenza

Q14. Qual è l'operatore ternario equivalente a questo frammento di codice?

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;

Referenza

Q15. Qual è l'output del codice qui sotto?

#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 e y = 20
    x = 11 e y = 19
  • x = 11 e y = 19
    x = 10 e y = 20
  • x = 10 e y = 19
    x = 11 e y = 20
  • x = 11 e y = 20
    x = 10 e y = 19

Q16. Qual è il significato delle due parti specificate tra parentesi in un ciclo for basato su intervallo, separate da due punti?

  • La prima è una dichiarazione di variabile che conterrà un elemento in una sequenza. La seconda è la sequenza da attraversare.
  • La prima è un iteratore, e la seconda è il valore di incremento da aggiungere all'iteratore.
  • La prima è la variabile di iterazione. La seconda è una std::pair che specifica l'intervallo (inizio e fine) in cui la variabile itererà.
  • La prima è un oggetto contenitore. La seconda è una std::pair che specifica l'intervallo (inizio e fine) in cui gli elementi saranno accessibili all'interno del ciclo.

Q17. Qual è l'output del codice qui sotto?

int8_t a=200;
uint8_t b=100;
if(a>b)
    std::cout<<"greater";
else
    std::cout<<"less";
  • Non c'è output perché c'è un'eccezione quando si confronta un int8_t con un uint8_t.
  • maggiore
  • minore
  • Non c'è output perché c'è un errore di compilazione.

Nota: una variante della domanda qui sotto.

Q18. Qual è l'output di questo blocco di codice?

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 conversione implicita da 'int' a 'int8_t' (alias 'signed char') cambia il valore da 200 a -56

Q19. Qual è l'output dopo l'esecuzione di questo frammento di codice?

int x=5, y=2;
if(x & y) {
    /*_part A_*/
}
else {
    /*_part B_*/
}
  • La parte A si esegue perché x==5 (vero) e y==2 (vero), quindi l'operazione AND si valuta come vera.
  • La parte B si esegue perché (x & y) restituisce 0, o falso.
  • La parte A si esegue perché (x & y) restituisce un valore diverso da zero, o vero.
  • La parte B si esegue perché l'istruzione (x & y) è invalida, quindi falsa.

Referenza

Q20. Qual è una definizione valida per la funzione get_length, che restituisce la lunghezza di una stringa terminata da null?

  • 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;
}