Come programmare in C
Sei affascinato dal mondo della programmazione e, visto che ultimamente hai un po’ di tempo libero da dedicarvi, hai deciso di imparare qualcosa in più in merito. Seguendo il consiglio di un tuo amico già esperto nel settore, hai scelto come punto di partenza il linguaggio C, sicuramente uno dei più versatili e tutt’oggi utilizzati sulla scena informatica.
Risoluto e deciso a portare avanti la tua idea, hai aperto il tuo ormai fidato amico Google e, cercando istruzioni su come programmare in C, sei finito dritto sulla mia guida, con la speranza di ottenere le informazioni necessarie su come iniziare a scrivere del codice funzionante. Ebbene, sono lieto di comunicarti che questo è proprio il posto che stavi cercando: nelle righe a venire, infatti, ti fornirò un’infarinatura generale sul linguaggio C, spiegandoti tutto quanto necessario per scrivere i primi programmi funzionanti.
Prima di andare avanti ed entrare nel vivo della questione, però, voglio farti un’importante premessa: la programmazione in C è un argomento piuttosto vasto, che sicuramente non entra completamente nella pagina che ti appresti a leggere. Anzi, ti dirò di più: non basterebbe l’intera struttura di questo sito per trattarlo in modo approfondito! Non temere, però, poiché sarà mia cura indirizzarti, nelle battute finali di questo tutorial, verso risorse utili e approfondimenti per arricchire, se lo vorrai, la tua conoscenza in merito. A questo punto, direi di mettere al bando le ciance e iniziare: non mi resta che augurarti buona lettura e buon divertimento!
Indice
- Informazioni preliminari
- Sintassi di base
- Controlli condizionali
- Le funzioni
- La funzione "speciale" main()
- Esempio di codice funzionante
- Come compilare ed eseguire un programma in C
- Risorse utili
Informazioni preliminari

Prima di buttarti a capofitto nell’apprendimento dei concetti di base per programmare in C, lascia che ti dia qualche informazione in più su questo linguaggio così potente. Innanzitutto, il C è un linguaggio imperativo procedurale, cioè che organizza il codice in una sequenza di istruzioni e funzioni, che vedremo più avanti nell’articolo. Inoltre, utilizza una sintassi vicina al linguaggio umano: in altre parole, una gran parte delle istruzioni esistenti in C prende origine dalla lingua inglese.
A differenza di numerosi linguaggi di programmazione ad oggi conosciuti, il linguaggio C non prevede l’utilizzo degli oggetti: ciascuna struttura dati complessa (ad es. array, strutture e qualsiasi altra entità che non rappresenti un tipo di dato primitivo) deve essere manualmente dichiarata e allocata in memoria. Tuttavia, alcuni “derivati” del C, come il C++, il C# o l’Objective-C, sono invece linguaggi a oggetti.
Come scoprirai più avanti in questa guida, il C è un linguaggio compilato: ciò significa che, prima di poter funzionare, il codice sorgente del programma scritto deve essere “tradotto” in linguaggio macchina da un software chiamato compilatore, che genera un file eseguibile in grado di essere elaborato dal processore e dall’hardware della macchina, grazie al coordinamento del sistema operativo.
In generale, il linguaggio C è estremamente flessibile e viene tutt’oggi utilizzato in un gran numero di scenari: ad esempio, è possibile utilizzare il C per costruire sistemi operativi, creare librerie dedicate ai giochi, effettuare complessi calcoli matematici e tanto altro ancora. Pensa che il rover Perseverance che è stato mandato su Marte dalla NASA e gran parte di Windows, Linux e macOS funzionano grazie a del codice scritto in C.
Se desideri capire meglio il ciclo di vita di un generico programma e approfondire i “passaggi” da effettuare per scriverne uno in modo efficiente, ti consiglio di dare un’occhiata al mio approfondimento su come creare un programma.
Sintassi di base

Allora, pronto a partire? Perfetto! Nelle sezioni a venire, intendo spiegarti i concetti di base della sintassi del linguaggio C, fornendoti le nozioni necessarie sulle componenti fondamentali di di quest’ultimo: così facendo, acquisirai le competenze necessarie per scrivere, in completa autonomia, un piccolo programma funzionante.
Innanzitutto, un programma in C viene scritto avvalendosi di uno o più file sorgenti, nei quali vengono specificate le istruzioni da eseguire per elaborare i dati nel modo scelto. A meno di non intervenire attraverso salti, condizioni o cicli di controllo speciali (te ne parlerò più avanti), il C utilizza un approccio sequenziale: ciò significa che, in linea generale, le istruzioni vengono eseguite nel medesimo ordine in cui sono specificate nel codice sorgente.
Statement

