Da "compila" a "so leggerlo"
Nella pagina precedente hai preso un file sorgente e l'hai trasformato in un programma funzionante con un compilatore. Ora rallentiamo e guardiamo cosa c'era davvero in quel file. Ogni programma C++ è costruito con lo stesso piccolo insieme di elementi strutturali e, una volta che sai dar loro un nome, un file .cpp sconosciuto smette di sembrare rumore.
Ecco un programma completo ed eseguibile. Leggilo una volta, poi lo smontiamo riga per riga.
Cinque righe significative, e ognuna svolge un compito preciso. Vediamole.
La riga #include
#include <iostream>
Questa riga include l'header <iostream>, così puoi usare le funzionalità di input/output come cout. #include è una direttiva del preprocessore: viene eseguita prima della compilazione vera e propria e in pratica incolla nel tuo file il contenuto di quell'header.
Due cose rendono speciali le righe #include:
- Iniziano con
#, che le contrassegna come direttive del preprocessore. - Non terminano con un punto e virgola. È l'unica eccezione comune all'abitudine "ogni riga finisce con
;" che stai per prendere.
Se usi cout ma dimentichi #include <iostream>, il compilatore non sa cosa sia cout e ottieni un errore come 'cout' was not declared in this scope. La soluzione è quasi sempre un include mancante.
La funzione main
int main() {
// ...
return 0;
}
main è il punto in cui inizia il tuo programma. Quando esegui il programma compilato, l'esecuzione parte dalla prima riga dentro main e si ferma quando main restituisce un valore. Ogni programma C++ ha esattamente un main, né più né meno.
Gli elementi:
int:mainrestituisce un intero al sistema operativo. Per convenzione,0significa "terminato con successo".main(): il nome, seguito dalle parentesi per i parametri (qui vuote).{ ... }: le parentesi graffe racchiudono il corpo, cioè le istruzioni che vengono eseguite.return 0;: terminamaine segnala il successo. Se lo ometti, il C++ trattamaincome se restituisse0al posto tuo, ma scriverlo rende evidente la tua intenzione.
Le istruzioni e il punto e virgola
Un'istruzione è un'unica istruzione completa da eseguire. In C++, ogni istruzione termina con un punto e virgola:
Il C++ ignora completamente gli a capo e gli spazi in più. Al compilatore non importa se metti le istruzioni su una riga o su dieci: è il ; che gli dice dove finisce ogni istruzione. Per il compilatore queste tre forme sono identiche:
int a = 1; int b = 2;
int a = 1;
int b = 2;
int
a
= 1;
Questa libertà porta con sé la trappola più comune per i principianti: un punto e virgola dimenticato. Guarda cosa succede qui.
int x = 5 // <-- senza punto e virgola
int y = 10;
Otterrai un errore come expected ';' before 'int'. Nota l'insidia: il compilatore si accorge che qualcosa non va solo quando arriva alla riga successiva, quindi il numero di riga segnalato spesso punta una riga sotto l'errore vero. Quando un errore parla di un ; mancante, controlla la riga sopra quella indicata nel messaggio.
Le parentesi graffe definiscono i blocchi
Dove alcuni linguaggi usano l'indentazione per raggruppare il codice, il C++ usa le parentesi graffe { }. Tutto ciò che sta tra una coppia di graffe corrispondenti forma un blocco. I corpi delle funzioni, i cicli e le istruzioni if le usano tutti:
Le due righe dentro le graffe dell'if vengono eseguite solo quando la condizione è vera. L'ultimo cout sta fuori dalle graffe, quindi viene eseguito sempre.
Dato che la struttura è definita dalle graffe e non dall'indentazione, il C++ non ti obbliga a indentare. Dovresti farlo comunque: l'indentazione è il modo in cui le persone leggono la struttura che le graffe definiscono. Un bug comune è una graffa senza corrispondenza: ogni { ha bisogno di una } di chiusura. Se ne dimentichi una, di solito il compilatore segnala un errore verso la fine del file (expected '}' at end of input), lontano dal punto in cui hai sbagliato davvero. Contare le graffe, o lasciare che sia l'editor ad abbinarle per te, evita parecchia confusione.
Output con cout e <<
Hai già visto cout qualche volta. È lo stream di output standard, e gli invii valori con l'operatore << (leggilo come "metti questo nell'output"):
Puoi concatenare << per stampare più cose di seguito. endl termina la riga (e svuota anche il buffer); la sequenza di escape "\n" è un modo più leggero per stampare un a capo. Per programmi semplici vanno bene entrambi.
Quanto a quel using namespace std; in cima: i nomi della libreria standard stanno nel namespace std, quindi il nome completo è std::cout. Scrivere una volta using namespace std; ti permette di togliere il prefisso std:: e scrivere solo cout. È comodo negli esempi brevi, ma nei progetti più grandi molti team preferiscono lo std::cout esplicito per evitare conflitti di nomi, quindi non stupirti di vederlo scritto in entrambi i modi.
Ora sai leggere lo scheletro di qualsiasi programma
Gli include in cima, una funzione main come punto di ingresso, istruzioni che terminano con il punto e virgola, graffe che raggruppano il codice in blocchi e cout << per l'output: questo scheletro si trova in quasi ogni file C++ che aprirai. Il resto del linguaggio è un insieme di dettagli costruiti sopra queste poche forme. Quando un programma ti sembra intimidatorio, trova prima main, poi leggi le istruzioni in ordine: la struttura ti farà da guida.
Prossimo: Commenti
Per ora ogni riga dei tuoi programmi è codice che il compilatore legge. Ora aggiungeremo righe che ignora di proposito, i commenti, così potrai lasciare note per te e per chi legge. Vedrai la forma su una riga // e quella a blocco /* ... */, e quando conviene usare l'una o l'altra.
Domande frequenti
Perché ogni istruzione C++ ha bisogno di un punto e virgola?
Il C++ ignora gli a capo e gli spazi, quindi ha bisogno di un segnale esplicito che indichi dove finisce un'istruzione e dove inizia la successiva. Quel segnale è il punto e virgola ;. Un punto e virgola mancante è in assoluto l'errore di compilazione più comune tra i principianti, e il numero di riga segnalato spesso è quello della riga dopo quella in cui l'hai dimenticato.
Cosa fa int main() in C++?
main è la funzione da cui parte l'esecuzione del programma: l'esecuzione inizia dalla sua prima riga e termina quando restituisce un valore. Ogni programma C++ ha bisogno esattamente di un main. L'int indica che restituisce un codice di stato intero al sistema operativo, dove per convenzione 0 indica il successo.
Devo scrivere std:: prima di cout?
Puoi scrivere std::cout (nome completamente qualificato) oppure aggiungere una volta using namespace std; in cima al file e poi scrivere solo cout. La forma qualificata è più sicura nei file grandi; using namespace std; è una scorciatoia comune negli esempi brevi e nei tutorial.