In questa lezione inizieremo ad analizzare la sintassi del linguaggio C, quali sono le regole alle quali bisogna attenersi per non avere errori in fase di compilazione e qual è la struttura generale di un programma.
Un primo aspetto molto importante da sottolineare è che il linguaggio C è case-sensitive, fa quindi distinzione tra caratteri minuscoli e maiuscoli: se nel nostro programma scriviamo Printf invece di printf otterremo un errore bloccante in fase di compilazione. In alcuni casi questi errori possono rivelarsi di facile risoluzione, ma altre volte possono rivelarsi molti insidiosi, quindi è bene iniziare fin da subito ad utilizzare delle convenzioni nella scelta dei caratteri maiuscoli/minuscoli e fare molta attenzione in fase di stesura del codice.
Un secondo aspetto, che in alcuni casi è causa di fraintendimenti, è che il C non tiene conto di spazi ripetuti, nè tabulazioni ripetute nè “a capo” quindi un programma potrebbe essere scritto, se solo lo si volesse, anche su una sola riga.
Nonostante questa libertà, o forse dovremmo dire a causa di questa libertà, esistono delle convenzioni sugli “a capo” e tabulazioni che prendono il nome di regole di indentazione che servono a rendere il codice più leggibile. Più avanti vedremo come scrivere un programma in maniera chiara seguendo queste convenzioni.
In questi articoli cercherò di attenermi allo stile di indentazione denominato K&R dal nome degli autori B. Kernighan e D. Ritchie, autori del testo “The C Programming language” (link) ritenuto, ancora oggi, la vera “bibbia” del linguaggio C. Purtroppo in certe occasioni l’indentazione del codice non sarà perfetta a causa di problemi di impaginazione, chiedo perdono in anticipo.
I commenti
All’interno del codice di un programma spesso è necessario, o utile, inserire dei commenti, ovvero delle annotazione che spieghino dei passaggi particolarmente complessi alle persone che lo leggeranno. Addirittura potrebbe capitare proprio a noi stessi, magari dopo qualche anno dalla stesura di un programma, di dover rimettere mano, per una qualsiasi ragione, al nostro stesso codice e voler continuare a capirci qualcosa senza troppe difficoltà e perdite inutili di tempo.
I commenti vengono del tutto ignorati dal compilatore, è quindi possibile scrivere tutto senza preoccuparsi di errori sintattici.
Esistono due tipi di commenti in C, il primo è il commento di riga, si usa per aggiungere una piccola descrizione. Per creare un commento di questo tipo basterà anteporre // alla riga sulla quale è scritto il commento, come mostrato nell’esempio:
//questo è un commento
int main (int argc, char **argv)
Il secondo è detto commento multiriga e viene usato per aggiungere i commenti più lunghi.
Per inserire un commento multiriga bisognerà racchiudere il testo tra i caratteri ” /* ” e ” */ ” come in questo esempio:
/* il metodo sottostante serve solo
a dare una giustificazione a questo commento
*/
int main(int argc, char **argv) {
}
La struttura del codice
Un programma in C è composto da uno o più blocchi di codice, il blocco principale si chiama main ed è necessario che in ogni programma ve ne sia uno e uno solo. I blocchi di codice (quindi anche il main) hanno la seguente struttura:
valore_di_ritorno NOME_BLOCCO (parametri)
{
operazioni nel blocco ;
operazioni nel blocco ;
...
return VALORE ;
}
Anche se in questo momento tutto ci può sembrare poco chiaro possiamo notare alcuni aspetti:
- Il contenuto del blocco è racchiuso dentro una coppia di parentesi graffe
- Ciascuna riga all’interno del blocco termina con un punto e virgola.
- Le istruzioni all’interno del blocco sono scritte più a destra rispetto al nome del blocco.
Bene, abbiamo appena imparato le prime due regole sintattiche del linguaggio C e una regola di indentazione! Le parentesi graffe sono utilizzate per delimitare il contenuto di un blocco, indicando chiaramente il suo inizio e la sua fine, i punti e virgola servono a delimitare chiaramente ogni singola istruzione mentre l’indentazione verso destra serve ad agevolare la comprensione del codice nel caso di blocchi annidati uno dentro l’altro come in questo caso:
valore_di_ritorno NOME_BLOCCO (parametri)
{
valore_di_ritorno NOME_BLOCCO (parametri)
{
operazioni nel blocco ;
operazioni nel blocco ;
...
return VALORE ;
}
operazioni nel blocco ;
operazioni nel blocco ;
...
return VALORE ;
}
Il codice così indentato risulta molto più leggibile rispetto alla sua versione non indentata:
valore_di_ritorno NOME_BLOCCO (parametri)
{
valore_di_ritorno NOME_BLOCCO (parametri)
{
operazioni nel blocco ;
operazioni nel blocco ;
...
return VALORE ;
}
operazioni nel blocco ;
operazioni nel blocco ;
...
return VALORE ;
}
Un blocco di codice è formalmente una funzione, che presi in input alcuni parametri, dopo aver effettuato alcune operazioni, fornisce un valore in output. In questo caso non stiamo parlando di funzione strettamente matematica, perchè i valori in input e in output possono non essere sempre numeri, pensiamo ad una funzione che presi in input i dati come nome, cognome etc, restituisca in input il codice fiscale, oppure una funzione che presi in input i dati di un dipendente mi restiuisca l’importo della sua busta paga…
Se confrontiamo lo schema con il blocco main dell’esempio del capitolo precedente possiamo vedere subito come la struttura sia identica (ho utilizzato i colori per evidenziare le componenti del blocco):
int main (int argc, char **argv)
{ printf(“Questo è il mio primo programma”); return 0; } |
valore_ritornato NOME_BLOCCO (parametri)
{ operazioni nel blocco ; operazioni nel blocco ; … return VALOREl; } |
Esaminando il codice, adesso che sappiamo che un blocco è a tutti gli effetti una funzione, possiamo quindi dire che:
- La funzione si chiama main
- La funzione accetta “quacosa” in input, vedremo poi meglio cosa.
- Che il valore_ritornato è un int che sta per intero ovvero numero senza virgola
- Esegue una operazione in cui scrive la stringa “Questo è il mio primo programma”
- Resituisce il valore zero.
Secondo questo schema allora come potrebbe essere scritto un blocco di codice o, più formalmente, una funzione, per sommare due numeri? Per esempio in questo modo:
int somma_due_numeri(int numeroA, int numeroB) { int risultato = numeroA + numeroB; return risultato; }
Seguendo l’esempio precedente possiamo analizzare questa funzione dicendo che:
- La funzione si chiama somma_due_numeri
- La funzione accetta “qualcosa” in input, che a guardare bene in questo caso sembrano due int, quindi due numeri senza virgola
- Restituisce in output un numero senza virgola
- Esegue una operazione in cui somma i due numeri ricevuti in input
- Resituisce il valore appena calcolato
Bene, abbiamo scritto il nostro secondo programma in C!
Adesso che siamo bravi proviamo ad analizzare queste funzioni, io non darò alcun suggerimento:
int età(int annoNascita)
{
int risultato = 2011 - annoNascita;
return risultato;
}
int duratadelmese (char *nomeMese) {
if nomeMese = gennaio
return 31;
if nomeMese = febbraio
return 28 ;
if nomeMese = marzo
return 31;
...
}
int secondiInUnaSettimana()
{
return (60 * 60 * 24 * 7);
}
Nota: Se avete già seguito qualche corso di programmazione C vi sarete accorti che questa lezione è stata leggermente atipica, perchè nel 99% dei casi i corsi iniziano parlando di altri argomenti e tralasciando interamente la struttura generale di un programma C. Sebbene questo sia lo standard defacto a mio avviso non è il modo migliore per approcciarsi al C, spero quindi di aver fornito un approccio nuovo e piacevole al linguaggio.
Prossimamente
Nella prossima lezione inizieremo a parlare di variabili: cosa sono, come si dichiarano nel codice e come si usano. Non mancate perchè inizieremo a fare sul serio!
Letture consigliate:
Il linguaggio C. Principi di programmazione e manuale di riferimento (Accademica)
Brian W. Kernighan – Dennis M. Ritchie
Editore: Pearson | Lingua: Italiano | Brossura: 313 pagine
Prezzo Listino: EUR 27,00
Prezzo Promozione: EUR 22,95 con Spedizione gratuita
C. Corso completo di programmazione
Paul J. Deitel – Harvey M. Deitel
Editore: Apogeo | Lingua: Italiano | Brossura: 640 pagine
Prezzo Listino: EUR 39,00
Prezzo Promozione: EUR 33,15 con Spedizione gratuita

