C (linguaggio)
C linguaggio di programmazione | |
---|---|
Autore | Dennis Ritchie |
Data di origine | 1972 |
Ultima versione | C18 |
Utilizzo | Generico (alta efficienza) |
Paradigmi | imperativo procedurale |
Tipizzazione | Statica |
Estensioni comuni | .c per i sorgenti e .h per le intestazioni |
Influenzato da | BCPL, B, ALGOL |
Ha influenzato | Numerosi, tra cui C++, Objective-C, C#, Swift, D |
In informatica, C è un linguaggio di programmazione imperativo di natura procedurale; i programmi scritti in questo linguaggio sono composti da espressioni matematiche e da istruzioni imperative raggruppate in procedure parametrizzate in grado di manipolare vari tipi di dati.
Viene definito come un linguaggio di programmazione ad alto livello[1][2][3] e integra caratteristiche dei linguaggi di basso livello, ovvero caratteri, numeri e indirizzi, che possono essere indicati tramite gli operatori aritmetici e logici di cui si servono le macchine reali[4]. Il 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 del C. Tali librerie, sotto forma di file di intestazione o file con suffisso -h, possono essere caricate mediante la direttiva include del preprocessore.
Storia[modifica | modifica wikitesto]
Il linguaggio fu originariamente sviluppato da Dennis Ritchie[5] presso i 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.[6] 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 del C fu realizzata dall'ANSI nel 1989 (ANSI X3.159-1989), nota come C89. La stessa versione, solo con modifiche di formattazione minime, fu poi standardizzata anche dall'ISO nel 1990 (ISO/IEC 9899:1990), nota come C90. Successivamente l'ISO ha rilasciato altre quattro versioni del linguaggio C, note come C95 (ISO/IEC 9899/AMD1:1995), 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++.
Descrizione[modifica | modifica wikitesto]
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, librerie, giochi e per applicazioni altamente performanti; è rinomato per la sua 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 domini applicativi caratterizzati mirati sull'efficienza. Esempi tipici sono le telecomunicazioni, il controllo di processi industriali e il software sistema real-time. Il predominio del C in questi contesti è in parte diminuito a seguito dell'avvento di alternative significative, primo fra tutti il C++.
Il C ha anche una notevole importanza didattica, sebbene, per la sua complessità 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 il C come linguaggio di riferimento a causa della sua importanza tecnica, oggi questa scelta trova un'ulteriore motivazione nella crescente importanza di linguaggi che dal C derivano (per esempio C++, Java e C# e, per consentire allo studente un approccio iniziale più rapido e intuitivo, linguaggi ad alto livello come Python).
Caratteristiche generali[modifica | modifica wikitesto]
Il 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 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, 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 il C un linguaggio particolarmente efficiente. Inoltre, rispetto al linguaggio assembly, il C ha in più una struttura logica definita e leggibile, funzioni in stile Pascal e soprattutto il controllo sui tipi (in fase di compilazione), che manca completamente nel linguaggio assembly.
La sintassi del C è piuttosto versatile e il linguaggio è in 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 del 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, il 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 The C Programming Language, nel quale il linguaggio venne definito in modo preciso.
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 del 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 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 (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[modifica | modifica wikitesto]
C99
- Il tipo di dato
_Bool
, che ammette la memorizzazione dei booleani false e true; - Il tipo di dato
_Complex
per la rappresentazione dei numeri complessi; - Il tipo di dato
_Imaginary
per la rappresentazione dei numeri immaginari; - Il tipo di dato
long long int
; - Il tipo booleano in
<stdbool.h>
; - Le funzionalità addizionali floating-point in
<float.h>
; - I commenti su linea singola introdotti da //;
- Le funzioni
inline
; - Il qualificatore di tipo
restrict
, ammissibile solo sui puntatori (restricted pointer); - È rimosso l'
int
implicito di ritorno; - La lunghezza variabile dell'array (VLA, variable-length array);
- I letterali composti (Compound literals);
- Gli inizializzatori designati (Designated initializers)
- È ammesso dichiarare variabili ovunque si desidera nell'ambito di un blocco di codice così come frapporre tra di esse altre istruzioni;
- Le funzioni della famiglia vscanf;
- Le regole per le costanti di tipo intero;
- Le regole di promozione degli interi (integer promotion);
- Le macro matematiche di tipo generico in
<tgmath.it>
; - Le macro con un numero variabile di argomenti;
- La macro
va_copy
; - Lo specificatore di conversione %lf nella funzione printf();
- Il supporto all'aritmetica IEEE Floating-Point (IEC 559);
- L'operatore di preprocessing
_Pragma
.
C11
Lo standard c11 ha introdotto cinque nuovi file header, ovvero <stdalign.h>
, <stdatomic.h>
, <stdnoreturn.h>
, <threads.h>
e <uchar.h>
, nonché diverse funzionalità che hanno contribuito a migliorare il linguaggio:
- Le macro inerenti le specifiche di allineamento della memoria col relativo file header
<stdalign.h>
, tra cui_Alignas
e_Alignof
, nonché la funzionealigned_alloc
(Memory Alignment Control); - Aggiunto il supporto al multi-threading. Le nuove funzionalità sono fornite dalla libreria dei threads dichiarata nel file header
<threads.h>
. Aggiunto anche il qualificatore di tipo_Atomic
nell'header file<stdatomic.h>
; - Le strutture (
struct
) e le unioni (union
) anonime; - Espressioni di tipo generico mediante la parola chiave
_Generic
(type-generic expressions); - Migliorato il supporto unicode con i tipi di dato
char16_t
(UTF-16) echar32_t
(UTF-32) con le relative funzioni di conversione dichiarate in<uchar.h>
; - Rimossa la funzione
gets()
dichiarata in<stdio.h>
; - Lo specificatore
_Noreturn
applicabile alle funzioni; - Le asserzioni statiche mediante la parola chiave
_Static_assert
(Static Assertions); - La funzione
quick_exit
per la terminazione di un programma; - Bounds-checking interfaces (Annex K);
- Analyzability features (Annex L);
- La modalità esclusiva "
x
" di apertura e creazione file (Exclusive create-and-open mode): - Le macro per la creazione di numeri complessi in
<complex.h>
.
Parole chiave[modifica | modifica wikitesto]
Il linguaggio C, come qualsiasi altro linguaggio di programmazione, consente la realizzazione di programmi adoperando un insieme di "parole chiave" (keywords).
Lo standard ANSI ha definito il seguente insieme di parole chiave: 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.
Programma di esempio[modifica | modifica wikitesto]
Hello world![modifica | modifica wikitesto]
Il seguente esempio stampa il testo "Hello world!" ("Ciao mondo!") sullo standard output (che normalmente coincide con lo schermo del 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.
#include <stdio.h>
int main()
{
printf("Hello world!\n");
return 0;
}
Quanto segue è un'analisi linea per linea del programma mostrato; questo tipo di scrittura è eseguibile soltanto su sistemi basati su UNIX.
#include <stdio.h>
Questa linea è una direttiva per il preprocessore. Il preprocessore è un programma (o un modulo di un 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") "stdio.h
". 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:
#include "nomeheader.h"
Con al posto di nomeheader il nome dell'header desiderato.
Un header file, in C, è un file che contiene dichiarazioni di tipi di dati e di funzioni; nel caso specifico, viene incluso per introdurre nel sorgente la dichiarazione della funzione di libreria standard printf.
Tale dichiarazione, specifica quali tipi di parametri sia obbligatorio e consentito fornire alla printf
e di che tipo sia il suo valore tornato. Entrambe queste informazioni saranno poi usate dal compilatore per verificare che l'uso che "Hello world!" fa di questa funzione sia corretto.
Al posto di printf
si può anche utilizzare la funzione puts
, scritta come
puts("Hello world!");
int main()
Una linea di questo tipo costituisce l'inizio di una definizione di funzione, in questo caso la funzione main
. La funzione main
costituisce il punto di ingresso di un programma C: l'esecuzione di un programma inizia dalla prima istruzione del main
e termina con l'ultima. Eventuali altre funzioni entreranno in gioco solo se e quando richiamate (direttamente o indirettamente) dal main
. In assenza di una funzione main
, il compilatore non può produrre un programma eseguibile (ma potrebbe produrre una libreria).
La parola chiave iniziale int
rappresenta il tipo del valore restituito dalla funzione. Nel caso speciale del main
, 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 main
restituisce sempre un numero intero, nonostante alcuni testi riportino erroneamente anche dichiarazioni della funzione main
con tipo di ritorno void
(vedi ANSI C).
{
Le parentesi graffe sono utilizzate in C per indicare l'inizio e la fine di un blocco, una unità di programma; in questo caso, la funzione main
.
printf("Hello, world!\n");
Questa riga costituisce una chiamata di funzione; in altre parole, richiede che venga eseguita tale funzione. printf
è una funzione della libreria standard del 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).
"\n" è una sequenza di escape, ovvero una sequenza di caratteri (che in C cominciano sempre con il carattere "\") che verranno tradotti in fase di compilazione in un unico carattere (solitamente non stampabile od interpretato in altro modo). In particolare, "\n" verrà tradotto nel carattere di fine riga che, quando usato con le librerie standard in modalità testo (come con printf
), 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.
Il punto e virgola finale della riga indica la fine dell'istruzione (la chiamata a funzione).
return 0;
Un'istruzione iniziata con la parola chiave return
, 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 main
, come si è detto sopra, questo valore sarà tornato al sistema operativo (0
è il valore di ritorno al sistema che, convenzionalmente, indica la terminazione con successo di un programma).
Esempio di calcolatrice[modifica | modifica wikitesto]
Esempio di calcolatrice che esegue la somma, il prodotto, la differenza ed il quoto di due numeri interi:
#include <stdio.h> //Specifica la libreria usata dal programma
int main() {
int a; //Primo valore
int b; //Secondo valore
int somma; //Somma dei due valori
int prodotto; //Prodotto dei due valori
int differenza; //Differenza dei due valori
int quoto; //Quoto dei due valori
printf("Inserisci il primo numero: "); //Stampa sulla console
scanf("%d", &a); //Legge un valore intero e lo "inserisce" nella variabile "a"
printf("Inserisci il secondo numero: "); //Stampa sulla console
scanf("%d", &b); //Legge un valore intero e lo "inserisce" nella variabile "b"
somma = a + b; //Calcola la somma del contenuto della variabile "a" e di quello di "b" e lo "inserisce" nella variabile "somma"
prodotto = a * b; //Calcola il prodotto del contenuto della variabile "a" e di quello di "b" e lo "inserisce" nella variabile "prodotto"
differenza = a - b; //Calcola la differenza del contenuto della variabile "a" e di quello di "b" e lo "inserisce" nella variabile "differenza"
if(b != 0) { //Controlla che la variabile "b" contenga un valore diverso da 0
quoto = a / b; //Calcola il quoziente del contenuto della variabile "a" e di quello di "b" e lo "inserisce" nella variabile "quoto"
}
printf("La somma e': %d\n", somma); //Stampa sulla console una stringa con il valore della variabile "somma"
printf("Il prodotto e': %d\n", prodotto); //Stampa sulla console una stringa con il valore della variabile "prodotto"
printf("La differenza e': %d\n", differenza); //Stampa sulla console una stringa con il valore della variabile "differenza"
if(b != 0) { //Controlla che la variabile "b" contenga un valore diverso da 0
printf("Il quoto e': %d\n", quoto); //Stampa sulla console una stringa con il valore della variabile "quoto"
}
return 0; //Restituisce 0 e termina il programma
}
Spiegazione
- "int" definisce le variabili come interi (a, b, somma, prodotto, differenza e quoto sono variabili)
- "printf" è l'istruzione che stamperà a video ciò che è contenuto tra le virgolette
- "scanf" legge l'input e lo colloca nella variabile ("&a"). In questo caso in numeri decimali ("%d")
- "+", "*", "-", "/" sono, rispettivamente, gli operatori di somma, prodotto, differenza e quoto
- La sintassi "if()" controlla se il contenuto all'interno delle parentesi tonde è vero (true). In caso positivo esegue le funzioni dentro le parentesi graffe (in questo caso: "quoto = a / b")
- La sintassi "!=" significa "diverso". In questo esercizio viene controllato se "b" è diverso da 0; in caso venga eseguita una divisione col divisore uguale a 0, il programma andrà in errore.
- "La somma e': "%d", somma Al posto di "%d" verrà stampato il contenuto di "somma" (%d significa verrà stampato un numero intero)
- "return" è la parola chiave che indica la terminazione della funzione, restituendo il valore 0. La terminazione della funzione main() determina anche la terminazione del programma.
Sequenze di escape[modifica | modifica wikitesto]
Sequenza Nome del carattere \a beep \b backspace \f FF - form feed (salto pagina) \n LF - line feed o newline \r CR - carriage return (ritorno del carrello - cursore a inizio riga) \t tabulazione orizzontale \v tabulazione verticale \\ \ (barra inversa) \' ' (apice) \" " (doppi apici) \0 NULL (carattere nullo o di fine stringa)
Linguaggi collegati[modifica | modifica wikitesto]
Molti tra i principali linguaggi di programmazione moderni sono ispirati al C e ne ereditano parte della sintassi. Alcuni linguaggi (come Java, C++, C# e Objective C) mantengono buona parte della sintassi del 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 del C, come programmazione di sistema (ad esempio Go) o sistemi integrati (ad esempio Zig).
C++[modifica | modifica wikitesto]
Il linguaggio di programmazione C++ fu originariamente derivato dal C. Tuttavia, non tutti i programmi C sono validi in C++. Mentre C e C++ evolvevano indipendentemente, sono aumentate le loro incompatibilità[7]. La versione del C99 creò un numero di conflitti in più. Le differenze rendono difficile la scrittura di programmi e librerie che funzionino sia in C che in C++, e creano confusione in chi programma in entrambi i linguaggi. La disparità rende difficile per entrambi i linguaggi l'adozione di caratteristiche dall'altro.
Bjarne Stroustrup, il creatore di C++, ha ripetutamente suggerito[8] che le incompatibilità tra il C e il C++ dovrebbero essere ridotte il più possibile per massimizzare l'interoperatività tra i due linguaggi. Altri hanno sostenuto che poiché il C e il C++ sono linguaggi differenti, la compatibilità tra i due è utile ma non vitale. Secondo questa posizione, gli sforzi per ridurre l'incompatibilità non devono ostacolare i tentativi per migliorare in modo autonomo i linguaggi.
Oggi, le maggiori differenze (a parte l'aggiunta nel C++ delle classi, template, namespace, overloading) tra i due linguaggi sono:
inline
- le funzioni inline hanno lo scope globale in C++,- Il tipo
bool
nel C99 è definito nel<stdbool.h>
. Gli standard precedenti del C non definivano un tipo boolean, e vari (incompatibili) metodi erano usati per simulare il tipo booleano. - Singole costanti di caratteri hanno la dimensione di un
int
in C e di unchar
in C++. - Parole chiave addizionali sono introdotte nel C++, e quindi non possono essere usate come identificatori come invece era lecito in C (per esempio
try
,catch
,template
,new
,delete
, ...) - In C++, il compilatore crea automaticamente un tag per ogni
struct
,union
oenum
, quindistruct S {};
in C++, in C è equivalente atypedef struct S {} S;
.
Objective-C[modifica | modifica wikitesto]
Il linguaggio Objective C deve la sua popolarità a Apple che lo ha scelto come base per i suoi sistemi operativi macOS, iOS, watchOS e tvOS. È un linguaggio orientato agli oggetti e, a differenza del C++, mantiene la piena compatibilità con il C.
Nel 2014, Apple presenta un nuovo linguaggio, Swift che ha sostituito Objective C nella programmazione sui sistemi operativi sopracitati.
Note[modifica | modifica wikitesto]
- ^ Oualline, p. 8.
- ^ Kochan, p. 1.
- ^ Deitel, p. 7.
- ^ Il Linguaggio C - Principi di programmazione e manuale di riferimento (Seconda edizione) - Brian W. Kernighan, Dennis M. Ritchie, Pearson Prentice Hall, p. Introduzione - XIV.
- ^ Dennis Ritchie e Brian Kernighan, XI, in Il linguaggio C. Principi di programmazione e manuale di riferimento, Prentice Hall, 2004, p. 320.
«Il C fu progettato e scritto per il sistema operativo UNIX, sul DEC PDP-11, da Dennis Ritchie». - ^ (EN) Dennis Ritchie, The Development of the C Language (PDF), su Bell Labs/Lucent Technologies, 1993. URL consultato il 1º maggio 2017.
«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». - ^ Incompatibilities Between ISO C and ISO C++, su david.tribble.com.
- ^ Sibling Rivalry: C and C++ (PDF), su research.att.com.
Bibliografia[modifica | modifica wikitesto]
- Dennis M. Ritchie e Brian W. Kernighan, Linguaggio C, Gruppo Editoriale Jackson, 1985, ISBN 88-7056-211-5.
- Steve Oualline, Practical C Programming, Milano, O'Reilly Media, Inc., 1997, ISBN 978-1-56592-306-5.
- Stephen G. Kochan, Programming in C, Sams Publishing, 2004, ISBN 978-0-672-33141-1.
- Harvey M. Deitel, Paul J. Deitel, C. Corso completo di programmazione, Milano, Apogeo Editore, 2007, ISBN 978-88-503-2633-4.
- Stephen G. Kochan, Programmare in C. Introduzione al linguaggio, Pearson, 2011, p. 336, ISBN 978-88-7192-660-5.
- Luciano M. Barone, Enzo Marinari, Giovanni Organtini e Federico Ricci-Terseng, Programmazione Scientifica. Linguaggio C, algoritmi e modelli nella scienza, Pearson Education Italia, 2006, p. 656, ISBN 978-88-7192-242-3.
Voci correlate[modifica | modifica wikitesto]
- Algoritmo
- C shell
- Ciclo di vita del software
- Code::Blocks
- Codice sorgente
- Cronologia dei linguaggi di programmazione
- Cygwin
- Dennis Ritchie
- Dev-C/C++
- FreeBSD
- GCC
- kernel
- Lattice C
- Libreria standard del C
- Linguaggio di programmazione
- Make
- Open Source
- OpenBSD
- Programma
- Programmatore
- Programmazione
- Programmazione imperativa
- Programmazione procedurale
- Software
- Sviluppatore software
- Tiny C Compiler
- Unix
- Unix-like
- Vero programmatore
Altri progetti[modifica | modifica wikitesto]
Wikibooks contiene testi o manuali sul linguaggio C
Wikiversità contiene risorse sul linguaggio C
Wikimedia Commons contiene immagini o altri file sul linguaggio C
Collegamenti esterni[modifica | modifica wikitesto]
- (EN) gruppo di lavoro inerente allo standard C, JTC1/SC22/WG14 - C, su open-std.org. URL consultato il 16 maggio 2017.
- Politecnico di Torino, Corso di programmazione in C, su staff.polito.it, 2010. URL consultato il 16 maggio 2017.
- (EN) Jens Gustedt, ModernC (PDF), su icube-icps.unistra.fr, 11 aprile 2017. URL consultato il 16 maggio 2017 (archiviato dall'url originale il 30 giugno 2017).
- cppreference, C reference, su it.cppreference.com. URL consultato il 16 maggio 2017.
- (EN) GeeksforGeeks, C Programming language, su geeksforgeeks.org. URL consultato il 16 maggio 2017.
- (EN) The International Obfuscated C Code Contest, su www0.us.ioccc.org. URL consultato il 16 maggio 2017 (archiviato dall'url originale il 3 maggio 2017).
- (EN) Steve Summit, comp.lang.c Frequently Asked Questions, su c-faq.com, 2005. URL consultato il 16 maggio 2017.
- Alessandro Rubini, Approfondimenti sul linguaggio C, su linux.it, 2010. URL consultato il 16 maggio 2017.
- (EN) StackOverflow C language, su stackoverflow.com. URL consultato il 16 maggio 2017.
- (EN) Leo, C Programming language, su leotutorials.com. URL consultato il 16 maggio 2017.
- Collection of C Programming Questions - Placement Mater
Controllo di autorità | LCCN (EN) sh85018532 · GND (DE) 4113195-2 · BNF (FR) cb119665180 (data) |
---|