Cos'è il C?

Il C è un linguaggio di programmazione compilato, imperativo e procedurale creato da Dennis Ritchie nei Bell Laboratories tra il 1969 e il 1973. Nasce per riscrivere il sistema operativo Unix.

Il C++ è una sua estensione creata da Bjarne Stroustrup nel 1979, che aggiunge la programmazione orientata agli oggetti (OOP), i template e molte funzionalità moderne.

⚡ Velocità

Il codice C/C++ è compilato direttamente in istruzioni macchina: è tra i linguaggi più veloci esistenti.

🔩 Basso livello

Accesso diretto alla memoria, controllo totale delle risorse hardware.

🌍 Portabilità

Lo stesso codice può girare su Linux, Windows, macOS con minimi adattamenti.

📦 Ubiquità

Usato in sistemi operativi, kernel, game engine, compilatori, firmware e embedded.

Struttura di un Programma C

Ogni programma C ha una struttura minima che devi conoscere a memoria:

C Struttura base di un programma C
/* Questo è un commento su una riga o più righe */
// Questo è un commento su una riga (stile C++)

#include <stdio.h>    // Libreria standard I/O

// La funzione main() è il punto di ingresso del programma
int main() {
    // Istruzione: stampa una riga a schermo
    printf("Hello, World!\n");

    // return 0 indica che il programma è terminato correttamente
    return 0;
}
Output
Hello, World!

Analisi riga per riga

ElementoSignificato
#include <stdio.h>Include la libreria standard per input/output (printf, scanf, ecc.)
int main()Punto di ingresso del programma. Restituisce un int al sistema operativo.
printf("...")Stampa testo sul terminale. Il \n è il carattere di nuova riga.
return 0Valore restituito al SO: 0 = successo, qualsiasi altro valore = errore.
Nota Le istruzioni in C terminano sempre con un punto e virgola ;. Dimenticarlo è uno degli errori più comuni per i principianti.

Compilazione ed Esecuzione

Il C non è interpretato: devi compilarlo per ottenere un eseguibile. Il compilatore più usato è GCC (GNU Compiler Collection).

Compilare con GCC

Bash Terminale — compilazione ed esecuzione
# Compila hello.c e crea l'eseguibile "hello"
gcc hello.c -o hello

# Esegui il programma
./hello

# Con opzioni utili (warning + standard C17)
gcc -Wall -Wextra -std=c17 hello.c -o hello

# Per C++
g++ -Wall -std=c++17 hello.cpp -o hello

Il processo di compilazione

1. Preprocessore

Sostituisce le direttive #include, #define, ecc.

2. Compilatore

Trasforma il codice C in assembly (.s).

3. Assembler

Converte l'assembly in codice oggetto (.o).

4. Linker

Unisce i file oggetto e le librerie nel file eseguibile finale.

Input e Output di Base

C printf e scanf — I/O fondamentale
#include <stdio.h>

int main() {
    int eta;
    char nome[50];

    printf("Come ti chiami? ");
    scanf("%s", nome);          // legge una stringa (senza spazi)

    printf("Quanti anni hai? ");
    scanf("%d", &eta);          // legge un intero (&eta = indirizzo)

    printf("Ciao %s, hai %d anni!\n", nome, eta);

    return 0;
}
Output
Come ti chiami? Mario
Quanti anni hai? 25
Ciao Mario, hai 25 anni!

Specificatori di formato

