Domande e risposte: Linguaggi C e C++

Ripassa Linguaggi C e C++: ecco una selezione di domande di ogni livello, con risposta e spiegazione. Per metterti alla prova senza vedere le risposte, gioca ai quiz.

Gioca ai quiz Linguaggi C e C++

Facile

Chi ha ideato il linguaggio C ai Bell Labs, all'inizio degli anni Settanta?

Risposta : Dennis Ritchie

Dennis Ritchie ha ideato il linguaggio C ai Bell Labs, dove è servito a scrivere il sistema operativo Unix.

Chi ha creato il linguaggio C++?

Risposta : Bjarne Stroustrup

Bjarne Stroustrup ha iniziato il suo lavoro all'inizio degli anni Ottanta, con il nome « C with Classes », prima di farne il C++.

Quale funzione costituisce il punto di ingresso di un programma C o C++?

Risposta : main

L'esecuzione di un programma C o C++ inizia dalla funzione main, qualunque sia il file sorgente che la contiene.

In C++, quale oggetto della libreria standard invia dati verso l'uscita standard?

Risposta : std::cout

std::cout è il flusso di uscita standard del C++; std::cin, invece, legge dall'ingresso.

Che cosa fa la direttiva #include <stdio.h> prima della compilazione vera e propria?

Risposta : Inserisce il contenuto del file indicato nel codice sorgente

Il preprocessore sostituisce la direttiva con il testo del file di intestazione indicato, qui stdio.h, prima che il compilatore lavori.

Quale paradigma aggiunge il C++ al C, grazie alle classi, per organizzare il codice attorno a oggetti?

Risposta : La programmazione orientata agli oggetti

Il C è un linguaggio procedurale. Il C++ aggiunge le classi e quindi la programmazione orientata agli oggetti, riprendendo la sintassi del C.

Qual è l'indice del primo elemento di un array in C o in C++?

Risposta : 0

Gli indici degli array partono da 0: un array di n elementi è indicizzato da 0 a n meno 1.

Dopo l'istruzione int x = 10 / 4 ; in C, quale valore contiene la variabile x?

Risposta : 2

Entrambi gli operandi sono interi: la divisione è intera e il risultato 2.5 viene troncato a 2.

Medio

Nell'istruzione p = &x ; che cosa produce l'operatore & applicato alla variabile x?

Risposta : L'indirizzo di memoria di x

L'operatore & restituisce l'indirizzo di x, che il puntatore p può memorizzare. L'operatore * serve ad accedere al valore puntato.

In C++, che cosa fa la dichiarazione int &r = x ;?

Risposta : Crea un alias: r designa lo stesso oggetto di x

Un riferimento è un alias dell'oggetto designato: non crea una copia e deve essere inizializzato già al momento della dichiarazione.

In C e in C++, dove sono collocate le variabili locali di una funzione, escluse le allocazioni dinamiche?

Risposta : Nello stack

Le variabili locali vivono nello stack e scompaiono alla fine della funzione. Lo heap serve all'allocazione dinamica, con malloc o new.

Quale funzione della libreria C libera un blocco di memoria allocato con malloc?

Risposta : free

free restituisce al sistema la memoria allocata con malloc. In C++, un oggetto creato con new si libera con delete.

Che cosa si chiama perdita di memoria (memory leak)?

Risposta : Un blocco allocato dinamicamente che non viene più liberato né è accessibile

C'è perdita quando un blocco allocato dinamicamente non viene più liberato mentre il programma non vi può più accedere: la memoria resta riservata inutilmente.

Con int t[4] ; e int *p = t ; che cosa designa l'espressione p + 2?

Risposta : L'elemento t[2]

Nell'aritmetica dei puntatori, p + 2 avanza di due elementi, non di due byte: l'espressione designa t[2].

In C++, qual è la differenza predefinita tra struct e class?

Risposta : I membri di una struct sono pubblici per impostazione predefinita, quelli di una class sono privati

struct e class offrono le stesse possibilità in C++; cambia solo l'accesso predefinito: public per struct, private per class.

In C++, quando viene chiamato il distruttore di un oggetto locale?

Risposta : Quando l'oggetto esce dal suo ambito

Il distruttore viene chiamato automaticamente quando un oggetto locale esce dal suo ambito, il che permette di liberare le sue risorse. Il costruttore, invece, viene eseguito alla creazione.

Difficile

Quale standard del C++ ha introdotto le lambda, la parola chiave auto e la semantica di spostamento?

Risposta : C++11

Il C++11 ha introdotto le lambda, la parola chiave auto, la semantica di spostamento e i thread della libreria standard.

Quale puntatore intelligente della STL possiede da solo l'oggetto che punta, senza contatore di riferimenti?

Risposta : std::unique_ptr

unique_ptr distrugge l'oggetto quando esce dal suo ambito. Non può essere copiato, ma soltanto spostato.

Che cosa indica il principio RAII in C++?

Risposta : Acquisire una risorsa in un costruttore e rilasciarla nel distruttore

RAII, da Resource Acquisition Is Initialization, lega la durata di una risorsa a quella di un oggetto: il rilascio avviene automaticamente all'uscita dall'ambito.

Che cosa fa std::move(x) quando viene applicato a un oggetto x?

Risposta : Converte x in un riferimento rvalue, senza spostare nulla da sé

std::move è un semplice cast: consente al costruttore o all'operatore di spostamento di riprendere le risorse di x.

Quale contenitore della STL memorizza coppie chiave-valore uniche, ordinate per chiave, con accessi in tempo logaritmico?

Risposta : std::map

std::map si appoggia su un albero bilanciato: chiavi uniche, percorso ordinato, ricerca in O(log n). unordered_map, invece, usa una tabella hash senza ordine.

Dopo int n = 3 ; auto f = [n]() { return n * 2 ; } ; poi n = 10 ; che cosa restituisce f()?

Risposta : 6

La cattura [n] copia il valore di n al momento della creazione della lambda: f restituisce 3 moltiplicato per 2, cioè 6, anche se n cambia in seguito.

Con int t[3] e una variabile i che vale 5, che cosa succede alla lettura di t[i] in C++?

Risposta : Il comportamento è indefinito: il programma può andare in crash o produrre un valore qualsiasi

Leggere fuori dai limiti con [] è un comportamento indefinito. Per std::vector, la funzione at() verifica i limiti e solleva std::out_of_range.

In C++, quale parola chiave posta davanti a una funzione membro permette che una chiamata tramite un puntatore alla classe base esegua la versione della classe derivata?

Risposta : virtual

Senza questa parola chiave la chiamata è risolta in base al tipo del puntatore. Con essa la scelta avviene in base al tipo reale dell'oggetto, a tempo di esecuzione.

Temi simili

Gioca ai quiz Linguaggi C e C++