26 Responses to “5. Introduzione al C”
1 Aprile 2011
filipposiiiii! i miei primi 3 programmi in C!
…”programmi”… 🙂
1 Aprile 2011
MacMomoNell’ultimo esempio le istruzioni all’interno della funzione duratadelmese() sono sbagliate, o comunque non hanno senso.
Viene usato l’operatore di assegnazione come se fosse quello di uguaglianza e questo potrebbe creare confusione ai lettori.
1 Aprile 2011
Ignaziocpurtroppo non ho ancora affrontato le funzioni stulla stringhe..non potevo mettere strcmp, sono sicuro avrebbe creato più confusione.
Quel pezzo di codice è da prendere più come pseudocodice che non come C reale.
1 Aprile 2011
MacMomoBeh, io l’avevo capito. 😉
Il mio dubbio era solamente se non poteva creare confusione in chi non conosce per niente la programmazione.
Negli altri esempio infatti il simbolo = viene usato per assegnare un valore, mentre in quel caso si usa per fare un confronto.
E dato che uno dei principali errori che capita a chi è alle prime armi col C è proprio quello di usare l’uguale per fare un contronto, non conviene che lo specifichi meglio?
1 Aprile 2011
Ignaziocti svelo un segreto, le prossime lezioni sono già quasi pronte e di questo problema ne ho parlato ampiamente 😛
lo vedrai con i tuoi occhi 😀
cmq grazie per i tuoi commenti.
ps: ma perchè ho un pony come avatar??? :O
1 Aprile 2011
MacMomoHo visto che gravatar al posto dell’indirizzo email, come identificatore, usa il suo MD5.
Forse è uno dei rari casi in cui due stringhe diverse danno lo stesso MD5. 😉
1 Aprile 2011
Rino Picardimumble mumble
..e perchè anche io un bel pony viola come gravatar? Non che mi dispiaccia, anzi.. chi non vorrebbe un bel pony viola come gravatar al giorno d’oggi ^^.. però..
non sarà mica un pesce d’Aprile che ci ha riservato gravatar ^^
PS: il mio è più bello U_U
1 Aprile 2011
gomoliakoio invece vedo un bel punto di domanda…
1 Aprile 2011
WuberoneBene, bel corso, divertente e preso a piccole dosi direi facilmente digeribile… Se imparerò bene questo linguaggio offro una birra da litro a Ignazio! 😉
2 Aprile 2011
EMjuriuso xCode 3.1.4
ho provato a compilare e viene visualizzato: Linking…….
“_main”, referenced from:
start in ctrl.10.5.o
symbol(s) not found
collect2: id returned 1 exit status
“Build failed (1 error)
….non ho idea di cosa sia il problema, suggerimenti? Con il primo “programmino” non avevo avuto difficoltà!
2 Aprile 2011
Matteo C.Ed io un kg di noccioline per accompagnarla 😀
2 Aprile 2011
IgnaziocCopia sul forum il testo esatto del file main.c , vediamo se hai commesso qualche errore.
2 Aprile 2011
manzo31Complimenti, ottimo lavoro!
2 Aprile 2011
EMjuripurtroppo l’errore resta o meglio: se mi limito a campilare “build” non vengono segnalati errori ma quando lo eseguo con “console” non succede niente, se invece compilo e salvo “build and save” vengono segnalati gli errori.
Ti segnalo inoltre che con il programma “età” mi viene segnalato un errore di sintassi per la “à” che ho risolto da solo con “a’ “.
ciao e grazie per l’aiuto
2 Aprile 2011
EMjuri…ho provato a sostituire il “nome_blocco” per esempio “somma_due_numeri” con “main”, in questo modo l’errore scompare e quando lo eseguo con “console” viene visualizzato:
” [Session started at 2011-04-02 15:25:45 +0200.]
The Debugger has exited with status 97.The Debugger has exited with status 97.”
ti è di aiuto per capire dov’è il problema?
2 Aprile 2011
ElanigiroIo ho provato a compilare il secondo programma (int somma_due_numeri(int numeroA, int numeroB) {
int risultato = numeroA + numeroB;
return risultato;
}) Ma il mio compilatore riporta l’errore (undefined reference to ‘WinMain@16’)
cosa significa e come potrei risolvere il problema???
ps:Ho notato che nel caso del primo programma la finestra del programma viene visualizzata solo per una frazione di secondo ho quindi aggiunto system(“PAUSE”); al fondo del testo, ho fatto bene???…esistono altri metodi???
Grazie in anticipo.
3 Aprile 2011
andrea90rmuhm c’è scritto “Ciascuna riga all’interno del blocco termina con un punto e virgola.” il che è da specificare meglio penso..se nel blocco del main usiamo appunto if\while\etc la ; non va messo a quella riga
3 Aprile 2011
ignaziocin effetti il concetto di “riga” in C non ha molto senso 😉
potrei scrivere
[code]
int a; char b;
[/code]
oppure
[code]
int
a;
char
b;
[/code]
In ogni caso tutto sarà più chiaro in seguito.
4 Aprile 2011
Ignaziocuna precisazione per tutti:
i blocchi di codice che ho scritto in questo articolo son ESEMPLIFICATIVI in ogni programma deve essere presente il blocco che si chiama main.
gli esempi alla fine della lezione (età, mesi etc) sono solo per essere letti e capiti, non possono essere compilati perchè contengono alcuni errori che al momento non abbiamo affrontato ma che affronteremo più avanti.
Ripeto, per tutti i problemi esiste il forum!!!
4 Aprile 2011
Alexprof continua così! 😉
22 Aprile 2011
matteocomplimrnti, ottimo approccio
27 Aprile 2011
Corso di programmazione in C - Le funzioni | devAPP[…] In questo articolo vorrei approfondire un concetto che in realtà abbiamo già trattato nella lezione 5, ma poi nelle successive lezioni è stato volutamente tralasciato. Sto parlando delle […]
30 Maggio 2011
Lucaciao ragazzi, sono ai primi passi con questo linguaggio e ho già riscontrato un problema….ho fatto uno screenshot per farmi capire meglio. Mi servirebbe capire quale é l’errore, io ho copiato esattamente il testo di questa guida per la somma di due numeri!
http://img24.imageshack.us/img24/2152/schermata20110530a22454.png
Grazie in anticipo
31 Maggio 2011
IgnaziocCome ho avuto modo di dire altre volte quel pezzo di codice non è funzionante, ma è un pezzo di codice di esempio per far capire qual è la struttura di un blocco C.
31 Maggio 2011
LucaGrazie mille e scusa il disturbo…
16 Agosto 2012
corradomi sto avvicinando (con il binocolo) alla programmazione.
non riesco a trovare una specie di legenda delle varie…diciamo parole.
cosa significa printf, int, main, ecc. ecc.
voi date per scontato queste cose ma sarebbe bello avere una guida che parte veramente dalle fondamenta.