Salta al contenuto
Note per Studenti Dal Python al C

Dal Python al C

In questa pagina 6
In questa pagina 5

Primo programma

ciao.cc
#include <stdio.h>

int main(void) {
    int n = 3;
    printf("Ciao, %d volte\n", n);
    return 0;
}
> gcc -Wall -Wextra -std=c11 -o ciao ciao.c
> ./ciao
Ciao, 3 volte

Definizione (struttura di un programma C)

  • Il programma inizia sempre da main. Il valore restituito arriva al sistema operativo: 0 = terminato correttamente.
  • Le istruzioni finiscono con ;, i blocchi stanno tra { }; l'indentazione serve solo alla leggibilità.
  • Commenti: // fino a fine riga e /* su più righe */.
  • #include <stdio.h> inserisce le dichiarazioni della libreria di input/output (printf, scanf, ...).

Esempio. Il programma ciao.c stampa Ciao, 3 volte e restituisce 0 al sistema operativo.

Dal sorgente all'eseguibile

Definizione (dal sorgente all'eseguibile)

  1. Preprocessore: esegue le direttive # (#include copia il file indicato, #define sostituisce testo). Lavora sul testo, non conosce il C.
  2. Compilatore: traduce ogni file .c in codice macchina (file oggetto .o) e controlla sintassi e tipi.
  3. Linker: unisce i file oggetto e le librerie in un unico eseguibile.

Esempio. gcc -c ciao.c produce l'oggetto ciao.o; gcc -o ciao ciao.o lo collega alle librerie nell'eseguibile ciao.

Errori di compilazione (sintassi, tipi, variabile non dichiarata) bloccano la generazione dell'eseguibile; i warning non la bloccano ma quasi sempre indicano un bug: compilare con -Wall -Wextra e correggerli tutti. Errori di link (undefined reference to ...): funzione dichiarata ma non definita o libreria mancante (es. -lm per math.h su Linux).

Differenze fondamentali con Python

Definizione (differenze fondamentali tra Python e C)

Python C
Variabile nome legato a un oggetto cella di memoria di tipo fisso, contiene direttamente il valore
Dichiarazione nessuna obbligatoria prima dell'uso: int x;
Valore iniziale assegnamento obbligatorio variabile locale non inizializzata contiene un valore indeterminato
Controlli a run-time indici, tipi, overflow: eccezioni quasi nessuno: errori silenziosi o crash (comportamento indefinito)
Stringhe tipo str array di char terminato da '\0'
Booleani bool int (0 falso, diverso da 0 vero); bool con <stdbool.h>
Liste list dinamica array di dimensione fissa
Output print(x) printf("%d\n", x) con formato esplicito
Memoria automatica stack automatico; heap con malloc/free

Esempio. In C int x = 3.9; mette 3 in x; in Python x = 3.9 lega x a un float.

c
int x;          /* dichiarazione: x esiste ma il suo valore è indeterminato */
x = 5;          /* assegnamento */
int y = x * 2;  /* dichiarazione con inizializzazione */
const double PI = 3.14159;   /* costante */
#define N 100                /* costante del preprocessore (sostituzione testuale) */

Assegnare a x un valore di altro tipo lo converte al tipo di x (int x = 3.9; mette 3), non cambia il tipo della variabile.

printf di base

Definizione (printf e specificatori di formato). printf(formato, valori...): il formato contiene testo e specificatori che devono corrispondere, per numero e tipo, ai valori passati.

Specificatore Tipo
%d int
%ld long
%u unsigned int
%f (%.2f) double (anche float, promosso)
%c char
%s stringa (char *)
%p puntatore
%x intero in esadecimale
%% il carattere %

Esempio. printf("%d %.2f %c %x\n", 42, 3.14159, 'A', 255); stampa 42 3.14 A ff.

Dettagli e scanf in Input e output in Cprintf con larghezza e precisione, scanf con indirizzi e valore di ritorno, lettura di righe con fgets, file con FILE*, fopen, fclose, fprintf, fscanf, controllo degli errori e della fine del file.Input e output in C →.

Mappa degli argomenti

Gli stessi concetti visti in Python, in C:

Errori tipici

  • Dimenticare ; o una }: l'errore viene segnalato spesso alla riga successiva.
  • Ignorare i warning del compilatore.
  • Usare una variabile non inizializzata: il programma compila e produce valori casuali.
  • Specificatore di printf che non corrisponde al tipo (%d con un double): output privo di senso.

Versione ripasso

Struttura e compilazione

  • Il programma parte da main (ritorna 0 se ok). Istruzioni con ;, blocchi con { }.
  • Compilazione: 1. Preprocessore (direttive #, es. #include, #define); 2. Compilatore (traduce .c in .o controllando sintassi e tipi); 3. Linker (unisce oggetti e librerie in un eseguibile). Usare sempre -Wall -Wextra.

Differenze fondamentali con Python

  • Variabili: in C sono celle di memoria a tipo statico e fisso; dichiarazione obbligatoria.
  • Inizializzazione: le variabili locali non inizializzate contengono un valore indeterminato (spazzatura).
  • Controlli a run-time: quasi assenti in C (errori silenziosi o crash, comportamento indefinito).
  • Tipi: stringhe come array di char terminati da '\0', booleani come int (0 falso, ≠0\ne 0 vero), liste come array a dimensione fissa.

printf di base

printf(formato, valori...): gli specificatori devono corrispondere esattamente ai valori passati.

Mappa degli argomenti

Tipi e flussoTipi interi e reali del C con dimensioni e limiti, conversioni implicite e cast, divisione intera, operatori di incremento, logici e bit a bit; if, switch, while, do-while, for, break e continue.Tipi, operatori e controllo del flusso in C →, FunzioniDefinizione e prototipo di una funzione C, tipo di ritorno e void, passaggio dei parametri sempre per valore, variabili locali, globali e static, file header e compilazione separata, funzioni ricorsive.Funzioni in C →, Array e stringheArray di dimensione fissa in memoria contigua, inizializzazione, nessun controllo sugli indici, passaggio a funzioni con la lunghezza, matrici; stringhe come array di char terminati da '\0' e funzioni di string.h.Array e stringhe in C →, I/Oprintf con larghezza e precisione, scanf con indirizzi e valore di ritorno, lettura di righe con fgets, file con FILE*, fopen, fclose, fprintf, fscanf, controllo degli errori e della fine del file.Input e output in C →, PuntatoriUn puntatore contiene un indirizzo di memoria; operatori & e *, NULL, puntatori come parametri per modificare variabili del chiamante, aritmetica dei puntatori, legame tra array e puntatori, const, puntatori a puntatori.Puntatori in C →, MemoriaSegmenti di memoria di un processo (codice, dati statici, stack, heap); durata delle variabili; allocazione dinamica con malloc, calloc, realloc e free; errori classici: memory leak, dangling pointer, double free, buffer overflow; strumenti di controllo.Gestione della memoria in C →, Structstruct per raggruppare campi di tipo diverso, typedef, accesso con punto e freccia, struct come parametri e valori di ritorno, array di struct, struct allocate dinamicamente e struct autoreferenziali.Strutture (struct) in C →.

Errori tipici

Dimenticare ; o } (errore segnalato alla riga dopo); ignorare i warning; usare variabili non inizializzate; specificatori printf errati rispetto ai tipi.

Teoria collegata