[go: nahoru, domu]

C (linguaggio di programmazione): differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Aggiunto paragrafo "Tipi di dato"
Etichetta: Ripristino manuale
(21 versioni intermedie di 11 utenti non mostrate)
Riga 1:
{{U|verso=da|Header file|Informatica|luglio 2023}}
 
{{Linguaggio di programmazione
|nome = C
|immagine = The C Programming Language logo.svg
|didascalia = GraficaLogo dellapresente nella copertina inglese di ''[[Il linguaggio C]]'':, ilmanuale designerscritto originaledal creatore di C [[Dennis Ritchie]] èe coautoreda del[[Brian libroKernighan]]<ref>{{Cita libro|urlname=https:"prinz"//books.google.com/books?id=4Mfe4sAMFUYC|titolo=C in a Nutshell|cognome=Prinz|nome=Peter|cognome2=Crawford|nome2=Tony|data=16 dicembre 2005|editore=O'Reilly Media, Inc.|isbn=9780596550714|p=3|lingua=en}}</ref>
|autore = [[Dennis Ritchie]]
|data = 1972
Line 16 ⟶ 14:
|ha_influenzato = Numerosi, tra cui [[C++]], [[Objective-C]], [[C sharp|C#]], [[Swift (linguaggio di programmazione)|Swift]], [[D (linguaggio di programmazione)|D]]
}}
In [[informatica]], '''C''' è un [[linguaggio di programmazione]] [[Programmazione imperativa|imperativo]] di natura [[Programmazione procedurale|procedurale]]; i [[programma (informatica)|programmi]] scritti in questo linguaggio sono composti da espressioni matematiche e da [[Istruzione (informatica)|istruzioni]] imperative raggruppate in procedure parametrizzate in grado di manipolare vari [[tipo di dato|tipi di dati]].
 
'''C''' ([[Alfabeto fonetico internazionale|AFI]]: {{IPA|/ˈsiː/|en}}{{cn}}) è un [[linguaggio di programmazione]] ad uso generale di natura [[Programmazione imperativa|imperativa]] e [[Programmazione procedurale|procedurale]] creato da [[Dennis Ritchie]] negli anni '70. Tutt'oggi influente, è largamente adoperato nei [[Sistema operativo|sistemi operativi]], nei ''[[driver]]'' e nelle [[Pila di protocolli|pile di protocolli]], mentre è in diminuzione il suo uso nelle [[Applicazione (informatica)|applicazioni]].<ref>{{cita web|data=9 agosto 2016 |titolo=C Language Drops to Lowest Popularity Rating |url=https://www.developer.com/news/c-language-drops-to-lowest-popularity-rating/ |urlmorto= |urlarchivio=https://web.archive.org/web/20220822225609/https://www.developer.com/news/c-language-drops-to-lowest-popularity-rating/|accesso=1º agosto 2022|lingua=en}}</ref> C è comunemente usato in architetture che vanno dai più grandi [[Supercomputer|supercalcolatori]] fino ai minuscoli [[Microcontrollore|microcontrollori]] e [[Sistema embedded|sistemi integrati]].
Integra caratteristiche dei linguaggi di [[linguaggio di programmazione a basso livello|basso livello]], ovvero [[Carattere (informatica)|caratteri]], numeri e [[Indirizzo di memoria|indirizzi]], che possono essere indicati tramite gli operatori aritmetici e [[Connettivo logico|logici]] di cui si servono le macchine reali<ref>{{Cita libro|titolo=Il Linguaggio C - Principi di programmazione e manuale di riferimento (Seconda edizione) - Brian W. Kernighan, Dennis M. Ritchie|editore=Pearson Prentice Hall|p=Introduzione - XIV}}</ref>. C è stato concepito per essere snello e performante, si avvale peraltro di numerose librerie per far fronte ad ogni tipo di esigenza, in particolare la [[libreria standard di C]]. Tali librerie, sotto forma di file di intestazione o [[header file|file]] con suffisso -h, possono essere caricate mediante la direttiva ''#include'' del [[preprocessore]].
 
Successore del linguaggio [[B (linguaggio di programmazione)|B]], C fu in origine sviluppato ai [[Bell Labs]] da Ritchie tra il 1972 e il 1973 per costruire [[Utility (informatica)|utilità]] eseguibili su [[Unix]], e fu subito dopo applicato nella reimplementazione del [[kernel]] di quel sistema operativo.<ref name="sigplan2">{{Cita pubblicazione|autore=Dennis M. Ritchie|data=1º marzo 1993|titolo=The development of the C language|rivista=ACM SIGPLAN Notices|volume=28|numero=3|pp=201–208|accesso=8 dicembre 2023|doi=10.1145/155360.155580|url=https://dl.acm.org/doi/10.1145/155360.155580}}</ref> Durante gli anni '80, C gradualmente crebbe in popolarità, diventando nel terzo millennio uno dei linguaggi più usati in assoluto,<ref name="langpop">{{cita web|url=http://www.langpop.com/ |titolo=Programming Language Popularity |anno=2009 |accesso=16 gennaio 2009 |urlmorto=si |urlarchivio=https://web.archive.org/web/20090116080326/http://www.langpop.com}}</ref><ref name="TIOBE-2009">{{cita web|url=http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html |titolo=TIOBE Programming Community Index |anno=2009 |accesso=6 maggio 2009 |urlmorto=si |urlarchivio=https://web.archive.org/web/20090504181627/http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html}}</ref> con [[Compilatore|compilatori]] disponibili per praticamente ogni [[Architettura (computer)|architettura]] e sistema operativo moderni. Il libro intitolato ''[[The C Programming Language]]'', scritto dal suo creatore insieme a [[Brian Kernighan]], servì per molti anni come lo standard ''[[de facto]]'' del linguaggio.<ref name="prinz">{{Cita libro|url=https://books.google.com/books?id=4Mfe4sAMFUYC|titolo=C in a Nutshell|cognome=Prinz|nome=Peter|cognome2=Crawford|nome2=Tony|data=16 dicembre 2005|editore=O'Reilly Media, Inc.|isbn=9780596550714|p=3|lingua=en}}</ref><ref name="ward198308">{{cita news|cognome=Ward |nome=Terry A. |url=https://archive.org/stream/byte-magazine-1983-08/1983_08_BYTE_08-08_The_C_Language#page/n267/mode/2up |titolo=Annotated C / A Bibliography of the C Language |opera=Byte |data=agosto 1983 |accesso=31 gennaio 2015 |pp=268}}</ref> Dal 1989, C è normato dall'[[American National Standards Institute]] (ANSI) e dall'[[International Organization for Standardization]] (ISO).
== Storia ==
 
C è un linguaggio procedurale imperativo, che supporta la [[programmazione strutturata]], la [[Visibilità (programmazione)|visibilità lessicale]] e la [[ricorsione]], e possiede un [[Sistema dei tipi|sistema di tipi]] statico. Il linguaggio C permette l'utilizzo a basso livello alla [[Memoria (informatica)|memoria]] e fornisce costrutti che combaciano efficientemente con le istruzioni del [[linguaggio macchina]]. Nonostante le sue capacità a basso livello, il linguaggio è adatto per essere programmato su piattaforme diverse: un programma in C conforme scritto per essere portabile può essere compilato per una vasta gamma di piattaforme con poche variazioni al suo codice sorgente.<ref name="cppreference2">{{cita web|url=http://en.cppreference.com/w/c/language/history|titolo=History of C|accesso=28 maggio 2018|urlarchivio=https://web.archive.org/web/20180529130541/http://en.cppreference.com/w/c/language/history|urlmorto=}}</ref>
 
A partire dal 2000, C è constantemente classificato tra i primi due linguaggi nell'indice TIOBE, una misura di popolarità dei linguaggi di programmazione.<ref name="TIOBE-2021">{{cita web|titolo=TIOBE Index for October 2021|url=https://www.tiobe.com/tiobe-index/|accesso=7 ottobre 2021|urlarchivio=https://web.archive.org/web/20180225101948/https://www.tiobe.com/tiobe-index/|urlmorto=}}</ref>
 
== Storia ==
Il linguaggio fu originariamente sviluppato da [[Dennis Ritchie]]<ref>{{Cita pubblicazione |autore-capitolo=Dennis Ritchie |autore-capitolo2=Brian Kernighan | data=2004 |titolo=Il linguaggio C. Principi di programmazione e manuale di riferimento |editore=Prentice Hall |capitolo=XI |p=320 |url=https://www.pearson.it/opera/pearson/0-2552-il_linguaggio_c ||citazione=C fu progettato e scritto per il sistema operativo UNIX, sul DEC PDP-11, da Dennis Ritchie}}</ref> presso i [[Bell Laboratories|Bell Labs]] della [[AT&T]] tra il 1969 e il 1973, con lo scopo di utilizzarlo per la stesura del sistema operativo [[UNIX]], precedentemente realizzato da [[Ken Thompson]] e Ritchie stesso in [[assembly]] del [[PDP-7]]. Nel 1972 esordì il primo sistema UNIX su un DEC [[PDP-11]], scritto interamente col nuovo linguaggio di programmazione C.<ref>{{Cita web |url=https://www.bell-labs.com/usr/dmr/www/chist.html |titolo=The Development of the C Language |autore=Dennis Ritchie |sito=Bell Labs/Lucent Technologies |data=1993 |lingua=en |formato=pdf |citazione=C came into being in the years 1969-1973, in parallel with the early development of the Unix operating system; the most creative period occurred during 1972 |accesso=1º maggio 2017}}</ref> Nel [[1978]], la pubblicazione del libro ''[[Il linguaggio C]]'' ne fece crescere rapidamente la diffusione, portando alla nascita di diversi ''dialetti'' e dunque alla necessità di definire uno standard.
 
La prima standardizzazione di C fu realizzata dall'[[American National Standards Institute|ANSI]] nel 1989 (ANSI X3.159-1989), nota come C89. La stessa versione, solo con modifiche di formattazione minime, fu poi standardizzata anche dall'[[Organizzazione internazionale per la normazione|ISO]] nel 1990 (ISO/IEC 9899:1990), nota come C90. Successivamente l'ISO ha pubblicatoaltre quattro versioni del linguaggio C, note come C95 (ISO/IEC 9899/AMD1:1995), [[C99 (linguaggio di programmazione)|C99]] (ISO/IEC 9899:1999), C11 (ISO/IEC 9899:2011/Cor 1:2012) e C18 (ISO/IEC 9899:2018). Di queste, la C99 ha portato i principali miglioramenti al linguaggio di programmazione, introducendo nuovi tipi di dato, gli inizializzatori designati per gli array, gli array di dimensione variabile e altri miglioramenti mutuati da [[C++]].
 
=== Funzionalità introdotte nelle revisioni del linguaggio ===
== Descrizione ==
==== C99 ====
Nato insieme a [[Unix]], C è supportato dalla totalità dei [[sistemi operativi]] di largo uso impiegati ed è impiegato principalmente per la realizzazione di [[sistemi operativi]], [[linguaggi di programmazione]], [[Libreria (software)|librerie]], [[videogioco|giochi]] e per [[applicazione (informatica)|applicazioni]] altamente performanti; è rinomato per la sua [[efficienza (informatica)|efficienza]] e si è imposto come linguaggio di riferimento per la realizzazione di software di sistema su gran parte delle piattaforme [[hardware]] moderne. La standardizzazione del linguaggio (da parte prima dell'[[ANSI]] e poi dell'[[ISO]]) garantisce la [[portabilità]] dei programmi scritti in C (standard, spesso detto ANSI C) su qualsiasi piattaforma; oltre che per il software di sistema, è stato a lungo il linguaggio dominante in tutta una serie di altri [[dominio applicativo|domini applicativi]] caratterizzati mirati sull'efficienza. Esempi tipici sono le [[telecomunicazioni]], il [[Controllo industriale|controllo di processi industriali]] e il software [[sistema real-time]]. Il predominio di C in questi contesti è in parte diminuito a seguito dell'avvento di alternative significative, primo fra tutti [[C++]].
 
C ha anche una notevole importanza didattica, sebbene, per la sua complessità [[semantica (informatica)|semantica]] e per le forti relazioni di tale semantica con il funzionamento dell'[[hardware]] dei [[computer]], non si tratti di un linguaggio particolarmente intuitivo per i principianti e, in special modo, per quelli sprovvisti di un'adeguata preparazione riguardante l'[[elettronica]] dei calcolatori. Se un tempo le scuole superiori e i corsi universitari adottavano C come linguaggio di riferimento a causa della sua importanza tecnica, oggi questa scelta trova un'ulteriore motivazione nella crescente importanza di linguaggi che da C derivano (per esempio [[C++]], [[Java (linguaggio di programmazione)|Java]] e [[C sharp|C#]] e, per consentire allo studente un approccio iniziale più rapido e intuitivo, linguaggi ad alto livello come [[Python]]).
 
=== Caratteristiche generali ===
C è un linguaggio di programmazione relativamente minimalista; la sua semantica utilizza un insieme ristretto di concetti relativamente semplici e vicini al funzionamento dell'hardware dei calcolatori. Molte [[istruzione (informatica)|istruzioni]] C sono traducibili direttamente con una singola istruzione di [[linguaggio macchina]] (per esempio, gli operatori di [[autoincremento e autodecremento]]). Nel linguaggio, un ruolo centrale viene svolto dal concetto di [[puntatore (programmazione)|puntatore]], che viene generalizzato fino a coincidere con l<nowiki>'</nowiki>indirizzamento indiretto, un modo di accedere alla memoria hardware caratteristico di tutte le moderne [[CPU]]. Questo rende C un linguaggio particolarmente efficiente. Inoltre, rispetto al linguaggio assembly, C ha in più una struttura logica definita e leggibile, funzioni in stile [[Pascal (linguaggio di programmazione)|Pascal]] e soprattutto il controllo sui tipi (in fase di compilazione), che manca completamente nel linguaggio assembly.
 
La sintassi di C è piuttosto versatile e il linguaggio è in [[linguaggio in forma libera|forma libera]], permettendo di scrivere istruzioni complesse in poche righe di codice o di creare programmi criptici e illeggibili ([[offuscamento del codice]]). In definitiva, il successo di C fu decretato dall'essere un linguaggio creato da programmatori esperti, per essere usato da programmatori esperti.
 
Questa grande libertà, la complessità sintattica del linguaggio (che come abbiamo visto contiene poche istruzioni di base) e il ruolo centrale dei puntatori, che è necessario usare praticamente fin dai primi programmi, lo rendono quindi un linguaggio ostico e sconsigliabile ai neofiti, che cadono quasi subito in una serie di trappole che, se pure ovvie per un esperto, sono molto difficili da individuare per un principiante.
 
Grazie alla particolare efficienza del codice prodotto dai suoi compilatori, C venne utilizzato per riscrivere la maggior parte del codice del sistema [[UNIX]], riducendo l'uso del linguaggio assembly ad un piccolo gruppo di funzioni.
La sua importanza tuttavia, crebbe solo dopo il [[1978]] con la pubblicazione, da parte di [[Brian Kernighan]] e [[Dennis Ritchie]], del libro ''[[Il linguaggio C|The C Programming Language]],'' nel quale il linguaggio venne definito in modo preciso.
 
Il suo successivo larghissimo utilizzo portò alla nascita di diversi [[dialetto|dialetti]] e quindi alla necessità di definirne uno standard. A questo scopo, nell'estate del [[1983]], venne nominato un comitato con il compito di creare uno standard ANSI (''[[ANSI|American National Standards Institute]]'') che definisse il linguaggio C una volta per tutte. Il processo di standardizzazione, il quale richiese sei anni (molto più del previsto), terminò nel dicembre del [[1989]] e le prime copie si resero disponibili agli inizi del [[1990]]. Questa versione di C è normalmente chiamata C89. 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 software|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 [[C++]].
 
Il risultato finale del continuo sviluppo di C fu lo standard promulgato nel [[1999]], noto come ISO C99 (codice ISO 9899).
 
Con la versione C11 (2011) vengono lievemente rivisti alcuni comandi, mentre la versione C18 (2018) ha corretto alcune criticità della C11, senza tuttavia introdurre alcuna nuova funzionalità.
 
=== Caratteristiche di alcune versioni ===
;C99
 
* Il tipo di dato <code>_Bool</code>, che ammette la memorizzazione dei booleani ''false'' e ''true'';
* Il tipo di dato <code>_Complex</code> per la rappresentazione dei numeri complessi;
Line 74 ⟶ 54:
* L'operatore di preprocessing <code>_Pragma</code>.
 
;==== C11 ====
 
Lo standard C11 ha introdotto cinque nuovi file header, ovvero <code>&lt;stdalign.h&gt;</code>, <code>&lt;stdatomic.h&gt;</code>, <code>&lt;stdnoreturn.h&gt;</code>, <code>&lt;threads.h&gt;</code> e <code>&lt;uchar.h&gt;</code>, nonché diverse funzionalità che hanno contribuito a migliorare il linguaggio:
 
Line 92 ⟶ 71:
* Le macro per la creazione di numeri complessi in <code>&lt;complex.h&gt;</code>.
 
== Tipi di datoDescrizione ==
Nato insieme a [[Unix]], C è supportato dalla totalità dei [[sistemi operativi]] di largo uso impiegati ed è impiegato principalmente per la realizzazione di [[sistemi operativi]], [[linguaggi di programmazione]], [[Libreria (software)|librerie]], [[videogioco|giochi]] e per [[applicazione (informatica)|applicazioni]] altamente performanti; è rinomato per la sua [[efficienza (informatica)|efficienza]] e si è imposto come linguaggio di riferimento per la realizzazione di software di sistema su gran parte delle piattaforme [[hardware]] moderne. La standardizzazione del linguaggio (da parte prima dell'[[ANSI]] e poi dell'[[ISO]]) garantisce la [[portabilità]] dei programmi scritti in C (standard, spesso detto ANSI C) su qualsiasi piattaforma; oltre che per il software di sistema, è stato a lungo il linguaggio dominante in tutta una serie di altri [[dominio applicativo|domini applicativi]] caratterizzati mirati sull'efficienza. Esempi tipici sono le [[telecomunicazioni]], il [[Controllo industriale|controllo di processi industriali]] e il software [[sistema real-time]]. Il predominio di C in questi contesti è in parte diminuito a seguito dell'avvento di alternative significative, primo fra tutti [[C++]].
C supporta quattro [[tipi di dato]] fondamentali, tutti numerici: <code>int</code>, che rappresenta un [[Numero_intero_(informatica)|numero intero]]; <code>char</code>, che rappresenta un [[Carattere_(informatica)|carattere]] (più precisamente, un intero positivo associato a un carattere attraverso un [[Codifica_di_caratteri|sistema di codifica]], solitamente [[ASCII]]); <code>float</code>, che rappresenta un [[Decimal|numero decimale]]; <code>double</code>, che rappresenta un numero decimale con precisione doppia rispetto a <code>float</code>.
 
C ha anche una notevole importanza didattica, sebbene, per la sua complessità [[semantica (informatica)|semantica]] e per le forti relazioni di tale semantica con il funzionamento dell'[[hardware]] dei [[computer]], non si tratti di un linguaggio particolarmente intuitivo per i principianti e, in special modo, per quelli sprovvisti di un'adeguata preparazione riguardante l'[[architettura dei calcolatori]]. Se un tempo le scuole superiori e i corsi universitari adottavano C come linguaggio di riferimento a causa della sua importanza tecnica, oggi questa scelta trova un'ulteriore motivazione nella crescente importanza di linguaggi che da C derivano (per esempio [[C++]], [[Java (linguaggio di programmazione)|Java]] e [[C sharp|C#]] e, per consentire allo studente un approccio iniziale più rapido e intuitivo, linguaggi ad alto livello come [[Python]]).
Esistono inoltre i seguenti modificatori, che si possono anteporre ai nomi dei tipi interi per cambiarne delle caratteristiche: <code>signed</code> specifica che l'intero può essere positivo o negativo; <code>unsigned</code> specifica che l'intero può essere solo positivo; <code>short</code> riduce la memoria assegnata al tipo di dato, restringendo di conseguenza l'intervallo numerico rappresentabile; <code>long</code> funziona in maniera opposta, aumentando la memoria e ampliando l'intervallo.
 
=== Caratteristiche generali ===
C supporta e fa largo uso di [[Puntatore_(programmazione)|puntatori]], variabili che hanno come valore un [[indirizzo di memoria]].
C è un linguaggio di programmazione relativamente minimalista; la sua semantica utilizza un insieme ristretto di concetti relativamente semplici e vicini al funzionamento dell'hardware dei calcolatori. Molte [[istruzione (informatica)|istruzioni]] C sono traducibili direttamente con una singola istruzione di [[linguaggio macchina]] (per esempio, gli operatori di [[autoincremento e autodecremento]]). Nel linguaggio, un ruolo centrale viene svolto dal concetto di [[puntatore (programmazione)|puntatore]], che viene generalizzato fino a coincidere con l{{'}}indirizzamento indiretto, un modo di accedere alla memoria hardware caratteristico di tutte le moderne [[CPU]]. Questo rende C un linguaggio particolarmente efficiente. Inoltre, rispetto al linguaggio assembly, C ha in più una struttura logica definita e leggibile, funzioni in stile [[Pascal (linguaggio di programmazione)|Pascal]] e soprattutto il controllo sui tipi (in fase di compilazione), che manca completamente nel linguaggio assembly.
 
La sintassi di C è piuttosto versatile e il linguaggio è in [[linguaggio in forma libera|forma libera]], permettendo di scrivere istruzioni complesse in poche righe di codice o di creare programmi criptici e illeggibili ([[offuscamento del codice]]). In definitiva, il successo di C fu decretato dall'essere un linguaggio creato da programmatori esperti, per essere usato da programmatori esperti.
I tipi complessi presenti sono gli [[array]], le enumerazioni (<code>enum</code>), le strutture (<code>struct</code>) e le unioni (<code>union</code>). Le [[Stringa_(informatica)|stringhe]] sono implementate come semplici array di caratteri terminati da un carattere nullo ("null character", avente codice ASCII pari a 0) e non hanno un tipo apposito.
 
Questa grande libertà, la complessità sintattica del linguaggio (che come abbiamo visto contiene poche istruzioni di base) e il ruolo centrale dei puntatori, che è necessario usare praticamente fin dai primi programmi, lo rendono quindi un linguaggio ostico e sconsigliabile ai neofiti, che cadono quasi subito in una serie di trappole che, se pure ovvie per un esperto, sono molto difficili da individuare per un principiante.
== Parole chiave ==
 
Il linguaggio C, come qualsiasi altro linguaggio di programmazione, consente la realizzazione di programmi adoperando un insieme di "parole chiave" (keywords).
Grazie alla particolare efficienza del codice prodotto dai suoi compilatori, C venne utilizzato per riscrivere la maggior parte del codice del sistema [[UNIX]], riducendo l'uso del linguaggio assembly ad un piccolo gruppo di funzioni. La sua importanza tuttavia, crebbe solo dopo il [[1978]] con la pubblicazione, da parte di [[Brian Kernighan]] e [[Dennis Ritchie]], del libro ''[[Il linguaggio C|The C Programming Language]],'' nel quale il linguaggio venne definito in modo preciso per la prima volta.
 
Il suo successivo larghissimo utilizzo portò alla nascita di diversi dialetti e quindi alla necessità di definirne uno standard. A questo scopo, nell'estate del [[1983]], venne nominato un comitato con il compito di creare uno standard ANSI ([[American National Standards Institute]]) che definisse il linguaggio C una volta per tutte. Il processo di standardizzazione, il quale richiese sei anni (molto più del previsto), terminò nel dicembre del [[1989]] e le prime copie si resero disponibili agli inizi del [[1990]]. Questa versione di C è normalmente chiamata C89. 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 software|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 [[C++]].
 
Il risultato finale del continuo sviluppo di C fu lo standard promulgato nel [[1999]], noto come ISO C99 (codice ISO 9899).
 
Con la versione C11 (2011) vengono lievemente rivisti alcuni comandi, mentre la versione C18 (2018) ha corretto alcune criticità della C11, senza tuttavia introdurre alcuna nuova funzionalità.
 
=== Tipi di dato ===
C supporta quattro [[tipi di dato]] fondamentali, tutti numerici: <code>int</code>, che rappresenta un [[Numero intero (informatica)|numero intero]]; <code>char</code>, che rappresenta un [[Carattere (informatica)|carattere]] (più precisamente, un intero positivo associato a un carattere attraverso un [[Codifica di caratteri|sistema di codifica]], solitamente [[ASCII]]); <code>float</code>, che rappresenta un numero decimale; <code>double</code>, che rappresenta un numero decimale con precisione doppia rispetto a <code>float</code>.<ref name="ILC2-2-2">{{cita|ILC2|2.2 Tipi e dimensioni dei dati, pp. 34-35}}.</ref>
 
Esistono inoltre i seguenti modificatori, che si possono anteporre ai nomi dei tipi interi per cambiarne delle caratteristiche: <code>signed</code> specifica che l'intero può essere positivo o negativo; <code>unsigned</code> specifica che l'intero può essere solo positivo; <code>short</code> riduce la memoria assegnata al tipo di dato, restringendo di conseguenza l'intervallo numerico rappresentabile; <code>long</code> funziona in maniera opposta, aumentando la memoria e ampliando l'intervallo.<ref name="ILC2-2-2"/>
 
C supporta e fa largo uso di [[Puntatore (programmazione)|puntatori]], variabili che hanno come valore un [[indirizzo di memoria]].
 
I tipi complessi presenti sono gli [[array]], le enumerazioni (<code>enum</code>), le strutture (<code>struct</code>) e le unioni (<code>union</code>). Le [[Stringa (informatica)|stringhe]] sono implementate come semplici array di caratteri terminati da un carattere nullo ("null character", avente codice ASCII pari a 0) e non hanno un tipo apposito.
 
=== Parole chiave ===
Il linguaggio C, come qualsiasi altro linguaggio di programmazione, consente la realizzazione di programmi adoperando un insieme di "[[Parola riservata|parole chiave]]" (keywords).
 
Lo standard ANSI ha definito il seguente insieme di parole chiave:
Line 108 ⟶ 107:
auto, break, case, char, const, continue, default, do, double, else, enum, extern, float, for, goto, if, int, long, register, return, short, signed, sizeof, static, struct, switch, [[typedef]], union, unsigned, void, volatile, while.
 
=== ProgrammaSequenze di esempioescape ===
:{| class="wikitable"
==== Hello world! ====
! Sequenza
! Nome del carattere
|-
|<code>\a</code> || beep
|-
|<code>\b</code> || backspace
|-
|<code>\f</code> || FF - ''form feed'' (salto pagina)
|-
|<code>\n</code> || LF - ''line feed'' o [[newline]]
|-
|<code>\r</code> || CR - ''carriage return'' (ritorno del carrello - cursore a inizio riga)
|-
|<code>\t</code> || tabulazione orizzontale
|-
|<code>\v</code> || tabulazione verticale
|-
|<code>\\</code> || \ (barra inversa)
|-
|<code>\'</code> || ' (apice)
|-
|<code>\"</code> || " (doppi apici)
|-
|<code>\0</code> || NULL (carattere nullo o di fine stringa)
|}
 
== Esempi di programma ==
=== Hello world! ===
{{Vedi anche|Hello world}}
 
Il seguente esempio stampa il testo "[[Hello world!]]" ("Ciao mondo!") sullo [[standard output]] (che normalmente coincide con lo schermo del [[terminale (informatica)|terminale]] utilizzato da chi esegue il programma). Nella didattica informatica, l'uso di introdurre i fondamenti di un linguaggio di programmazione con un programma che stampa a video "Ciao mondo!" deriva proprio da questo celebre esempio, tratto dal libro ''[[Il linguaggio C]]'' di Kernighan e Ritchie.
<syntaxhighlight lang="c" line="1">
Line 125 ⟶ 153:
#include <stdio.h>
</syntaxhighlight>
Questa linea è una [[direttiva di inclusione]] per il [[preprocessore]]. Il preprocessore è un programma (o un modulo di un [[Integrated Development Environment|ambiente integrato]]) che esegue alcune trasformazioni preliminari del [[codice sorgente]], prima che quest'ultimo venga consegnato al [[compilatore]] vero e proprio. In questo caso, la trasformazione richiesta consiste nel rimpiazzare la linea in questione con l'intero contenuto dello ''[[header file]]'' ("file di intestazione") "<code>stdio.h</code>". La presenza di [[parentesi angolari]] indica che il file si trova in una [[directory]] standard nota al preprocessore. Per includere un header (di solito creato dal programmatore) presente nella stessa cartella dove si trova il file da compilare si usa una sintassi del tipo:
<syntaxhighlight lang="c">
#include "nomeheader.h"
Line 142 ⟶ 170:
Una linea di questo tipo costituisce l'inizio di una definizione di funzione, in questo caso la [[funzione main|funzione <code>main</code>]]. La funzione <code>main</code> costituisce il [[entry point|punto di ingresso]] di un programma C: l'esecuzione di un programma inizia dalla prima [[Istruzione (informatica)|istruzione]] del <code>main</code> e termina con l'ultima. Eventuali altre funzioni entreranno in gioco solo se e quando richiamate (direttamente o indirettamente) dal <code>main</code>. In assenza di una funzione <code>main</code>, il compilatore non può produrre un [[programma eseguibile]] (ma potrebbe produrre una ''libreria'').
 
La [[parolaParola chiave (programmazione)riservata|parola chiave]] iniziale <code>int</code> rappresenta il tipo del valore restituito dalla funzione. Nel caso speciale del <code>main</code>, esso viene interpretato come valore restituito dall'intero programma al [[sistema operativo]]. Coerentemente con una convenzione universale circa i valori restituiti dai programmi al sistema, il <code>main</code> restituisce ''sempre'' un numero intero, nonostante alcuni testi riportino erroneamente anche dichiarazioni della funzione <code>main</code> con tipo di ritorno <code>void</code> (vedi [[ANSI C]]).
<syntaxhighlight lang="c">
{
Line 150 ⟶ 178:
printf("Hello, world!\n");
</syntaxhighlight>
Questa riga costituisce una chiamata di funzione; in altre parole, richiede che venga eseguita tale funzione. <code>[[printf]]</code> è una funzione della [[libreria standard didel C]] che stampa un messaggio su [[standard output]]. Pertanto sullo schermo apparirà la scritta ''Hello, world!'' (senza doppi apici, che servono nel codice sorgente a indicare inizio e fine della [[Stringa (informatica)|stringa]]).
 
<code>''\n''</code> è una ''sequenza di escape'', ovvero una sequenza di caratteri (che in C cominciano sempre con il carattere <code>''\''</code>) che verranno tradotti in fase di compilazione in un unico carattere (solitamente non stampabile od interpretato in altro modo). In particolare, <code>''\n''</code> verrà tradotto nel carattere di fine riga che, quando usato con le librerie standard in modalità testo (come con <code>printf</code>), indica l'avanzamento di linea ed il ritorno a capo del testo. Quindi, se il programma viene usato interattivamente, in genere uno spostamento del [[cursore]].
Line 160 ⟶ 188:
Un'istruzione iniziata con la parola chiave <code>return</code>, all'interno di una funzione, termina la funzione stessa e consente di specificare un valore di ritorno (qualora la funzione ne possa ritornare uno). Nel caso particolare del <code>main</code>, come si è detto sopra, questo valore sarà tornato al sistema operativo (<code>0</code> è il valore di ritorno al sistema che, convenzionalmente, indica la terminazione con successo di un programma).
 
==== EsempioCalcolatrice di calcolatrice ====
Esempio di calcolatrice che esegue la somma, il prodotto, la differenza ed il quoziente di due numeri interi:
<syntaxhighlight lang="c" line="1">
Line 205 ⟶ 233:
* <code>"La somma e': %d\n", somma</code> Al posto di <code>%d</code> verrà stampato il contenuto di <code>somma</code> (<code>%d</code> significa verrà stampato un numero intero)
* <code>return</code> è la parola chiave che indica la terminazione della funzione, restituendo il valore <code>0</code>. La terminazione della funzione <code>main()</code> comporta anche la terminazione del programma.
 
=== Sequenze di escape ===
:{| class="wikitable"
! Sequenza
! Nome del carattere
|-
|<code>\a</code> || beep
|-
|<code>\b</code> || backspace
|-
|<code>\f</code> || FF - ''form feed'' (salto pagina)
|-
|<code>\n</code> || LF - ''line feed'' o [[newline]]
|-
|<code>\r</code> || CR - ''carriage return'' (ritorno del carrello - cursore a inizio riga)
|-
|<code>\t</code> || tabulazione orizzontale
|-
|<code>\v</code> || tabulazione verticale
|-
|<code>\\</code> || \ (barra inversa)
|-
|<code>\'</code> || ' (apice)
|-
|<code>\"</code> || " (doppi apici)
|-
|<code>\0</code> || NULL (carattere nullo o di fine stringa)
|}
 
== Linguaggi collegati ==
 
Molti tra i principali linguaggi di programmazione moderni sono ispirati a C e ne ereditano parte della sintassi. Alcuni linguaggi (come [[Java (linguaggio di programmazione)|Java]], [[C++]], [[C sharp|C#]] e [[Objective C]]) mantengono buona parte della sintassi di C e la estendono per meglio supportare differenti paradigmi di programmazione, mentre altri linguaggi modernizzano la sintassi ma cercano di mantenere gli stessi paradigmi e domini applicativi di C, come programmazione di sistema (ad esempio [[Go (linguaggio di programmazione)|Go]]) o [[sistema embedded|sistemi integrati]] (ad esempio [[Zig (linguaggio di programmazione)|Zig]]).
 
Line 262 ⟶ 261:
 
== Bibliografia ==
* {{cita libro|autore=Dennis M. Ritchie|autore2=Brian W. Kernighan|titolo=Linguaggio C|url=https://archive.org/details/linguaggioc|anno=1985|editore=Gruppo Editoriale Jackson|isbn=88-7056-211-5}}
 
* {{cita libro| autore = Dennis M. Ritchie| autore2 = Brian W. Kernighan| titolo =Il Linguaggio C| url- =Principi https://archive.org/details/linguaggioc|di annoprogrammazione =e 1985manuale di riferimento| editore =Pearson GruppoParavia EditorialeBruno JacksonMondadori S.p.A.|ed=2| isbn=978-88-70567192-211200-53|cid=ILC2}}
* {{cita libro|autore=Steve Oualline|titolo=Practical C Programming|editore=O'Reilly Media, Inc.|città=Milano|anno=1997|url=https://books.google.it/books?id=RzmsANQ4gaAC|isbn=978-1-56592-306-5|cid=pcp}}
* {{cita libro|autore=Stephen G. Kochan|titolo=Programming in C|editore=Sams Publishing|anno=2004|url=https://books.google.it/books?id=jc5-3BArEjQC|isbn=978-0-672-33141-1|cid=pic}}
Line 272 ⟶ 271:
== Voci correlate ==
{{Div col|cols=3}}
* [[Cronologia dei linguaggi di programmazione]]
* [[Algoritmo]]
; Concetti
* [[C shell]]
* [[Ciclo di vita del software]]
* [[Code::Blocks]]
* [[Codice sorgente]]
* [[Programmazione (informatica)]]
* [[Cronologia dei linguaggi di programmazione]]
* [[Programmazione imperativa]]
* [[Cygwin]]
* [[Programmazione procedurale]]
; Persone
* [[Dennis Ritchie]]
* [[Dev-C/C++Brian Kernighan]]
; Software
* [[FreeBSD]]
* [[GNU Compiler Collection|GCC]]
* [[kernel]]
* [[Lattice C]]
* [[Libreria standard del C]]
* [[Linguaggio di programmazione]]
* [[Make]]
* [[OpenGNU SourceCompiler Collection]]
* [[OpenBSDLattice C]]
* [[Programma (informatica)|Programma]]
* [[Programmatore]]
* [[Programmazione (informatica)|Programmazione]]
* [[Programmazione imperativa]]
* [[Programmazione procedurale]]
* [[Software]]
* [[Sviluppatore software]]
* [[Tiny C Compiler]]
* [[Unix]]
* [[Unix-like]]
* [[Vero programmatore]]
{{Div col end}}
 
Line 318 ⟶ 305:
* {{Cita web |url=https://www.linux.it/~rubini/docs/A-C-X-more.html | autore=Alessandro Rubini| titolo=Approfondimenti sul linguaggio C| data=2010 | accesso=16 maggio 2017}}
* {{Cita web |url=https://stackoverflow.com/questions/tagged/c | titolo=StackOverflow C language | lingua=en | accesso=16 maggio 2017}}
* {{Cita web| url=https://www.leotutorials.com/2020/01/programming-language-study-tutorials.html| autore=Leo| titolo=C Programming language| lingua=en| accesso=16 maggio 2017| dataarchivio=16 febbraio 2020| urlarchivio=https://web.archive.org/web/20200216062037/https://www.leotutorials.com/2020/01/programming-language-study-tutorials.html| urlmorto=sì}}
* Collection of C Programming Questions - [http://placementmaster.in/ Placement Mater]
{{Norme IEC}}
{{Estensioni}}
{{Linguaggio C}}
{{Principali linguaggi di programmazione}}