Salta al contenuto
Note per Studenti Dal Python al C

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 riga e /* su più righe */.
  • #include <stdio.h> inserisce le dichiarazioni della libreria di input/output (printf, scanf, ...).

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.

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 %

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.

Teoria collegata