Il linguaggio C fu inizialmente progettato nel 1972 da Denis Ritchie, che lo sviluppò come evoluzione del linguaggio B, a sua volta derivato da BCPL. Una delle prime applicazioni del C fu la riscrittura del kernel di Unix (che inizialmente era stato scritto in assembly), dopodichè esso si diffuse sempre più ampiamente (in ambito prima industriale, e poi anche accademico).
Nel 1990, l’ANSI (American National Standards Institute) pubblicò la prima specifica standard del linguaggio C. La standardizzazione di un linguaggio di programmazione è importante perchè favorisce la portabilit del codice, facendo sì che compilatori diversi possano compilare lo stesso codice, invece di avere ciascuno un proprio “dialetto” del linguaggio.
Il C è un linguaggio:
BEGIN
e END
).Queste caratteristiche sono sostanzialmente motivate dallo stato della tecnologia informatica all’epoca dello sviluppo del C: i calcolatori erano ingombranti, costosi, e di potenza molto limitata — avevano decine di kilobyte di memoria RAM, frequenze di clock nell’ordine dei kilohertz, hard disk di pochi megabyte grandi come elettrodomestici, archivi a nastro ad accesso sequenziale (con tempi di accesso misurati in secondi), ecc.
Ad alto livello, un programma C è costituito da un insieme non vuoto di funzioni, definite tutte allo stesso livello (il nesting non è ammesso). In C, una funzione è una sequenza di istruzioni associata a un nome, che elabora eventuali dati ricevuti in ingresso e restituisce eventualmente un risultato. In altre parole, le funzioni C corrispondono alle funzioni e a elle procedure della programmazione procedurale in generale; il C non fa alcuna distinzione sintattica tra funzioni e procedure.
In ogni programma deve essere obbligatoriamente presente almeno una funzione chiamata main
, che costituisce il punto di inizio del programma: all’avvio l’esecuzione inizia appunto dalla prima istruzione di main
.
Il C mette a disposizione una serie di tipi di dati predefiniti (built-in); essi sono tutti tipi numerici, classificabili in tipi interi e tipi reali.
I tipi interi sono char
, short
, int
e long
, ciascuno disponibile in due versioni:
signed
), che può rappresentare numeri sia positivi che negativi;unsigned
), che può rappresentare solo valori positivi.Il nome del tipo char
, in particolare, deriva dal fatto che i suoi valori possono essere interpretati come caratteri, ad esempio secondo il codice ASCII.
I quattro tipi interi si distinguono per il numero di byte occupati dalle variabili, e dunque per i range di valori che possono essere rappresentati. Lo standard C non fissa un numero di byte preciso per ciascun tipo (fare ciò limiterebbe le architetture hardware sulle quali il linguaggio potrebbe essere impiegato in modo efficiente), ma si limita a specificare che ciascun tipo deve essere grande almeno quanto il tipo precedente nell’ordine char
, short
, int
, long
:
$$ \texttt{char} \leq \texttt{short} \leq \texttt{int} \leq \texttt{long } $$