C++, una panoramica sul linguaggio

Materie:Appunti
Categoria:Informatica

Voto:

1.5 (2)
Download:68
Data:08.08.2005
Numero di pagine:17
Formato di file:.doc (Microsoft Word)
Download   Anteprima
panoramica-linguaggio_1.zip (Dimensione: 138.4 Kb)
trucheck.it_c++,-una-panoramica-sul-linguaggio.doc     1030.5 Kb
readme.txt     59 Bytes


Testo

C++, una panoramica sul linguaggio
© Copyright 1996, Paolo Marotta

Indice
Introduzione
Elementi lessicali
Commenti
Identificatori
Parole riservate
Costanti letterali
Segni di punteggiatura e operatori
Espressioni e istruzioni
Assegnamento
Espressioni
Controllo del flusso
Dichiarazioni
Tipi primitivi
Variabili e costanti
Scope e lifetime
Costruire nuovi tipi
Array
Strutture
Unioni
Enumerazioni
La keyword typedef
Sottoprogrammi e funzioni
Dichiarazione e chiamata di una funzione
Passaggio di parametri e argomenti di default
La funzione main()
Funzioni inline
Overloading delle funzioni
Puntatori e reference
Puntatori
Operazioni sui puntatori
Puntatori vs Array
Uso dei puntatori
Reference
Uso dei reference
Puntatori vs Reference
Linkage e file Header
Linkage
File header
Librerie di funzioni
Programmazione a oggetti
Strutture e campi funzione
Sintassi della classe
Definizione delle funzioni membro
Costruttori
Distruttori
Membri static
Membri const
Costanti vere dentro le classi
Membri volatile
Dichiarazioni friend
Reimpiego di codice
Reimpiego per composizione
Costruttori per oggetti composti
Reimpiego di codice con l'ereditarietа
Accesso ai campi ereditati
Ereditarietа pubblica privata e protetta
Ereditarietа multipla
Classi base virtuali
Funzioni virtuali
Classi astratte
L'overloading degli operatori
Le prime regole
L'operatore di assegnamento
L'operatore di sottoscrizione
Operatori && e ||
Smart pointer
L'operatore virgola
Autoincremento e autodecremento
New e delete
Conclusioni
Conversioni di tipo
Principi della programmazione orientata agli oggetti
Introduzione
Il C++ и un linguaggio di programmazione "all purpose", ovvero adatto alla realizzazione di qualsiasi tipo di applicazione da quelle real time a quelle che operano su basi di dati, da applicazioni per utenti finali a sistemi operativi. Il fatto che sia un linguaggio "all purpose" non vuol comunque dire che qualsiasi cosa va fatta in C++, esistono moltissimi linguaggi di programmazione alcuni dei quali altamente specializzati per compiti precisi e che quindi possono essere in molti casi una scelta migliore perchй consentono di ottenere un rapporto "costi di produzione/prestazioni" migliore per motivi che saranno chiari tra poche righe.
Negli ultimi anni il C++ ha ottenuto un notevole successo per diversi motivi:
• Conserva una compatibilitа quasi assoluta (alcune cose sono diverse) con il suo piщ diretto antenato, il C, da cui eredita la sintassi e la semantica per tutti i costrutti comuni, oltre alla notevole flessibilitа e potenza;
• Permette di realizzare qualsiasi cosa fattibile in C senza alcun overhead addizionale;
• Estende le caratteristiche del C fornendo i meccanismi per l'astrazione dei dati e la programmazione orientata agli oggetti, introducendo costrutti innovativi (modelli, Run Time Type Information...) e fornendo uno dei migliori sistemi di tipi mai realizzato (cosa che manca nel C);
• Possibilitа di portare facilmente le applicazioni verso altri sistemi;
Comunque il C++ presenta anche degli aspetti negativi (come ogni linguaggio), in parte ereditate dal C:
• La potenza e la flessibilitа tipiche del C e del C++ non sono gratuite. Se da una parte и vero che и possibile ottenere applicazioni in generale piщ efficienti (rispetto ad agli altri linguaggi), e anche vero che tutto questo и ottenuto lasciando in mano al programmatore molti dettagli e compiti che negli altri linguaggi sono svolti dal compilatore; и quindi necessario un maggiore lavoro in fase di progettazione e una maggiore attenzione ai particolari in fase di realizzazione, pena una valanga di errori spesso subdoli e difficili da individuare che possono far levitare drasticamente i costi di produzione;
• Il compilatore e il linker del C++ soffrono di problemi relativi all'ottimizzazione del codice dovuti alla falsa assunzione che programmi C e C++ abbiano comportamenti simili a run time: il compilatore nella stragrande maggioranza dei casi si limita ad eseguire le ottimizzazioni tradizionali, sostanzialmente valide in linguaggi come il C, ma spesso inadatte a linguaggi pesantemente basati sulla programmazione ad oggetti; il linker poi da parte sua и rimasto immutato e non esegue alcun tipo di ottimizzazione che non possono essere effettuate a compile-time;
• Infine manca ancora uno standard per il linguaggio, cosa che crea problemi in fase di porting su altre piattaforme. Fortunatamente uno standard e ormai in avanzata fase di discussione ed и possibile consultare i primi draft;
Obiettivo di quanto segue и quello di introdurre alla programmazione in C++, spiegando sintassi e semantica dei suoi costrutti anche con l'ausilio di opportuni esempi. All'inizio verranno trattati gli aspetti basilari del linguaggio (tipi, dichiarazioni di variabili, funzioni,...), quando poi il lettore sarа in grado di comprendere, analizzare e realizzare un programma si procederа a trattare gli aspetti peculiari del linguaggio (classi, template, eccezioni); alla fine verranno analizzate alcune librerie relative all'input/output.
Il corso и rivolto a persone che non hanno alcuna conoscenza del linguaggio, ma potrа tornare utile anche a programmatori che possiedono una certa familiaritа con esso. L'unico requisito richiesto и la conoscenza dei principi della programmazione orientata agli oggetti (OOP), tuttavia non essendo un corso di programmazione, la capacitа di programmare in un qualsiasi altro linguaggio и ritenuta dote necessaria alla comprensione di quanto segue.
Per chi non avesse conoscenza di programmazione ad oggetti si rimanda a "I principi della programmazione orientata agli oggetti", Mondo Bit N.1 - Giugno 1995.
Salvo rare eccezioni non verranno discussi aspetti relativi a tematiche di implementazione dei vari meccanismi e altre note tecniche che esulano dagli obiettivi del corso.
Per eventuali domande e osservazioni sui contenuti di quanto segue potete fare riferimento al mio e-mail: [email protected], le vostre domande e le relative risposte (se ritenute di interesse generale) saranno ospitate in un apposito spazio.
Un ultimo avvertimento: quanto segue cerca di trarre i massimi benefici da una concezione stile ipertesto, in alcuni casi ci saranno dei link a pagine che dovranno ancora essere rese disponibili; mi scuso pertanto fin da ora per i disagi che ciт comporterа.
Elementi lessicali
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 и quello di tradurre il programma originale (codice sorgente) in uno semanticamente equivalente, ma eseguibile su una certa macchina. Il processo di compilazione и suddiviso in piщ fasi, ciascuna delle quali volta all'acquisizione di opportune informazioni necessarie alla fase successiva.
La prima di queste fasi и 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 lessicali:
• Commenti;
• Identificatori;
• Parole riservate;
• Costanti letterali;
• Segni di punteggiatura e operatori;
Analiziamole piщ in dettaglio.
Commenti
I commenti, come in qualsiasi altro linguaggio, hanno valore soltanto per il programmatore e vengono
ignorati dal compilatore. И possibile inserirli nel proprio codice in due modi diversi:
1.secondo lo stile C ovvero racchiudendoli tra i simboli /* e */
2.facendoli precedere dal simbolo //
Nel primo caso и considerato commento tutto quello che и compreso tra /* e */, il commento quindi si
puт estendere anche su piщ righe o trovarsi in mezzo al codice:
void Func() {
...
int a = 5; /* questo и un commento
diviso su piщ righe */
a = 4 /* commento */ + 5;
...
}
Nel secondo caso, proprio del C++, и invece considerato commento tutto ciт che segue // fino alla fine della linea, ne consegue che non и possibile inserirlo in mezzo al codice o dividerlo su piщ righe (a meno che anche l'altra riga non cominci con //):
void Func() {
...
int a = 5; // questo и un commento valido
a = 4 // sbagliato, il "+ 5;" и considerato commento + 5;
e non и possibile dividerlo su piщ righe
...
}
Benchй esistano due distinti metodi per commentare il codice, non и possibile avere commenti annidati, il primo simbolo tra // e /* determina il tipo di commento che l'analizzatore lessicale si aspetta. Bisogna anche ricordare di separare sempre i caratteri di inizio commento dall'operatore di divisione (simbolo /):
a + c //* commento */ 3
Tutto ciт che segue "a + c" viene interpretato come un commento iniziato da //, и necessario inserire uno spazio tra / e /*.
Identificatori
Gli identificatori sono simboli definiti dal programmatore per riferirsi a cinque diverse categorie di oggetti:
• Variabili;
• Costanti simboliche;
• Etichette;
• Tipi definiti dal programmatore;
• Funzioni;
Le variabili sono contenitori di valori di un qualche tipo; ogni variabile puт contenere un singolo valore che puт cambiare nel tempo, il tipo di questo valore viene comunque stabilito una volta per tutte e non puт cambiare.
Le costanti simboliche servono ad identificare valori che non cambiano nel tempo, non possono essere considerate dei contenitori, ma solo un nome per un valore.
Una etichetta и un nome il cui compito и quello di identificare una istruzione del programma e sono utilizzate dall'istruzione di salto incondizionato goto.
Un tipo invece, come vedremo meglio in seguito, identifica un insieme di valori e di operazioni definite su questi valori; ogni linguaggio fornisce un certo numero di tipi primitivi (cui и associato un identificatore di tipo predefinito) e dei meccanismi per permettere la costruzione di nuovi tipi (a cui il programmatore deve poter associare un nome) a partire da quelli primitivi.
Infine funzione и il termine che il C++ utilizza per indicare i sottoprogrammi.
Parleremo comunque con maggior dettaglio di variabili, costanti, etichette, tipi e funzioni in seguito.
Un identificatore deve iniziare con una lettera o con underscore _ seguita da un numero qualsiasi di lettere, cifre o underscore; viene fatta distinzione tra lettere maiuscole e lettere minuscole. Benchй il linguaggio non preveda un limite alla lunghezza massima di un identificatore, и 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.
Parole riservate
Ogni linguaggio si riserva delle parole chiave (keywords) il cui significato и prestabilito e che non possono essere utilizzate dal programmatore come identificatori. Il C++ non fa eccezione:
asm
continue
float
new
signed
try
auto
default
for
operator
sizeof
typedef
break
delete
friend
private
static
union
case
do
goto
protected
struct
unsigned
catch
double
if
public
switch
virtual
char
else
inline
register
template
void
class
enum
int
return
this
volatile
const
extern
long
short
trow
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.
Costanti letterali
All'interno delle espressioni и 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 o un numero in virgola mobile.
'a' // Costante di tipo carattere
"a" // Stringa di un carattere
"abc" // Ancora una stringa
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, и consentito l'uso delle lettere da "A" a "F" e da "a" a "f".
Il tipo (Vedi tipi di dato) in cui viene convertita la costante intera dipende dalla rappresentazione utilizzata e dal valore:
• Base 10: il piщ piccolo atto a contenerla tra int, long int e unsigned long int
• Base 8 o 16: il piщ piccolo atto a contenerla tra int, unsigned int, long int e unsigned long int
Si puт forzare il tipo da utilizzare aggiungendo alla costante un suffisso costituito da u o U, e/o l o L: la lettera U seleziona i tipi unsigned e la L i tipi long; se solo una tra le due lettere viene specificata, viene scelto il piщ piccolo di quelli atti a contenere il valore e selezionati dal programmatore:
20 // intero in base 10
024 // 20 in base 8
0x14 // 20 in base 16
12ul // forza unsigned long
12l // forza long
12u // forza unsigned
Un valore in virgola mobile и costituito da:
• Intero decimale, opzionalmente con segno;
• Punto decimale
• Frazione decimale;
• e o E e un intero decimale con segno;
И possibile omettere uno tra l'intero decimale e la frazione decimale, ma non entrambi. И possibile omettere uno tra il punto decimale e la lettera E (o e) e l'intero decimale con segno, ma non entrambi. L'uso della lettera E indica il ricorso alla notazione scientifica.
Il tipo scelto per rappresentare una costante in virgola mobile и 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 // equivalente a 110 * 10^4 (10 elevato a 4)
.14e-2 // 0.0014
-3.5e+3 // -3500.0
3.5f // forza float
3.4L // forza long double
Segni di punteggiatura e operatori
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:
++ -- -> .* ->* > = == != &&
|| += -= *= =
Esamineremo meglio i vari simboli piщ avanti.
Espressioni e istruzioni
Inizieremo ad esaminare i costrutti del C++ partendo proprio dalle istruzioni e dalle espressioni, perchй in questo modo sarа piщ semplice esemplificare alcuni concetti che verranno analizzati nel seguito. Per adesso comunque analizzeremo solo le istruzioni per il controllo del flusso e l'assegnamento, le rimanenti (poche) istruzioni verranno discusse via via che sarа necessario nei prossimi capitoli.
Assegnamento
Il C++ и un linguaggio pesantemente basato sul paradigma imperativo, questo vuol dire che un programma C++ и sostanzialmente una sequenza di assegnamenti di valori a variabili. И quindi naturale iniziare parlando proprio dell'assegnamento.
L'operatore di assegnamento и 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 и una qualsiasi espressione la cui valutazione produca un valore. Ecco alcuni esempi:
Pippo = 5;
Topolino = 'a';
Clarabella = Pippo;
Pippo = Pippo + 7;
Clarabella = 4 + 25;
Il risultato dell'assegnamento и il valore prodotto dalla valutazione della parte destra (rvalue) e ha come effetto collaterale l'assegnazione di tale valore alla regione di memoria denotato dalla parte sinistra (lvalue), ciт vuol dire che ad esempio che il primo assegnamento sopra produce come risultato il valore 5 e che dopo tale assegnamento la valutazione della variabile Pippo produrrа tale valore fino a che un nuovo assegnamento non verrа eseguito su tale variabile.
Si osservi che una variabile puт apparire sia a destra che a sinistra di un assegnamento, se tale occorrenza si trova a destra produce il valore contenuto nella variabile, se invece si trova a sinistra essa denota la locazione di memoria cui riferisce. Ancora, poichй un identificatore di variabile puт trovarsi contemporaneamente su ambo i lati di un assegnamento и necessaria una semantica non ambigua: come in qualsiasi linguaggio imperativo (Pascal, Basic, ...) la semantica dell'assegnamento impone che prima si valuti la parte destra e poi si esegua l'assegnamento del valore prodotto all'operando di sinistra.
Poichй un assegnamento produce come risultato il valore prodotto dalla valutazione della parte destra (и cioи a sua volta una espressione), и possibile legare in cascata piщ assegnamenti:
Clarabella = Pippo = 5;
Essendo l'operatore di assegnamento associativo a destra, l'esempio visto sopra и da interpretare come
Clarabella = (Pippo = 5);
cioи viene prima assegnato 5 alla variabile Pippo e il risultato di tale assegnamento (il valore 5) viene poi assegnato alla variabile Clarabella.
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 cioи di operatori derivati dalla concatenazione dell'operatore di assegnamento con un altro operatore binario.
Gli altri operatori che hanno come effetto laterale l'assegnamento sono quelli di autoincremento e autodecremento, ecco come possono essere utilizzati:
Pippo++; // cioи 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 и proprio identico: 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:
Clarabella = ++Pippo;
// equivale a:
Pippo++;
Clarabella = Pippo;