SpecificatoreTipoEsempio
%dIntero (int)printf("%d", 42)
%fDecimale (float/double)printf("%.2f", 3.14)
%cCarattere (char)printf("%c", 'A')
%sStringa (char[])printf("%s", "hello")
%ldLong intprintf("%ld", 123456789L)
%lfDouble (in scanf)scanf("%lf", &x)
Attenzione Con scanf, le variabili numeriche richiedono il simbolo & davanti (l'operatore "indirizzo di"). Le stringhe (char[]) no, perché il nome dell'array è già un puntatore.

Direttive del Preprocessore

C Direttive #define e #include
#include <stdio.h>
#include <math.h>    // Funzioni matematiche: sqrt, pow, sin, cos...

// Costanti definite con #define (NON sono variabili, non usano memoria)
#define PI 3.14159265
#define MAX_STUDENTI 30
#define QUADRATO(x) ((x) * (x))  // Macro con parametro

int main() {
    double raggio = 5.0;
    double area = PI * QUADRATO(raggio);

    printf("Area del cerchio: %.4f\n", area);
    printf("Max studenti: %d\n", MAX_STUDENTI);

    return 0;
}
Output
Area del cerchio: 78.5398
Max studenti: 30
Best Practice Preferisci const a #define per le costanti numeriche in C++ (sono tipizzate e più sicure). In C puro, #define è ancora lo standard per le costanti.
🏋️ Esercizi
Metti in pratica le nozioni apprese con questi esercizi progressivi.
1
Hello, nome!
Facile I/O Base

Scrivi un programma che chieda all'utente di inserire il suo nome e cognome (separati) e stampi: "Benvenuto, [Nome] [Cognome]! Il tuo programma funziona."

Usa due array char separati e due chiamate a scanf con %s.
CSoluzione
#include <stdio.h>

int main() {
    char nome[50], cognome[50];

    printf("Inserisci il nome: ");
    scanf("%s", nome);
    printf("Inserisci il cognome: ");
    scanf("%s", cognome);

    printf("Benvenuto, %s %s! Il tuo programma funziona.\n", nome, cognome);

    return 0;
}
2
Calcolatrice di area
Facile Math

Scrivi un programma che chieda base e altezza di un rettangolo e stampi l'area e il perimetro con 2 decimali.

Usa variabili double e il formato %.2f.
CSoluzione
#include <stdio.h>

int main() {
    double base, altezza;

    printf("Inserisci la base: ");
    scanf("%lf", &base);
    printf("Inserisci l'altezza: ");
    scanf("%lf", &altezza);

    double area = base * altezza;
    double perimetro = 2 * (base + altezza);

    printf("Area:      %.2f\n", area);
    printf("Perimetro: %.2f\n", perimetro);

    return 0;
}
3
Conversione temperatura
Medio Formula

Crea un programma che converta una temperatura da Celsius a Fahrenheit e Kelvin. Formula: F = C × 9/5 + 32, K = C + 273.15. Stampa tutti e tre i valori con 2 decimali.

Attenzione: scrivi 9.0/5.0 e non 9/5 (divisione intera!).
CSoluzione
#include <stdio.h>

int main() {
    double celsius;

    printf("Temperatura in Celsius: ");
    scanf("%lf", &celsius);

    double fahrenheit = celsius * (9.0 / 5.0) + 32.0;
    double kelvin     = celsius + 273.15;

    printf("Celsius:    %.2f °C\n", celsius);
    printf("Fahrenheit: %.2f °F\n", fahrenheit);
    printf("Kelvin:     %.2f K\n",  kelvin);

    return 0;
}
4
Informazioni personali formattate
Medio Formattazione

Chiedi all'utente: nome, età, altezza (in metri), peso (in kg). Calcola il BMI (peso / altezza²) e stampa tutte le informazioni in una scheda formattata con linee di separazione.

CSoluzione
#include <stdio.h>

int main() {
    char nome[50];
    int eta;
    double altezza, peso;

    printf("Nome:       "); scanf("%s",   nome);
    printf("Età:        "); scanf("%d",   &eta);
    printf("Altezza(m): "); scanf("%lf",  &altezza);
    printf("Peso(kg):   "); scanf("%lf",  &peso);

    double bmi = peso / (altezza * altezza);

    printf("\n================================\n");
    printf("  SCHEDA PERSONALE\n");
    printf("================================\n");
    printf("  Nome:    %s\n",   nome);
    printf("  Età:     %d anni\n", eta);
    printf("  Altezza: %.2f m\n",  altezza);
    printf("  Peso:    %.1f kg\n", peso);
    printf("  BMI:     %.1f\n",    bmi);
    printf("================================\n");

    return 0;
}
5
Macro e costanti
Difficile Preprocessore

Scrivi un programma che definisca con #define le costanti IVA (0.22) e SCONTO (0.10). Il programma legge il prezzo netto di un prodotto, calcola e stampa: prezzo scontato, IVA sul prezzo scontato, prezzo finale. Scrivi anche una macro MAX(a, b) e usala per trovare il prezzo più alto tra due prodotti.

CSoluzione
#include <stdio.h>

#define IVA     0.22
#define SCONTO  0.10
#define MAX(a, b) ((a) > (b) ? (a) : (b))

int main() {
    double prezzo1, prezzo2;

    printf("Prezzo netto prodotto 1: ");
    scanf("%lf", &prezzo1);
    printf("Prezzo netto prodotto 2: ");
    scanf("%lf", &prezzo2);

    // Prodotto 1
    double scontato1   = prezzo1 * (1.0 - SCONTO);
    double iva1        = scontato1 * IVA;
    double finale1     = scontato1 + iva1;

    // Prodotto 2
    double scontato2   = prezzo2 * (1.0 - SCONTO);
    double iva2        = scontato2 * IVA;
    double finale2     = scontato2 + iva2;

    printf("\n--- Prodotto 1 ---\n");
    printf("Prezzo scontato: %.2f\n", scontato1);
    printf("IVA (22%%):       %.2f\n", iva1);
    printf("Prezzo finale:   %.2f\n", finale1);

    printf("\n--- Prodotto 2 ---\n");
    printf("Prezzo scontato: %.2f\n", scontato2);
    printf("IVA (22%%):       %.2f\n", iva2);
    printf("Prezzo finale:   %.2f\n", finale2);

    printf("\nProdotto più costoso (finale): %.2f\n", MAX(finale1, finale2));

    return 0;
}