




























































































Studia grazie alle numerose risorse presenti su Docsity
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Prepara i tuoi esami
Studia grazie alle numerose risorse presenti su Docsity
Prepara i tuoi esami con i documenti condivisi da studenti come te su Docsity
Trova i documenti specifici per gli esami della tua università
Preparati con lezioni e prove svolte basate sui programmi universitari!
Rispondi a reali domande d’esame e scopri la tua preparazione
Riassumi i tuoi documenti, fagli domande, convertili in quiz e mappe concettuali
Studia con prove svolte, tesine e consigli utili
Togliti ogni dubbio leggendo le risposte alle domande fatte da altri studenti come te
Esplora i documenti più scaricati per gli argomenti di studio più popolari
Ottieni i punti per scaricare
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
è un tutorial semplificativo per imparare le basi per una sucessiva e efficiente programmazione in c++
Tipologia: Sintesi del corso
1 / 318
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!





























































































In offerta
1
introdurre alla programmazione in C++, spiegando sintassi e semantica dei
suoi costrutti anche con l'ausilio di opportuni esempi. Verranno inizialmente
trattati gli aspetti basilari del linguaggio (tipi, dichiarazioni di variabili,
funzioni,...), per poi passare all'esame degli aspetti peculiari del linguaggio
(classi, template, eccezioni...); alla fine analizzeremo (almeno in parte)
l'input/output tramite stream e la libreria standard del linguaggio.
0
1
Ogni programma scritto in un qualsiasi linguaggio di programmazione prima di essere eseguito viene sottoposto ad un processo di compilazione o interpretazione (a seconda che si usi un compilatore o un interprete). Lo scopo di questo processo equello di tradurre il programma originale (codice sorgente) in uno semanticamente equivalente, ma eseguibile su una certa macchina. Il processo di compilazione e suddiviso in piu` fasi, ciascuna delle quali volta all'acquisizione di opportune informazioni necessarie alla fase successiva.
La prima di queste fasi e` nota come analisi lessicale ed ha il compito di riconoscere gli elementi costitutivi del linguaggio sorgente, individuandone anche la categoria lessicale. Ogni linguaggio prevede un certo numero di categorie lessicali e in C++ possiamo distinguere in particolare le seguenti categorie:
Commenti;
Identificatori;
Parole riservate;
Costanti letterali; Segni di punteggiatura e operatori;
2
I commenti, come in qualsiasi altro linguaggio, hanno valore soltanto per il programmatore e vengono ignorati dal compilatore. E` possibile inserirli nel proprio codice in due modi diversi:
secondo lo stile C ovvero racchiudendoli tra i simboli /* e */
facendoli precedere dal simbolo //
Nel primo caso econsiderato commento tutto quello che e compreso tra /* e */, il commento quindi si puoestendere anche su piu righe o trovarsi in mezzo al codice:
void Func() { ... int a = 5; /* questo eun commento diviso su piu righe / a = 4 / commento */ + 5; ... }
3
Nel secondo caso, proprio del C++, einvece considerato commento tutto cio che segue // fino alla fine della linea, ne consegue che non epossibile inserirlo in mezzo al codice o dividerlo su piu righe (a meno che anche l'altra riga non cominci con //):
void Func() { ... int a = 5; // questo eun commento valido a = 4 // Errore! il "+ 5;" e commento + 5; e non epossibile dividerlo su piu righe ... }
6
In effetti potremmo considerare una sesta categoria di identificatori, gli identificatori di macro; una macro e` sostanzialmente un alias per un frammento di codice. Le macro comunque, come vedremo in seguito, non sono trattate dal compilatore ma da un preprocessore che si occupa di eseguire alcune elaborazioni sul codice sorgente prima che questo venga effettivamente sottoposto a compilazione.
Un identificatore deve iniziare con una lettera o con carattere di underscore (_) che possono essere seguiti da un numero qualsiasi di lettere, cifre o underscore; viene fatta distinzione tra lettere maiuscole e lettere minuscole. Tutti gli identificatori presenti in un programma devono essere diversi tra loro, indipendentemente dalla categoria cui appartengono.
Benché il linguaggio non preveda un limite alla lunghezza massima di un identificatore, e` praticamente impossibile non imporre un limite al numero di caratteri considerati significativi, per cui ogni compilatore distingue gli identificatori in base a un certo numero di caratteri iniziali tralasciando i restanti; il numero di caratteri considerati significativi varia comunque da sistema a sistema.
7
Ogni linguaggio si riserva delle parole chiave (keywords) il cui significato e` prestabilito e che non possono essere utilizzate dal programmatore come identificatori. Il C++ non fa eccezione:
asm auto bool break case catch char class const continue const_cast default delete do double dynamic_cast else enum explicit extern false float for friend goto if inline int long mutable namespace new operator private protected public register reinterpret_cast return short signed sizeof static static_cast struct switch template this trow true try typedef typeid typename union unsigned using virtual void volatile wchar_t while
Sono inoltre considerate parole chiave tutte quelle che iniziano con un doppio underscore ; esse sono riservate per le implementazioni del linguaggio e per le librerie standard, e il loro uso da parte del programmatore dovrebbe essere evitato in quanto non sono portabili.
8
All'interno delle espressioni e` possibile inserire direttamente dei valori, questi valori sono detti costanti letterali. La generica costante letterale può essere:
un carattere racchiuso tra apice singolo,
una stringa racchiusa tra doppi apici,
un intero
un numero in virgola mobile.
'a' // Costante di tipo carattere "a" // Stringa di un carattere "abc" // Ancora una stringa
9
Un intero può essere:
Una sequenza di cifre decimali, eventualmente con segno;
Uno 0 (zero) seguito da un intero in ottale (base 8);
0x o 0X seguito da un intero in esadecimale (base 16);
Nella rappresentazione in esadecimale, oltre alle cifre decimali, e` consentito
l'uso delle lettere da "A" a "F" e da "a" a "f".
Si noti che un segno puo` essere espresso solo in base 10, negli altri casi esso
e` sempre +:
+45 // Costante intera in base 10, 055 // in base 8 0x2D // ed in base 16
12
Un valore in virgola mobile e` costituito da:
Intero decimale, opzionalmente con segno;
Punto decimale
Frazione decimale;
e o E e un intero decimale con segno;
L'uso della lettera E indica il ricorso alla notazione scientifica.
Epossibile omettere uno tra l'intero decimale e la frazione decimale, ma non entrambi. E possibile omettere uno tra il punto decimale e la lettera E (o e) e
l'intero decimale con segno, ma non entrambi.
13
Il tipo scelto per rappresentare una costante in virgola mobile e` double, se
non diversamente specificato utilizzando i suffissi F o f per float, o L o l per long
double. Esempi:
.0 // 0 in virgola mobile 110E+4 // 110 * 10000 .14e-2 // 0. -3.5e+3 // -3500. 3.5f // forza float 3.4L // forza long double
14
Alcuni simboli sono utilizzati dal C++ per separare i vari elementi sintattici o lessicali di un programma o come operatori per costruire e manipolare espressioni:
Anche le seguenti combinazioni di simboli sono operatori:
15
Il C++ e` un linguaggio pesantemente basato sul paradigma imperativo, questo
vuol dire che un programma C++ e` sostanzialmente una sequenza di
assegnamenti di valori a variabili. E` quindi naturale iniziare parlando proprio
dell'assegnamento.
L'operatore di assegnamento e` denotato dal simbolo = (uguale) e viene
applicato con la sintassi:
< lvalue > = < rvalue >;
Il termine lvalue indica una qualsiasi espressione che riferisca ad una regione di memoria (in generale un identificatore di variabile), mentre un rvalue e` una
qualsiasi espressione la cui valutazione produca un valore.
18
Poicheun assegnamento produce come risultato il valore prodotto dalla valutazione della parte destra (e cioea sua volta una espressione), e possibile legare in cascata piu` assegnamenti:
Clarabella = Pippo = 5;
Essendo l'operatore di assegnamento associativo a destra, l'esempio visto sopra e` da interpretare come
Clarabella = (Pippo = 5);
cioe` viene prima assegnato 5 alla variabile Pippo e il risultato di tale assegnamento (il valore 5) viene poi assegnato alla variabile Clarabella.
19
Esistono anche altri operatori che hanno come effetto collaterale
l'assegnazione di un valore, la maggior parte di essi sono comunque delle utili
abbreviazioni, eccone alcuni esempi:
Pippo += 5; // equivale a Pippo = Pippo + 5; Pippo -= 10; // equivale a Pippo = Pippo - 10; Pippo *= 3; // equivale a Pippo = Pippo * 3;
si tratta cioe` di operatori derivanti dalla concatenazione dell'operatore di
assegnamento con un altro operatore binario.
L'uso di queste forme sintetiche e' da preferire per due ragioni:
maggiore chiarezza del codice
maggiore efficienza
20
Gli altri operatori che hanno come effetto collaterale l'assegnamento sono quelli di autoincremento e autodecremento, ecco come possono essere utilizzati:
Pippo++; // cioe` Pippo += 1; ++Pippo; // sempre Pippo += 1; Pippo--; // Pippo -= 1; --Pippo; // Pippo -= 1;
Questi due operatori possono essere utilizzati sia in forma prefissa (righe 2 e 4) che in forma postfissa (righe 1 e 3); il risultato comunque non eproprio identico poiche la forma postfissa restituisce come risultato il valore della variabile e poi incrementa tale valore e lo assegna alla variabile, la forma prefissa invece prima modifica il valore associato alla variabile e poi restituisce tale valore:
21
Clarabella = ++Pippo;
/* equivale a */
Pippo++; Clarabella = Pippo;
/* invece */
Clarabella = Pippo++;
/* equivale a */
Clarabella = Pippo; Pippo++;
24
& Indirizzo
25
Shift destro
<= Minore od uguale
Maggiore = Maggiore od uguale
26
*= Assegna prodotto /= Assegna quoziente ( esp1 op= esp2 ) <=> %= Assegna resto (modulo)W (esp1 = esp1 op esp2) += Assegna somma -= Assegna differenza &= Assegna AND tra bit ^= Assegna XOR tra bit |= Assegna OR tra bit <<= Assegna shift sinistro
= Assegna shift destro
27
L'ordine di valutazione delle sottoespressioni che compongono una espressione piugrande non e definito, ad esempio nell'espressione
Pippo = 10 * 13 + 7 * 25;
non si sa quale tra 1013 e 725 verravalutata per prima (si noti che comunque verranno rispettate le regole di precedenza e associativita).
Gli operatori di assegnamento e quelli di (auto)incremento e (auto)decremento sono gia` stati descritti, esamineremo ora l'operatore per le espressioni condizionali.
L'operatore? : e` l'unico operatore ternario: