Guida di C (base)

Il primo programma

Evitiamo di perderci in lunghi (e forse inutili) preamboli: scrivo qui sotto il codice, in linguaggio C, con cui generalmente ogni programmatore da inizio alla sua carriera:

#include <stdio.h>

main()
{
	printf("Hello, world!\n");
}

Il programma, come si può intuire, esegue l'unica operazione di stampare a schermo la frase “Hello, world!”.

Potrebbe essere utile sapere che:

  • Le parentesi graffe possono essere prodotte in diversi modi:
    1. Alt Gr + Shift + è e Alt Gr + Shift + + (Linux, Windows XP e succ.)
    2. Alt Gr + 7 e Alt Gr + 0 (Linux)
    3. Alt + 123 e Alt + 125 (MS-DOS/Windows)
  • L'indentazione (ovvero lo spostamento laterale) dell'istruzione printf non è ottenuta con una sequenza di spazi, ma con il tasto Tab (il terzo tasto sopra il Ctrl di sinistra)
  • Il punto e virgola alla fine dell'istruzione printf non è un mio errore di battitura e va obbligatoriamente messo.

Compilazione ed esecuzione

Andiamo dunque a compilare ed eseguire il programma appena creato. Per fare questo dovrai fare uso del terminale.

Anzitutto spostati nella cartella in cui si è salvato il file, nel mio caso la cartella lavoro/c/, all'interno della mia home. La cartella home sulla shell in genere si sostituisce con una tilde (~). La tilde si produce con la combinazione Alt Gr + ì.

[dario@localhost ~]$ cd ~/lavoro/ c/
[dario@localhost c]$

Si può, eventualmente, verificare la presenza ed il nome del file che ci interessa elencando i files presenti nella cartella con il comando ls (list):

[dario@localhost c]$ ls 
hellow.c
[dario@localhost c]$

Ok, a questo punto per compilare il codice sorgente bisogna eseguire gcc, il compilatore, dandogli come parametro il nome del file in cui il codice è contenuto (ovvero il nome del file che abbiamo appena creato, quello che io ho chiamato hellow.c):

[dario@localhost c]$ gcc hellow.c
[dario@localhost c]$

Perfetto, il compilatore esegue il suo compito senza proferir verbo, e questo è sempre un buon segno, perché in genere il compilatore segnala all'utente tutti gli errori che ha commesso nello scrivere il suo codice...

Del resto, non avendo detto nulla, non si è neanche capito bene cosa sia successo... Una riguardata al contenuto della cartella può schiarire le idee:

[dario@localhost c]$ ls 
a.out hellow.c
[dario@localhost c]$

Ah, interessante, c'è un nuovo file: a.out. Questo è proprio il programma che è stato creato con il compilatore. Eseguiamolo:

[dario@localhost c]$ ./a.out
Hello, world!
[dario@localhost c]$

That's all folks!

Hello world inside

Ora viene il bello: vediamo di capire come opera il programma appena eseguito.

La parte più semplice se vogliamo è printf(), l'istruzione vera e propria che svolge l'operazione che desideriamo (stampare a schermo il contenuto delle parentesi):

printf("Hello, world!\n");

Questa linea di codice è una chiamata alla funzione printf().

printf() (il nome sta per print formatted, vedremo successivamente il perchè) è una funzione, ovvero una sorta di mini-programma che esegue operazioni semplici. printf() si occupa di scrivere sullo schermo tutto ciò che le viene passato come parametro.

Quando in un programma si vuole eseguire una funzione (come avviene in questo caso con printf()) è necessario inserire una chiamata alla funzione. Una chiamata di funzione è composta dal nome della funzione (printf) seguito da una coppia di parentesi tonde, all'interno delle quali sono posti gli eventuali parametri (nel nostro caso l'unico parametro è la frase da stampare a schermo). Come ogni altra istruzione C, anche la chiamata di funzione si conclude con un punto e virgola, che indica il termine dell'istruzione.

Sembrerebbe che tutto il lavoro del programma sia svolto da questa riga... Ma a che serve allora tutto il resto? Iniziamo dal'inizio:

#include <stdio.h>

Questa linea serve ad includere l'header della libreria stdio.h.

Una libreria è una raccolta di funzioni già scritte e compilate. La libreria stdio (Standard Input Output) contiene le principali funzioni per interagire con l'utente attraverso monitor e tastiera. Tra queste funzioni c'è, naturalmente, printf().

L'header di una libreria contiene le informazioni (non entriamo troppo nel dettaglio) che servono al compilatore per utilizzare la libreria in questione, e le funzioni in essa contenute.

Se non avessi scritto questa riga il compilatore sarebbe stato spiazzato dall'istruzione printf(), perchè non avrebbe saputo dove “andarsela a pescare”...

main()
{
...
}

Come già un po' si era capito, nel C tutte le istruzioni da eseguire sono raggruppate in funzioni. main() è la funzione principale (in inglese, appunto, main) di ogni programma, ovvero quella che viene chiamata per prima, nel momento in cui l'utente esegue il programma.

Attenzione a non confondere una definizione di funzione con una chiamata alla funzione: main() è una definizione, perché descrive, all'interno delle parentesi graffe le operazioni che la funzione esegue. Si noti che tra le parentesi tonde di main e le parentesi graffe non c'è il punto e virgola. Le chiamate invece servono ad eseguire funzioni già definite, all'interno del programma o in una libreria.

A questo punto va da se che ogni programma inizia automaticamente con una chiamata implicita alla funzione main.

Conclusioni

Per concludere, possiamo riassumere i concetti fondamentali contenuti in questo articolo:

  • Il C è un linguaggio strutturato a funzioni. Ogni funzione è una piccola routine che esegue operazioni semplici.
  • Le funzioni si possono trovare già pronte, raccolte in librerie, o possono essere definite dall'utente.
  • La funzione main() dev'essere obbligatoriamente definita dall'utente.
  • La libreria stdio.h contiene le funzioni fondamentali, tra cui printf(), per interagire con l'utente.
  • Il carattere di "ritorno a capo" (il tasto invio) non è considerato dal compilatore C. Infatti non è il ritorno a capo che termina le istruzioni, ma il punto e virgola. Inoltre per mandare a capo il testo è necessario utilizzare il codice \n.

Nei prossimi capitoli si affronteranno altri aspetti fondamentali della programmazione (condizioni, cicli, variabili...) e si approfondiranno le potenzialità di printf: stay tuned!

  1. Introduzione
  2. Preparare l'ambiente
  3. Il primo programma
  4. La funzione printf()
  5. Le variabili
  6. Input da tastiera
  7. Esecuzione condizionale: if
  8. Cicli
  9. Esempi
  10. Bibliografia