Lo statement è l’entità di base del linguaggio C: in parole povere, si tratta di un’istruzione completa che, in qualche modo, elabora dei dati. Uno statement in C termina sempre con un ; (punto e virgola o semicolon in inglese) e contiene un “comando” che può effettuare qualsiasi tipo di operazione: può addizionare due numeri, paragonare due stringhe di caratteri, richiamare una funzione, dichiarare o assegnare un valore a una variabile e molto, molto altro.
Tanto per farti un esempio, lo statement printf(“Ciao a tutti!”); contiene il comando per stampare a video la frase “Ciao a tutti”.
La direttiva #include

Come ti ho già detto, un programma in C può snodarsi su diversi file sorgenti: questo capita, in modo particolare, per tenere un certo ordine in progetti molto grandi. Digitare tutto in un solo file di decine di migliaia di righe di codice, potrebbe far impazzire anche il programmatore più paziente: sarebbe un’impresa soltanto effettuare la modifica di una singola istruzione!
Proprio per questo, il C prevede una speciale direttiva, tale #include, che viene specificata all’inizio di ciascun codice sorgente e comunica al compilatore gli altri file da “includere” nel programma in fase di compilazione. Tanto per farti un esempio, quasi tutti i programmi scritti in C iniziano con la direttiva #include <stdio.h>: in questo modo, è possibile utilizzare tutti i comandi C specificati nella libreria stdio.h (STanDard Input/Output), residente nel percorso di installazione del compilatore stesso.
La libreria stdio.h contiene le definizioni dei comandi di base e delle costanti, per permettere al programmatore la manipolazione dell’input/output, cioè di ciò che si vede sullo schermo (con printf), ciò che si acquisisce attraverso tastiera e mouse (con scanf) e per la gestione dei file.
Insieme a stdio.h, viene spesso inclusa nei codici sorgenti la libreria stdlib.h, anch’essa inclusa nell’ambiente di sviluppo C: questa contiene funzioni e costanti di carattere generale, tra cui le istruzioni da utilizzare per allocare la memoria e manipolare i dati presenti al suo interno.
La direttiva include può essere specificata in due modi: #include <libreria.h> denota l’inclusione di una libreria presente nell’ambiente di sviluppo predefinito, mentre #include “libreria.h” specifica l’inclusione di una libreria scritta dal programmatore e presente nella stessa cartella del file sorgente in cui è dichiarata.
Tipi di dati