// invece
Clarabella = Pippo++;
// equivale a:
Clarabella = Pippo;
Pippo++;
Espressioni
Le espressioni, per quanto visto sopra, rappresentano un elemento basilare del C++, tant'и che il linguaggio fornisce un ampio insieme di operatori. Eccone l'elenco completo:
SOMMARIO DEGLI OPERATORI
:: risolutore di scope
. selettore di campi
-> selettore di campi
[ ] sottoscrizione
( ) chiamata di funzione
( ) costruttore di valori
++ post incremento
-- post decremento
sizeof dimensione di
++ pre incremento
-- pre decremento
~ complemento
! negazione
- meno unario
+ piщ unario
& indirizzo di
* dereferenzazione
new allocatore di oggetti
delete deallocatore di oggetti
delete[ ] deallocatore di array
( ) conversione di tipo

.* selettore di campi
->* selettore di campi
* moltiplicazione
/ divisione
% modulo (resto)
+ somma
- sottrazione
> shift a destra

< minore di
maggiore di
>= maggiore o uguale

== uguale a
!= diverso da

& AND di bit
^ OR ESCLUSIVO di bit
| OR INCLUSIVO di bit
&& AND logico
|| OR logico (inclusivo)
? : espressione condizionale
= assegnamento semplice
*= moltiplica e assegna
/= divide e assegna
%= modulo e assegna
+= somma e assegna
-= sottrae e assegna
= shift destro e assegna
&= AND e assegna
|= OR inclusivo e assegna
^= OR esclusivo e assegna
throw lancio di eccezioni
, virgola
Gli operatori sono raggruppati in base alla loro precedenza: in alto quelli a precedenza maggiore, una linea vuota separa gli operatori con prioritа maggiore da quelli con prioritа minore. Gli operatori unari e quelli di assegnamento sono associativi a destra, gli altri a sinistra. L'ordine di valutazione delle sottoespressioni che compongono una espressione piщ grande non и definito.
Gli operatori di assegnamento e quelli di (auto)incremento e (auto)decremento sono giа stati descritti, esaminiamo ora l'operatore per le espressioni condizionali. L'operatore ? : и l'unico operatore ternario:
? :
Per definire la semantica di questo operatore и necessario prima parlare di vero e falso in C++. A differenza di linguaggi quali il Pascal, il C++ non fornisce un tipo primitivo (vedi tipi primitivi) per codificare i valori booleani; essi sono rappresentati tramite valori interi: 0 (zero) indica falso e un valore diverso da 0 indica vero. Ciт implica che ovunque sia richiesta una condizione и possibile mettere una qualunque espressione che possa produrre un valore intero (quindi anche una somma, ad esempio). Non solo, dato che l'applicazione di un operatore booleano o relazionale a due sottoespressioni produce 0 o 1 (a seconda del valore di veritа della formula), и possibile mescolare operatori booleani, relazionali e aritmetici.
Premesso ciт, la semantica associata all'operatore ? : и la seguente: si valuta Cond, se essa и vera (diversa da zero) il risultato di tale operatore и la valutazione di Expr2, altrimenti il risultato и Expr3.
Per quanto riguarda gli altri operatori, alcuni saranno esaminati quando sarа necessario, non verranno invece discussi gli operatori logici e quelli di confronto (la cui semantica viene considerata nota al lettore).
Rimangono gli operatori per lo spostamento di bit, ci limiteremo a dire che servono sostanzialmente a eseguire moltiplicazioni e divisioni per multipli di 2 in modo efficiente.
Controllo del flusso
Esamineremo ora le istruzioni per il controllo del flusso, ovvero quelle istruzioni che consentono di eseguire una certa sequenza di istruzioni, o eventualmente un'altra, in base al valore di una espressione.
IF-ELSE
L'istruzione condizionale if-else ha due possibili formulazioni:
if ( ) ;
oppure
if ( ) ;
else ;
L'else и quindi opzionale, ma, se utilizzato, nessuna istruzione deve essere inserita tra il ramo if e il ramo else. Vediamo ora la semantica di tale istruzione.
In entrambi i casi se Condizione и vera viene eseguita Istruzione1, altrimenti nel primo caso non viene eseguita alcuna istruzione, nel secondo si esegue Istruzione2. Si osservi che Istruzione1 e Istruzione2 sono istruzioni singole (una sola istruzione), se и necessaria una sequenza di istruzioni esse devono essere racchiuse tra una coppia di parentesi graffe { }, come mostra l'esempio (si considerino X, Y e Z variabili intere)
if ( X==10 ) X--;
else {
Y++;
Z*=Y; }
Ancora alcune osservazioni: il linguaggio prevede che due istruzioni consecutive siano separate da ; (punto e virgola), in particolare si noti il punto e virgola tra il ramo if e l'else; l'unica eccezione alla regola и data dalle istruzioni composte (cioи sequenze di istruzioni racchiuse tra parentesi graffe) che non devono essere seguite dal punto e virgola (non serve, c'и la parentesi graffa).
Un'ultima osservazione, per risolvere eventuali ambiguitа il compilatore lega il ramo else con la prima occorrenza libera di if che incontra tornando indietro (si considerino Pippo, Pluto e Topolino variabili intere):
if (Pippo) if (Pluto) Topolino = 1;
else Topolino =2;
viene interpretata come
if (Pippo)
if (Pluto) Topolino = 1;
else Topolino =2;
l'else viene cioи legato al secondo if.
WHILE & DO-WHILE
I costrutti while e do while consentono l'esecuzione ripetuta di una sequenza di istruzioni in base al valore di veritа di una condizione. Vediamone la sintassi:
while ( ) ;
Al solito, Istruzione indica una istruzione singola, se и necessaria una sequenza di istruzioni essa deve essere racchiusa tra parentesi graffe.
La semantica del while и la seguente: prima si valuta Condizione e se essa и vera (diversa da 0) si esegue Istruzione e poi si ripete il tutto; l'istruzione termina quando Condizione valuta a 0 (falsa).
Esaminiamo ora l'altro costrutto:
do while ( ) ;
Nuovamente, Istruzione indica una istruzione singola, se и necessaria una sequenza di istruzioni essa deve essere racchiusa tra parentesi graffe; si noti inoltre che Istruzione non и seguita da punto e virgola.
Il do while differisce dall'istruzione while in quanto prima si esegue Istruzione e poi si valuta Condizione, se essa и vera si riesegue il corpo altrimenti l'istruzione termina; il corpo del do while viene quindi eseguito sempre almeno una volta.
Ecco un esempio:
// Calcolo del fattoriale tramite while
if (InteroPositivo) {
Fattoriale = InteroPositivo;
while (--InteroPositivo)
Fattoriale *= InteroPositivo;
}
else Fattoriale = 1;
// Calcolo del fattoriale tramite do-while
Fattoriale = 1;
if (InteroPositivo)
do
Fattoriale *= InteroPositivo
while (--InteroPositivo);
IL CICLO FOR
Come i piщ esperti sapranno, il ciclo for и una specializzazione del while, tuttavia nel C++ la differenza tra for e while и talmente sottile che i due costrutti possono essere liberamente scambiati tra loro.
La sintassi del for и la seguente:
for ( ; ; )
;
Inizializzazione puт essere una espressione che inizializza le variabili del ciclo o una dichiarazione di variabili (nel qual caso le variabili dichiarate hanno scope e lifetime limitati a tutto il ciclo); Condizione и una qualsiasi espressione a valori interi; e Iterazione и una istruzione da eseguire dopo ogni iterazione (solitamente un incremento).
Tutti e tre gli elementi appena descritti sono opzionali, in particolare se Condizione non viene specificata si assume che essa sia sempre verificata .

Ecco la semantica del for espressa tramite while (a meno di una istruzione continue contenuta in Istruzione):
;
while ( ) {
;
;
}
Una eventuale istruzione continue (vedi paragrafo successivo) in Istruzione causa un salto a Iterazione nel caso del ciclo for, nel while invece causa una uscita dal ciclo. Ecco come usare il ciclo for per calcolare il fattoriale:
for (Fatt = IntPos ? IntPos : 1; IntPos > 1; --IntPos)
Fatt *= IntPos;
BREAK & CONTINUE
Le istruzioni break e continue consentono un maggior controllo sui cicli. Nessuna delle due istruzioni accetta argomenti. L'istruzione break puт essere utilizzata dentro un ciclo o una istruzione switch (vedi paragrafo successivo) e causa la terminazione del ciclo in cui occorre (o dello switch).
L'istruzione continue puт essere utilizzata solo dentro un ciclo e causa l'interruzione della corrente esecuzione del corpo del ciclo; a differenza di break quindi il controllo non viene passato all'istruzione successiva al ciclo, ma al punto immediatamente prima della fine del body del ciclo (pertanto il ciclo potrebbe ancora essere eseguito):
Fattoriale = 1;
while (1) { // all'infinito...
if (InteroPositivo > 1) {
Fattoriale *=Interopositivo--;
continue;
}
break; // se eseguita allora InteroPositivo

Esempio