# C/Linguaggio/Panoramica

C
Copertina Tutti i moduli · Sviluppo
* LinguaggioC/Linguaggio
** PanoramicaC/Linguaggio/Panoramica
** Struttura del linguaggioC/Linguaggio/Struttura del linguaggio
* Variabili, operatori e costantiC/Variabili, operatori e costanti
** VariabiliC/Variabili, operatori e costanti/Variabili
** Operatori aritmeticiC/Variabili, operatori e costanti/Operatori aritmetici
** Operatori sui bitC/Variabili, operatori e costanti/Operatori sui bit
** CostantiC/Variabili, operatori e costanti/Costanti
* Blocchi e funzioniC/Blocchi e funzioni
** Blocchi if e switchC/Blocchi e funzioni/Blocchi if e switch
** Operatori logiciC/Blocchi e funzioni/Operatori logici
** CicliC/Blocchi e funzioni/Cicli
** FunzioniC/Blocchi e funzioni/Funzioni
** mainC/Blocchi e funzioni/main
** LibrerieC/Blocchi e funzioni/Librerie
** RicorsivitàC/Blocchi e funzioni/Ricorsività
* Vettori e puntatoriC/Vettori e puntatori
** VettoriC/Vettori e puntatori/Vettori
** PuntatoriC/Vettori e puntatori/Puntatori
** Interscambiabilità tra puntatori e vettoriC/Vettori e puntatori/Interscambiabilità tra puntatori e vettori
* StringheC/Variabili, operatori e costanti/Stringhe
* Enumerazioni, strutture e unioniC/Enumerazioni, strutture e unioni
** EnumerazioniC/Enumerazioni, strutture e unioni/Enumerazioni
** StruttureC/Enumerazioni, strutture e unioni/Strutture
** UnioniC/Enumerazioni, strutture e unioni/Unioni
* Conversioni di tipoC/Conversioni di tipo
* Lettura e scrittura su fileC/Lettura e scrittura su file
** File di TestoC/Lettura e scrittura su file/File di Testo
** File BinariC/Lettura e scrittura su file/File Binari
* Compilatore e precompilatoreC/Compilatore e precompilatore
** CompilatoreC/Compilatore e precompilatore/Compilatore
** DirettiveC/Compilatore e precompilatore/Direttive
** HeaderC/Compilatore e precompilatore/Header
* VisibilitàC/Visibilità
* Gestione della memoriaC/Gestione della memoria
* Le applicazioni CGIC/Le applicazioni CGI
* Appendice
** Librerie standardC/Appendice/Librerie standard
*** assert.hC/Appendice/Librerie standard/assert.h
*** ctype.hC/Appendice/Librerie standard/ctype.h
*** errno.hC/Appendice/Librerie standard/errno.h
*** float.hC/Appendice/Librerie standard/float.h
*** limits.hC/Appendice/Librerie standard/limits.h
*** locale.hC/Appendice/Librerie standard/locale.h
*** math.hC/Appendice/Librerie standard/math.h
*** setjmp.hC/Appendice/Librerie standard/setjmp.h
*** signal.hC/Appendice/Librerie standard/signal.h
*** stdarg.hC/Appendice/Librerie standard/stdarg.h
*** stddef.hC/Appendice/Librerie standard/stddef.h
*** stdio.hC/Appendice/Librerie standard/stdio.h
*** stdlib.hC/Appendice/Librerie standard/stdlib.h
*** string.hC/Appendice/Librerie standard/string.h
*** time.hC/Appendice/Librerie standard/time.h
** StrumentiC/Appendice/Strumenti
*** InstallerC/Appendice/Strumenti/Installer
** Librerie esterneC/Appendice/Librerie esterne
* Bibliografia
    IndiceC/Indice
Modifica il sommario

## Un linguaggio di programmazione

