Dal Python al C
In questa pagina 6
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- 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, ...).
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.
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
| 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 |
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
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 % |
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.