Questo linguaggio è in grado di gestire e manipolare nativamente numerosi tipi di dati elementari, detti primitivi, che possono essere assegnati alle variabili necessarie per il funzionamento del programma, acquisiti come valori in input o resi come valori di output delle funzioni. Di seguito ti elenco i tipi di dati più utilizzati e le informazioni necessarie su ciascuno di essi.
- char – è il tipo di dati che denota un singolo carattere e occupa 8 bit in memoria. Per specificare una variabile di questo tipo, è sufficiente impartire lo statement char nomeVariabile;, mentre per le funzioni di input/output è necessario specificare il codice %c affinché il compilatore interpreti correttamente la variabile a cui si punta.
- int – questo tipo di dati denota i numeri interi. Lo spazio che occupa varia in base all’architettura del sistema operativo: con quelli a 64 bit a cui siamo abituati, un int occupa 32 bit di dati e può contenere valori che vanno da -2147483648 a +2147483647. È possibile specificare la dimensione dell’intero con il numero di bit che occupa: ad esempio,
int16occuperà 16 bit (quindi può rappresentare numeri da -32768 a +32767, mentreint8ne occuperà 8 (quindi può rappresentare numeri da -128 a +127). Nelle operazioni di input/output, l’identificatore generico è %i e accetta ogni tipo di input, anche numeri binari ed esadecimali, mentre %d accetta solo numeri espressi in base 10. - float e double – identificano i numeri in virgola mobile semplici e i numeri in virgola mobile doppi. Occupano rispettivamente 32 e 64 bit di dati e possono rappresentare decimali con precisione di 6 cifre (float) e di 10 cifre (double). Gli identificatori da assegnarvi sono %f e %fd.
- bool – identifica i valori binari come Vero/Falso (True/False in inglese) o 1/0. Viene utilizzato per il controllo dell’esecuzione delle istruzioni. Per usarlo, è necessario includere la relativa libreria col comando
#include <stdbool.h>. - void – in C, questo tipo di dati identifica il non valore, cioè un’entità che non occupa alcuno spazio in memoria. In genere, il void viene specificato come valore di output o come input nelle funzioni che non lo prevedono (come a voler dire al compilatore “fai attenzione, questa funzione o questa operazione non restituiscono o non accettano valori”).
Definizione di variabili

Sono sicuro che, in qualche modo, conosci già il concetto di variabile: volendo formalizzarlo, una variabile altro non è che un “contenitore”, salvato in memoria, che contiene valori che possono essere modificati durante il flusso di esecuzione di un programma.
Prima di andare avanti, vorrei specificare la differenza tra la dichiarazione di una variabile e la sua definizione o assegnazione: nel primo caso, si avvisa il compilatore che bisogna allocare una porzione di memoria per contenere dei dati; nel secondo caso, invece, si va a riempire la memoria con i dati richiesti. È possibile dichiarare una o più variabili senza definirle, ma non è possibile definire una o più variabili senza dichiararle (il compilatore, in tal caso, non saprebbe dove piazzare i dati in memoria).
Dichiarare una variabile in C è semplicissimo: basta digitare uno statement che specifichi il tipo di dato che la variabile deve contenere, il suo nome e, se necessario, il valore iniziale (specificato con l’operatore di assegnazione =). Per esempio, puoi dichiarare una variabile intera vuota attraverso lo statement int variabile; oppure assegnarle il valore iniziale di 10 scrivendo int variabile = 10; .
Una volta dichiarata una variabile, è possibile manipolarla nelle parti successive del codice utilizzando l’assegnazione con l’operatore = (ad es. variabile = 51;), gli operatori di incremento, di decremento e tutto quanto previsto dal tipo di dati specificato. Tieni sempre ben presente che, per essere utilizzata, una variabile deve essere necessariamente dichiarata in una parte precedente del codice: il C, come ti ho spiegato, è un linguaggio sequenziale, dunque non puoi chiedere a uno statement di operare su un dato che non conosce!
In genere, in C è possibile riferirsi alle variabili in due modi differenti: per le operazioni di assegnazione tramite l’operatore = o le funzioni di manipolazione dell’output. Ad esempio con printf(), si utilizza semplicemente il suo nome: printf(“%i”, variabile); oppure pippo = somma(a,b); . Se, invece, bisogna scrivere dati in una variabile utilizzando determinate funzioni di manipolazione dell’input, come ad esempio la funzione scanf(), è necessario farvi riferimento attraverso un puntatore al contenuto in memoria: per farlo, è sufficiente anteporre al nome della variabile il carattere &, ad esempio scanf(“%i”, &variabile); .
Operatori principali

Come negli altri linguaggi, anche la programmazione in C richiede l’utilizzo degli operatori, cioè di caratteri che, all’interno di uno statement, vanno ad eseguire delle operazioni (aritmetiche, relazionali, ecc.) tra gli operandi. Il linguaggio C prevede un gran numero di operatori per la gestione dei più disparati casi: il più importante è l’operatore di assegnamento, cioè =, che permette di assegnare un valore (o un’espressione) a una variabile o una serie di variabili. Per esempio, digitare int a = 1+2+3+4; significa dichiarare una variabile intera a e attribuirle il valore iniziale di 10.
Oltre all’operatore di assegnamento, esistono numerosi altri operatori in C: essi si dividono in quattro categorie ben distinte, che mi accingo a spiegarti di seguito.
- Operatori aritmetici – permettono l’esecuzione di operazioni aritmetiche: il + denota l’addizione, il – la sottrazione, il * la moltiplicazione, il / la divisione, il ++ l’incremento di uno (può essere posto a destra o a sinistra della variabile da incrementare), il — il decremento di uno (stessa regola precedente) e, infine, il % “modulo” restituisce il resto della divisione intera tra i valori.
- Operatori relazionali – sono utili per mettere in relazione un valore rispetto all’altro, e sono: > e < (maggiore/minore), >= e <= (maggiore/minore uguale a), == e != (uguale e diverso). Essi si basano sul concetto di vero/falso: per esempio, in uno statement, l’espressione var = 10>5 assegna a var il valore true o 1, poiché il numero 10 è maggiore del numero 5.
- Operatori logici – seguono lo stesso approccio vero/falso visto poc’anzi, ma vengono utilizzati per confrontare il collegamento tra due relazioni, tipico dell’algebra booleana. Essi sono && (AND logico), || (OR logico) e ! (NOT logico).
- Operatori bit a bit – essi permettono di intervenire sui singoli byte dei tipi di dato char e int, effettuando esclusioni, spostamenti a destra/sinistra e confronti. Principalmente, questi vengono impiegati nella scrittura di moduli per sistemi operativi o di driver di periferica, in quanto permettono di intervenire singolarmente sui byte (o sulle word di file scritti in assembly).
Controlli condizionali
Anche se il C è un linguaggio sequenziale, esistono dei comandi che permettono di modificare il flusso di esecuzione del programma, modificandone l’ordine al verificarsi (o non verificarsi) di determinate condizioni: queste direttive prendono l’ordine di controlli condizionali. Nelle righe a venire ti illustro i più utilizzati.
If/else

Se mastichi un po’ di inglese, ti sarà semplice comprendere del controllo condizionale if: impartire questa istruzione significa comunicare al programma che “se si verifica una precisa condizione, allora esegui questa/e istruzione/i”. Sintatticamente, il controllo si presenta nella forma
if (condizione) {
istruzioni
}Se lo desideri, puoi specificare un’ulteriore condizione avvalendoti della clausola else: unita all’if, essa permette infatti di astrarre il concetto “se si verifica una precisa condizione, allora esegui queste istruzioni, altrimenti (else) esegui queste altre”.
if (condizione) {
istruzioni
} else {
altre istruzioni
}Puoi esprimere la condizione avvalendoti degli operatori che restituiscono risultati di tipo true/false, cioè quelli logici e quelli relazionali, come nell’esempio riportato nell’immagine sopra.
Se necessario, puoi “arricchire” il costrutto visto poc’anzi con la clausola else if: sintatticamente simile all’if, essa permette di specificare ulteriori condizioni specifiche da prendere in considerazione, come spiegato di seguito.
if (condizione1) {
istruzioni per gestire condizione1
}
else if (condizione2) {
istruzioni per gestire condizione2
}
else {
istruzioni per gestire tutti gli altri scenari possibili
}Switch/case

Il controllo condizionale switch/case, come quello visto in precedenza, può influenzare l’esecuzione sequenziale delle istruzioni presenti nel codice sorgente di un programma. Sebbene il suo funzionamento sia simile a quello dell’if/else (cioè “saltare” a un certo insieme di istruzioni al verificarsi di determinate condizioni), viene utilizzato in scenari abbastanza differenti: lo switch/case, infatti, è adatto nelle decisioni dipendenti dal valore di una variabile e non da un’operazione booleana. Nel linguaggio umano, puoi intenderlo un po’ come “salta al caso (case) X se la variabile da analizzare (switch) assume il valore X, altrimenti esegui l’operazione predefinita (default)”.
Al termine di ogni set di istruzioni per la gestione dei vari casi, è fondamentale specificare la clausola break per uscire dal ciclo di esecuzione e non bloccare il programma in un loop infinito, cioè in una condizione dalla quale non è in grado di uscire.
È possibile utilizzare lo switch/case nel caso di gestione dell’input da tastiera: il programma esegue istruzioni diverse in base alla pressione del tasto scelto. Per esempio, questo estratto di codice potrebbe essere utilizzato per un programma che offre più funzioni contemporaneamente, variabili in base all’input da tastiera (in questo caso, all’utente viene chiesto di digitare le lettere a o c per scegliere la funzionalità desiderata).
char scelta;
printf("Scegli la funzione da utilizzare - a per aprire un file, c per chiuderlo\n");
scanf(%c, &scelta); // input da tastiera
switch(scelta) {
case 'a':
istruzioni per aprire un file;
break;
case 'c':
istruzioni per chiudere un file;
break;
default
printf("Comando non riconosciuto!");
break;
}
Le funzioni

In C, è fondamentale il concetto di funzione: per definizione, una funzione è una parte di codice che esegue l’algoritmo necessario a ottenere il risultato desiderato. In altre parole, la funzione è l’insieme di statement atti a manipolare i dati in ingresso e produrre dati in uscita che siano in linea con le necessità del programmatore.
In C, le funzioni possono essere sia dichiarate che definite: nel primo caso, si “avvisa” il compilatore dell’esistenza della funzione così da permettergli la predisposizione delle varie zone di memoria, mentre nel secondo caso si specificano gli statement necessari all’elaborazione dei dati.
Il valore che la funzione deve restituire è espresso attraverso la clausola return, specificata subito prima della fine del codice della funzione stessa; tutti gli statement che ne fanno parte, inoltre, devono essere racchiusi tra due parentesi graffe. Dopo essere stata dichiarata e definita, la funzione può essere utilizzata in qualsiasi altra parte del codice sorgente, specificando ove necessario gli eventuali valori d’ingresso e, se richiesto, assegnando il valore di uscita a una variabile.
Ecco un esempio in cui una funzione viene prima dichiarata e poi definita.
int somma(int a, int b);
int somma(int a, int b) {
return a+b;
}Una funzione può essere dichiarata poi usata nel programma, a patto che nel file stesso prima o poi venga definita, sennò il compilatore darà errore perché non vede la funzione.
La funzione “speciale” main()

Ora che hai tutte le nozioni di base di questo linguaggio, è arrivato il momento di spiegarti il funzionamento di una funzione piuttosto speciale, quella da cui parte l’esecuzione di ogni codice sorgente in C: la funzione main. Essa rappresenta il flusso di esecuzione principale di un codice sorgente e contiene tutte le istruzioni necessarie a elaborare i dati richiesti dal programmatore. In altre parole, la funzione main è il “motore” di un programma C, che permette di eseguire il codice scritto dal programmatore.
Al suo interno possono essere utilizzati tutti gli elementi che abbiamo visto fino ad ora. Una funzione main non deve essere dichiarata, ma deve essere definita direttamente all’interno del codice.
A questo punto, è assolutamente semplice intuire che un codice sorgente C, affinché possa essere eseguito, deve contenere una sola funzione main. In linea del tutto generale, la funzione main restituisce un valore intero (che viene utilizzato, di solito, per la gestione degli errori di esecuzione) e non prende valori in ingresso.
Ecco un tipico esempio di codice dove, come accade solitamente, una funzione viene dichiarata all’inizio del file, poi viene richiamata all’interno del main e infine viene definita dopo tutto il resto del codice.
int somma(int a, int b);
int main(void) {
int x = 5, y = 6, z;
z = somma(x, y);
printf("Il valore finale è %i", somma);
return 0;
}
int somma(int a, int b) {
return a+b;
}Esempio di codice funzionante

Ora che conosci tutte le informazioni di base su questo affascinante linguaggio, dovresti essere perfettamente in grado di metterle insieme e scrivere un piccolo programma funzionante. Il primo esempio che voglio illustrarti è il classico “Hello World”, cioè un programma che altro non fa che stampare a video il saluto “Ciao, mondo!”. Di seguito ti mostro il codice sorgente HelloWorld.c, che andrà poi compilato per diventare un file pronto per l’esecuzione.
#include <stdio.h> // include le funzioni definite nella libreria di standard I/O, tra cui printf()
int main(void) { // dichiarazione della funzione main
printf("Ciao, mondo!\n"); // funzione che stampa a video un testo ricevuto come parametro
return 0; // dichiara il valore di output del main (il valore 0 denota la terminazione con successo)
}Il testo scritto dopo i caratteri // è un commento e viene ignorato dal compilatore in quanto serve solo al programmatore per spiegare il funzionamento del codice.
Sei riuscito a comprendere a fondo il codice illustrato poc’anzi? Ottimo! Allora, come prova aggiuntiva, vorrei proporti un secondo codice sorgente (da chiamare, per esempio, calc.c), leggermente più complesso, che simuli il comportamento di una calcolatrice molto elementare.

In esso, la funzione main si occuperà di raccogliere i dati e darli “in pasto” a una delle quattro funzioni progettate per eseguire le operazioni principali (addizione, sottrazione, moltiplicazione e divisione). Infine, sarà sempre il main a occuparsi di mostrare il risultato finale.
#include <stdio.h>
#include <stdlib.h>
// Dichiarazione delle funzioni per eseguire le operazioni
int addizione(int a, int b);
int sottrazione (int a, int b);
long moltiplicazione (int a, int b);
float divisione (float a, float b);
int main(void) {
// dichiarazione delle variabili da usare nel main
int val1, val2, ris1;
long ris2;
float val3, val4, ris3;
char operazione;
printf("Quale delle quattro operazioni vuoi eseguire?\n");
printf("Per fare un'addizione, premi +\n");
printf("Per fare una sottrazione, premi -\n");
printf("Per fare una moltiplicazione, premi *\n");
printf("Per fare una divisione, premi /\n");
scanf("%c",&operazione); //lettura dell'input da tastiera
switch(operazione) { // switch/case che controlla l'operazione da eseguire
case '+':
printf("Digita i valori da addizionare, separati da uno spazio\n");
scanf("%i %i", &val1, &val2);
ris1 = addizione(val1, val2);
printf("Il risultato dell'operazione e' %i \n", ris1);
break;
case '-':
printf("Digita i valori da sottrarre, separati da uno spazio\n");
scanf("%i %i", &val1, &val2);
ris1 = sottrazione(val1, val2);
printf("Il risultato dell'operazione e' %i \n", ris1);
break;
case '*':
printf("Digita i valori da moltiplicare, separati da uno spazio\n");
scanf("%i %i", &val1, &val2);
ris2 = moltiplicazione(val1, val2);
printf("Il risultato dell'operazione e' %ld \n", ris2);
break;
case '/':
printf("Digita i valori da dividere, separati da uno spazio\n");
scanf("%f %f", &val3, &val4);
if (val4 == 0)
printf("Impossibile dividere per 0\n");
else {
ris3 = divisione(val3, val4);
printf("Il risultato dell'operazione e' %f \n", ris3);
}
break;
default:
printf("Scelta non valida!\n");
break;
}
return 0;
}
// Definizione delle funzioni per eseguire le operazioni
int addizione(int a, int b) {
return a+b;
}
int sottrazione(int a, int b) {
return a-b;
}
long moltiplicazione (int a, int b){
return a*b;
}
float divisione (float a, float b) {
return a/b;
}Scommetto che sei riuscito a capire alla perfezione il funzionamento di questo programma, ma non hai idea di come eseguirlo per testarlo? No problem, nei prossimi capitoli ti mostrerò le soluzioni più semplici per farlo!
Come compilare ed eseguire un programma in C
Dopo aver acquisito le nozioni di base sul linguaggio C, è arrivato il momento di passare alla pratica e capire come compilare ed eseguire un programma in C utilizzando i vari sistemi operativi!
Come programmare in C su Windows

In Windows, per trasformare un codice sorgente C in un programma funzionante, c’è bisogno di installare un ambiente di sviluppo integrato (detto IDE, Integrated Development Environment) chiamato Visual Studio: esso permette di compilare il codice sorgente ed eseguirlo sia all’interno del programma stesso, sia usando il blocco note.
Per scaricarlo, collegati alla pagina Internet del programma, pigia sul pulsante Download gratuito residente nel riquadro Visual Studio Community, avvia il file scaricato, dopodiché pigia sul pulsante Continua, imposta il segno di spunta accanto alla voce Sviluppo di applicazioni desktop con C++ nella finestra proposta, ripeti l’operazione con la voce Supporto C++/CLI collocata nel riquadro destro e, per terminare, clicca sul pulsante Installa, per poi chiudere la finestra di setup al termine della procedura.

Adesso richiama il Blocco Note dalla cartella Accessori Windows del menu Start (a cui puoi accedere cliccando sul pulsante a forma di bandierina collocato in basso nella barra delle applicazioni), digita nel blocco note il codice del tuo programma e, per procedere al salvataggio, clicca sul menu File collocato in alto a sinistra e seleziona da esso la voce Salva con nome…. Fatto ciò, seleziona la voce Tutti i file dal menu a tendina Salva come, annesso alla schermata di salvataggio che va ad aprirsi, digita il nome del tuo programma, seguito dall’estensione .c (ad es. calc.c), nella casella Nome file, per poi salvarlo sul Desktop.
Per compilare il codice sorgente appena creato, clicca sul menu Start, vai nella cartella Visual Studio e avvia Developer Command Prompt for VS 20xx: digita al suo interno i comandi cd %USERPROFILE%\Desktop e cl nomeProgramma.c, entrambi seguiti dal pulsante Invio, per poi avviare il programma appena creato sul desktop (ad es. calc.exe) con un doppio clic.

Se, invece, vuoi sapere come programmare in C su Visual Studio sfruttando direttamente l’IDE di casa Microsoft, allora avvialo dal menu Start e seleziona Crea un nuovo progetto. Tra i modelli presenti, scegli Progetto vuoto, Avanti, dai un nome al tuo progetto (ad es. Calcolatrice) e clicca su Crea. Fai clic destro su File di origine nel pannello Esplora soluzioni situato a destra, poi seleziona Aggiungi, Nuovo elemento… e scrivi il nome del file modificando l’estensione da .cpp a .c (ad es. calc.c) poi clic su Aggiungi. Copia il codice di esempio che ho scritto nel capitolo precedente nell’editor di testo di Visual Studio e salvalo cliccando sull’icona del floppy disk o selezionando File in alto a sinistra e Salva calc.c.
A questo punto clicca su Compilazione nella barra dei menu in alto e Compila soluzione. Se dovesse darti degli errori e degli avvertimenti (detti warning) riguardo agli scanf, inserisci il seguente statement all’inizio del file, prima degli #include.
#define _CRT_SECURE_NO_WARNINGS
Infine, salva e compila nuovamente e clicca sull’icona col triangolo verde in alto senza la scritta affianco (se posizioni il puntatore del mouse senza cliccare vedrai la dicitura Avvia senza eseguire debug (CTRL+F5)) per far eseguire, o runnare in gergo, il programma. Visual Studio è pensato per programmi scritti in C++ e C#, ma con questo escamotage si possono far girare anche programmi scritti in C. Se vuoi una soluzione alternativa, ti consiglio di consultare il metodo che ti propongo nel capitolo su Visual Studio Code.
Quando ti cimenterai a scrivere i tuoi programmi, ti consiglio di leggere con attenzione gli eventuali messaggi d’avviso restituiti dal compilatore: questi, nella maggior parte dei casi, sono un’ottimo punto di partenza per localizzare e correggere eventuali errori presenti nel tuo programma.
Come programmare in C su Mac

Per compilare ed eseguire un programma in C su Mac bisogna solo fare una veloce installazione tramite riga di comando: vai nel menu delle app di macOS, clicca sulla cartella Altro e apri il Terminale. Ora bisogna installare il compilatore: nel terminale scrivi il comando gcc e dai l’invio. Nel Dock in basso a destra fai clic sull’icona con la freccia blu (Install Command Line Developer Tools). Seleziona Installa, Accetta, attendi la fine dell’installazione e fai clic su Fine.
Ora che il necessario è installato, digita il comando cd ~/Desktop: per scrivere il carattere speciale ~ (chiamata Tilde), premi la combinazione di tasti Option + 5. Poi premi il tasto Invio e digita il comando touch nomeprogramma.c (ad es. calc.c), sempre seguito da Invio, per creare un file nella cartella Desktop.
A questo punto, lasciando il Terminale aperto (o riducendolo a icona), fai doppio clic sul file .c così creato sul Desktop, copia al suo interno il codice del programma di esempio e salva il file. Per compilarlo, richiama il Terminale e digita il comando gcc nomeprogramma.c -o nomeprogramma seguito dalla pressione del tasto Invio e, per eseguirlo, impartisci il comando ./nomeprogramma, sempre premendo successivamente Invio. Ora non ti resta che seguire le istruzioni che ti vengono fornite dal programma di esempio.
Come programmare in C su Linux

Anche ogni distribuzione Linux, come Ubuntu e Linux Mint ad esempio, è nativamente predisposta alla compilazione di programmi scritti in C e, al contrario di macOS, può farlo senza dover installare alcun componente aggiuntivo. Dunque, se ti stai chiedendo come programmare in C su Ubuntu o su altre distribuzioni Linux, fai clic di destro sul desktop e, nel menu contestuale che si apre, seleziona Apri nel terminale. Da questo punto in poi i comandi sono gli stessi del Mac, quindi puoi seguirli a partire dal comando touch.
Se ti è saltato fuori qualche strano errore riguardo gcc, può essere che la distribuzione Linux che usi non lo abbia già preinstallato: puoi installarlo comodamente tramite terminale col comando sudo apt install gcc (nelle distribuzioni della famiglia Debian/Ubuntu) o sudo dnf install gcc (nelle distribuzioni della famiglia RedHat/Fedora).
Come programmare in C con Visual Studio Code

Visual Studio Code è un editor di testo ricco di funzionalità sviluppato da Microsoft che ha il pregio di essere multipiattaforma, quindi è possibile usarlo su Windows, Mac e Linux. Inoltre mette a disposizione una grande quantità di estensioni per scrivere al meglio il codice dei più noti linguaggi di programmazione, tra cui C. Per scaricarlo puoi seguire il procedimento che ho scritto nel mio articolo dedicato.
Se stai usando Windows, dato che non supporta nativamente la compilazione di programmi in C, devi installare un compilatore. Vai sul sito ufficiale di Mingw, fai clic su Downloads a sinistra, poi su Pre-built Toolchains e seleziona la voce MinGW-W64-builds. Ora clicca su GitHub e nella sezione Assets scegli la voce Source code (zip). Finito il download, estrai il contenuto della cartella compressa, apri il file README.md e apri il link dello strumento di installazione grafico. Nella pagina web partirà il download di mingwInstaller.exe. A questo punto apri il file e clicca Next per due volte, seleziona l’architettura del tuo pc (se non sei sicuro se sia a 32 o 64 bit, segui queste istruzioni per scoprirlo) poi premi Next, copia il percorso di installazione che ti servirà dopo e continua con Next, Process e Finish per concludere l’installazione.

Adesso bisogna aggiungere Mingw alle variabili di sistema di Windows: nel menu Start scrivi Modifica variabili di ambiente per l’account e selezionalo. Nella sezione Variabili di sistema fai clic su Path, Modifica…, Nuovo e incolla il percorso precedentemente copiato aggiungendo \bin alla fine. Clicca su OK per confermare la modifica. Infine, riavvia il computer.
Ora che è tutto pronto, puoi iniziare ad usare Visual Studio Code! I prossimi passaggi valgono anche per Mac (dopo aver installato gcc col metodo visto prima) e Linux. Apri VS Code e clicca sull’icona coi due fogli in alto a sinistra chiamata Explorer e clicca su Open Folder: scegli la cartella in cui vuoi mettere il file scritto in C e dai l’Ok. Se ti viene chiesto, seleziona Yes, I trust the authors per abilitare tutte le funzionalità di VS Code.
A questo punto fai clic di destro in un punto vuoto della scheda Explorer, seleziona New File… e nominalo come preferisci (ad es. calc.c). Copia al suo interno il codice del programma di esempio e salvalo con Ctrl + S (o Command + S su Mac). In basso a destra, ti verrà chiesto di installare l’estensione chiamata C/C++ Extension Pack: fai clic su Install, ti servità per avere comode funzionalità e per runnare il programma. Se non dovessi vedere la notifica, puoi installare l’estensione manualmente cliccando sull’icona con le scatole situata a sinistra (chiamata Extensions), cerca C/C++ Extension Pack, seleziona l’estensione di Microsoft e fai clic su Install.
Infine, fai clic sulla freccina accanto all’icona col tasto Play in alto a destra e scegli la voce Run C/C++ File: quando ti verrà chiesto quale compilatore usare puoi selezionare C/C++: gcc. Il file verrà compilato ed eseguito nella finestra di VS Code che apparirà in basso, mostrando ciò che ti viene chiesto dal programma (se non lo vedi, assicurati di cliccare sulla scheda Terminal).
Risorse utili

Ora che disponi di tutte le nozioni fondamentali del caso e che hai un’idea ben chiara di come programmare in C, sei perfettamente in grado di valutare se questo è il linguaggio di programmazione che fa per te. In caso affermativo, come ti avevo promesso all’inizio di questo tutorial, vorrei indirizzarti verso ulteriori risorse utili che possano aiutarti a migliorare ulteriormente il tuo approccio con il linguaggio in questione, oltre che accrescere le tue conoscenze e aiutarti ad acquisire ulteriori competenze specifiche in merito.
- Notepad++ – uno dei più piccoli e flessibili editor per scrivere (e indentare correttamente) file sorgenti in linguaggio C in ambiente Windows. Supporta numerosi linguaggi di programmazione.
- Eclipse – è un intero framework di programmazione, utile a organizzare e tenere ordinati progetti anche particolarmente complessi. Supporta tutti i tipi di file previsti da programmi scritti in C (file sorgenti, file oggetti, header, librerie e quant’altro) e permette, se necessario, di creare grafici UML e file di guida.
- Guida a C di HTML.it – è sicuramente un’ottima risorsa gratuita. Tra le pagine di questa preziosa guida, accessibile liberamente da chiunque e senza registrazione alcuna, puoi trovare approfondimenti e lezioni mirate a raffinare le tue abilità da programmatore C.
- Linguaggio C – Principi di programmazione e manuale di riferimento (Kernighan/Ritchie) – è indubbiamente uno dei migliori testi su cui approfondire la propria conoscenza del C, noto agli esperti del settore come il “K&R” (dalle iniziali degli autori). Strutturato in due parti, questo testo offre inizialmente istruzioni su come approcciare al linguaggio in questione, per poi trasformarsi in un vero e proprio manuale che ne definisce tutte (o quasi) le funzioni utilizzabili nei molteplici scenari previsti. I due autori, Kernighan e Ritchie, sono coloro che hanno progettato e sviluppato l’intero linguaggio C.
- C/C++ Programmer’s Reference (Schildt) – a mio avviso, uno dei testi più completi relativi al linguaggio C, da tenere assolutamente sulla scrivania se si intende approcciare a questo linguaggio per uso professionale. Adatto principalmente a utenti più o meno avanzati, contiene numerosi esempi relativi alle funzioni più utilizzate. Questo manuale può essere utilizzato anche da chi, invece, ha deciso di orientarsi verso la versione “a oggetti” del linguaggio C, il C++.
In qualità di affiliati Amazon, riceviamo un guadagno dagli acquisti idonei effettuati tramite i link presenti sul nostro sito.

Autore
Salvatore Aranzulla
Salvatore Aranzulla è il blogger e divulgatore informatico più letto in Italia. Noto per aver scoperto delle vulnerabilità nei siti di Google e Microsoft. Collabora con riviste di informatica e cura la rubrica tecnologica del quotidiano Il Messaggero. È il fondatore di Aranzulla.it, uno dei trenta siti più visitati d'Italia, nel quale risponde con semplicità a migliaia di dubbi di tipo informatico. Ha pubblicato per Mondadori e Mondadori Informatica.