Il primo computer fu programmato con il linguaggio macchina, ossia un linguaggio formulato tramite una sequenza di bit. Questo modo di programmare è detto di bassissimo livello ed è l'unico linguaggio comprensibile e direttamente eseguibile dal microprocessore. Scrivere un programma direttamente in linguaggio macchina richiede la conoscenza intima dello specifico microprocessore per il quale si sta scrivendo il programma, questo comporta la non trasportabilità del programma su un altro computer basato su un'altra famiglia di microprocessori. Noi umani non comprendiamo per natura il linguaggio macchina o binario, soltanto leggere una sfilza interminabile di codice per i nostri occhi è una fatica insostenibile.
Per questi e altri motivi, durante l'evoluzione informatica sono stati creati i linguaggi di programmazione, al fine di semplificare e ridurre i tempi di sviluppo e manutenzione del programma.
Uno dei linguaggi ancora usato è il linguaggio assembly assembler:, tuttavia anche questo è poco produttivo e per questo viene usato assieme ad altri linguaggi specie con il C, quando le operazioni da svolgere devono essere compiute nel minore tempo possibile. L'assembly è afflitto dagli stessi problemi del linguaggio macchina, cioè non è portabile ed è molto complesso perché ci si ritrova a dovere manipolare direttamente i registri del microprocessore, tuttavia è un linguaggio mnemonico facilmente memorizzabile e leggibile dagli umani. Il programma scritto in assembly per potere essere eseguito dal computer richiede una trasformazione in codice macchina comprensibile al microprocessore, in genere la trasformazione è ad opera di un programma detto assembler o assemblatore. Questo linguaggio appartiene alla categoria dei linguaggi di basso livello e si colloca poco sopra il linguaggio macchina.
Durante l'evoluzione informatica si assiste a una proliferazione di linguaggi di alto livello, creati e pensati per risolvere un particolare tipo di problemi e altri invece più generici. I linguaggi di alto livello rendono il programma più leggibile e mantenibile, il risultato è un codice compatto e maggiormente comprensibile.
Alcuni esempi di questi linguaggi di alto livello sono il Pascal per le applicazioni didattiche, il Fortran per applicazioni scientifiche, il BASIC, il Cobol per citarne alcuni, e naturalmente il C.

## Le particolarità del C
### È un linguaggio a medio livello

Quello che differenzia il C dagli altri linguaggi di programmazione è proprio il fatto che è considerato Il linguaggio di più basso livello tra quelli di alto livello, proprio in questa affermazione va ricercato il fatto che il C è ampiamente utilizzato per programmare driver, sistemi operativi e applicazioni che richiedono un controllo diretto sulle periferiche.

### Strutturato

Ogni programma viene visto come un comando (complesso, o strutturato) ottenuto componendo altri comandi mediante 3 strutture di controllo: concatenazione, alternativa e ripetizione.

### Con tipizzazione debole

Nel senso che un dato di un particolare tipo può essere visto dal programma, tramite particolari tecniche, come di un altro tipo o addirittura convertito in un altro tipo. Inoltre alcune conversioni da un tipo all'altro sono implicite, altre possono essere forzate.

### È case-sensitive

Il C è case-sensitive: pertanto ab, AB, Ab e aB saranno quattro variabili diverse.

## Storia del C

Fu ideato nei Bell Laboratories della AT&T nel 1972 da Dennis Ritchie come evoluzione del linguaggio B di Ken Thompson usato per la scrittura dei primi sistemi operativi UNIX. Lo stesso Thompson nel 1970 si era a sua volta ispirato al linguaggio BCPL di Martin Richards, anch'esso pensato per scrivere sistemi operativi e software di sistema. La definizione formale si ha nel 1978 a cura di B. W. Kernighan e D. M. Ritchie. Nel 1983 iniziò il lavoro di definizione di uno standard da parte dell'American National Standards Institute, che rilasciò nel 1990 lo Standard ANSI C (ISO C89).

### Varianti e i linguaggi derivati

Lo standard venne anche adottato dall'International Organisation for Standardisation (ISO) nel 1999 con il nome di C Standard ANSI/ISO. Nel 1995 fu adottato l'Emendamento 1 al C Standard che, fra le altre cose, ha aggiunto nuove funzioni alla libreria standard del linguaggio. Usando come documento base il C89 con l'Emendamento 1, e unendovi l'uso delle classi di Simula, Bjarne Stroustrup iniziò a sviluppare il C++.
Il risultato finale del continuo sviluppo del C fu lo standard promulgato nel 1999, noto come ISO C99.
Il linguaggio Objective C deve la sua popolarità alla Apple che lo ha scelto come base per il suo sistema operativo Mac OS X.
È un linguaggio orientato agli oggetti e a differenza del C++ mantiene la piena compatibilità con il C.

## Un semplice programma

Partiamo introducendo il classico programma Hello World!.
Ecco l'analisi del codice:
* #include <stdio.h> consente di poter usare la funzione printf che consente di scrivere sullo schermo;
* int main(void): è la funzione principale del programma (vedere La funzione main);
* printf("Hello World!");: stampa la stringa Hello World!;
Esamineremo in dettaglio tutte queste istruzioni nei prossimi capitoli.