Dal Python al C
In questa pagina 6
In questa pagina 5
Primo programma
#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 volteDefinizione (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 rigae/* 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)
- Preprocessore: esegue le direttive
#(#includecopia il file indicato,#definesostituisce testo). Lavora sul testo, non conosce il C.- Compilatore: traduce ogni file
.cin codice macchina (file oggetto.o) e controlla sintassi e tipi.- 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 strarray di charterminato da'\0'Booleani boolint(0 falso, diverso da 0 vero);boolcon<stdbool.h>Liste listdinamicaarray di dimensione fissa Output print(x)printf("%d\n", x)con formato esplicitoMemoria 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.
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 %dint%ldlong%uunsigned int%f(%.2f)double(anchefloat, promosso)%cchar%sstringa ( char *)%ppuntatore %xintero in esadecimale %%il carattere %
Esempio. printf("%d %.2f %c %x\n", 42, 3.14159, 'A', 255); stampa 42 3.14 A ff.
Mappa degli argomenti
Gli stessi concetti visti in Python, in C:
- tipi, operatori,
if,switch, cicli: Tipi, operatori e controllo del flusso in CTipi 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 →; - funzioni e passaggio per valore: Funzioni in CDefinizione 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 stringhe: Array e stringhe in CArray 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 →;
- input/output e file: 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 →;
- indirizzi e memoria: Puntatori in CUn 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 →, Gestione della memoria in CSegmenti 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 →, Strutture (struct) in Cstruct 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 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
printfche non corrisponde al tipo (%dcon undouble): output privo di senso.
Versione ripasso
Struttura e compilazione
- Il programma parte da
main(ritorna0se ok). Istruzioni con;, blocchi con{ }. - Compilazione: 1. Preprocessore (direttive
#, es.#include,#define); 2. Compilatore (traduce.cin.ocontrollando 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
charterminati da'\0', booleani comeint(0falso, vero), liste come array a dimensione fissa.
printf di base
printf(formato, valori...): gli specificatori devono corrispondere esattamente ai valori passati.
%d(int),%ld(long),%u(unsigned int),%f(double),%c(char),%s(char *),%p(puntatore),%x(esadecimale),%%(%). Dettagli e scanfprintf 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
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.