C Language Tutorial
Iniziare con C Language
Ricerca…
Osservazioni
C è un linguaggio di programmazione per computer di uso generale, imperativo, che supporta programmazione strutturata, ambito variabile lessicale e ricorsione, mentre un sistema di tipo statico impedisce molte operazioni indesiderate. In base alla progettazione, C fornisce costrutti che si adattano in modo efficiente alle istruzioni tipiche della macchina e pertanto ha trovato un uso duraturo in applicazioni che erano state precedentemente codificate in linguaggio assembly, inclusi i sistemi operativi, nonché vari software applicativi per computer che vanno dai supercomputer ai sistemi embedded .
Nonostante le sue capacità di basso livello, il linguaggio è stato progettato per incoraggiare la programmazione multipiattaforma. Un programma C conforme agli standard e portabile può essere compilato per una vasta gamma di piattaforme e sistemi operativi con poche modifiche al codice sorgente. Il linguaggio è diventato disponibile su una vasta gamma di piattaforme, dai microcontrollori embedded ai supercomputer.
C è stato originariamente sviluppato da Dennis Ritchie tra il 1969 e il 1973 presso i Bell Labs e utilizzato per ri-implementare i sistemi operativi Unix . Da allora è diventato uno dei linguaggi di programmazione più utilizzati di tutti i tempi, con compilatori C di vari fornitori disponibili per la maggior parte delle architetture e dei sistemi operativi esistenti.
Compilatori comuni
Il processo per compilare un programma C differisce tra compilatori e sistemi operativi. La maggior parte dei sistemi operativi viene spedita senza un compilatore, quindi dovrai installarne uno. Alcune scelte comuni dei compilatori sono:
- GCC, la raccolta del compilatore GNU
- clang: un front-end di famiglia in linguaggio C per LLVM
- MSVC, strumenti di compilazione di Microsoft Visual C / C ++
I seguenti documenti dovrebbero darti una buona panoramica su come iniziare ad usare alcuni dei più comuni compilatori:
Supporto per la versione C del compilatore
Si noti che i compilatori hanno vari livelli di supporto per lo standard C con molti C99 ancora non completamente supportati. Ad esempio, a partire dalla versione 2015, MSVC supporta gran parte del C99 ma ha ancora alcune importanti eccezioni per il supporto del linguaggio stesso (ad esempio la pre-elaborazione sembra non conforme) e per la libreria C (ad esempio <tgmath.h>
), né documentano necessariamente le loro "scelte dipendenti dall'implementazione". Wikipedia ha una tabella che mostra il supporto offerto da alcuni compilatori popolari.
Alcuni compilatori (in particolare GCC) hanno offerto o continuano a offrire estensioni del compilatore che implementano funzionalità aggiuntive che i produttori di compilatori ritengono necessarie, utili o che potrebbero diventare parte di una versione C futura, ma che attualmente non fanno parte di alcun standard C. Poiché queste estensioni sono specifiche del compilatore, possono essere considerate non compatibili per la compatibilità e gli sviluppatori di compilatori possono rimuoverle o modificarle nelle versioni successive del compilatore. L'uso di tali estensioni può generalmente essere controllato dai flag del compilatore.
Inoltre, molti sviluppatori hanno compilatori che supportano solo versioni specifiche di C imposte dall'ambiente o dalla piattaforma a cui sono indirizzate.
Se si seleziona un compilatore, si consiglia di scegliere un compilatore che abbia il miglior supporto per l'ultima versione di C consentita per l'ambiente di destinazione.
Stile del codice (off-topic qui):
Poiché lo spazio bianco è insignificante in C (cioè, non influenza il funzionamento del codice), i programmatori utilizzano spesso uno spazio bianco per rendere il codice più facile da leggere e comprendere, questo è chiamato lo stile del codice . È un insieme di regole e linee guida utilizzate durante la scrittura del codice sorgente. Riguarda argomenti come il modo in cui le linee dovrebbero essere rientrate, se devono essere usati spazi o tabulazioni, come posizionare le parentesi, come gli spazi dovrebbero essere usati attorno agli operatori e le parentesi, come le variabili dovrebbero essere nominate e così via.
Lo stile del codice non è coperto dallo standard ed è principalmente basato sull'opinione pubblica (diverse persone trovano stili diversi più facili da leggere), in quanto tale è generalmente considerato off-topic su SO. Il consiglio imperativo sullo stile nel proprio codice è che la coerenza è fondamentale: scegliere o creare uno stile e attenersi ad esso. Basti pensare che ci sono vari stili di nome nell'uso comune che vengono spesso scelti dai programmatori piuttosto che creare il proprio stile.
Alcuni stili di rientro comuni sono: stile K & R, stile Allman, stile GNU e così via. Alcuni di questi stili hanno varianti diverse. Allman, ad esempio, è usato sia come Allman normale che come variante popolare, Allman-8. Informazioni su alcuni degli stili popolari possono essere trovate su Wikipedia . Tali nomi di stile sono presi dagli standard che gli autori o le organizzazioni pubblicano spesso per l'uso da parte di molte persone che contribuiscono al loro codice, in modo che tutti possano facilmente leggere il codice quando conoscono lo stile, come la guida alla formattazione GNU che fa parte di il documento degli standard di codifica GNU .
Alcune convenzioni di denominazione comuni sono: UpperCamelCase, lowerCamelCase, lower_case_with_underscore, ALL_CAPS, ecc. Questi stili sono combinati in vari modi per l'uso con oggetti e tipi diversi (ad esempio, le macro spesso usano lo stile ALL_CAPS)
Lo stile K & R è generalmente raccomandato per l'uso all'interno della documentazione SO, mentre gli stili più esoterici, come Pico, sono scoraggiati.
Librerie e API non coperte dallo standard C (e quindi non trattate qui):
Versioni
Versione | Standard | Data di pubblicazione |
---|---|---|
K & R | n / A | 1978/02/22 |
C89 | ANSI X3.159-1989 | 1989/12/14 |
C90 | ISO / IEC 9899: 1990 | 1990/12/20 |
C95 | ISO / IEC 9899 / AMD1: 1995 | 1995/03/30 |
C99 | ISO / IEC 9899: 1999 | 1999/12/16 |
C11 | ISO / IEC 9899: 2011 | 2011-12-15 |
Ciao mondo
Per creare un semplice programma C che stampi "Hello, World" sullo schermo, usa un editor di testo per creare un nuovo file (ad es. hello.c
- l'estensione del file deve essere .c
) contenente il seguente codice sorgente:
Ciao C
#include <stdio.h>
int main(void)
{
puts("Hello, World");
return 0;
}
Diamo un'occhiata a questo semplice programma riga per riga
#include <stdio.h>
Questa riga indica al compilatore di includere il contenuto del file di intestazione della libreria standard stdio.h
nel programma. Le intestazioni sono in genere file contenenti dichiarazioni di funzioni, macro e tipi di dati e devi includere il file di intestazione prima di utilizzarli. Questa riga include stdio.h
quindi può chiamare la funzione puts()
.
Vedi di più sulle intestazioni.
int main(void)
Questa riga avvia la definizione di una funzione. Indica il nome della funzione ( main
), il tipo e il numero di argomenti che si aspetta ( void
, che significa nessuno) e il tipo di valore restituito da questa funzione ( int
). L'esecuzione del programma inizia nella funzione main()
.
{
…
}
Le parentesi graffe vengono utilizzate in coppia per indicare dove inizia e termina un blocco di codice. Possono essere utilizzati in molti modi, ma in questo caso indicano dove inizia e finisce la funzione.
puts("Hello, World");
Questa linea chiama la funzione puts()
per l'output del testo sullo standard output (lo schermo, per impostazione predefinita), seguito da una nuova riga. La stringa da produrre è inclusa tra parentesi.
"Hello, World"
è la stringa che verrà scritta sullo schermo. In C, ogni valore letterale di stringa deve essere compreso tra virgolette "…"
.
Nei programmi C, ogni istruzione deve essere terminata da un punto e virgola (cioè ;
).
return 0;
Quando abbiamo definito main()
, lo abbiamo dichiarato come funzione che restituisce un int
, il che significa che deve restituire un intero. In questo esempio, restituiamo il valore intero 0, che viene utilizzato per indicare che il programma è stato chiuso correttamente. Dopo il return 0;
dichiarazione, il processo di esecuzione terminerà.
Modifica del programma
Gli editor di testo semplici includono vim
o gedit
su Linux o Notepad
su Windows. Gli editor multipiattaforma includono anche Visual Studio Code
o Sublime Text
.
L'editor deve creare file di solo testo, non RTF o altri formati.
Compilare ed eseguire il programma
Per eseguire il programma, questo file sorgente ( hello.c
) deve prima essere compilato in un file eseguibile (ad es. hello
su sistema Unix / Linux o hello.exe
su Windows). Questo viene fatto usando un compilatore per il linguaggio C.
Vedi di più sulla compilazione
Compilare usando GCC
GCC (GNU Compiler Collection) è un compilatore C ampiamente utilizzato. Per usarlo, apri un terminale, usa la riga di comando per navigare fino alla posizione del file sorgente e quindi eseguire:
gcc hello.c -o hello
Se non si trovano errori nel codice sorgente ( hello.c
), il compilatore creerà un file binario , il cui nome è dato dall'argomento all'opzione -o
riga di comando ( hello
). Questo è il file eseguibile finale.
Possiamo anche utilizzare le opzioni di avviso -Wall -Wextra -Werror
, che aiutano a identificare i problemi che possono causare il fallimento del programma o produrre risultati imprevisti. Non sono necessari per questo semplice programma, ma questo è il modo di aggiungerli:
gcc -Wall -Wextra -Werror -o hello hello.c
Usando il compilatore clang
Per compilare il programma usando clang
puoi usare:
clang -Wall -Wextra -Werror -o hello hello.c
In base alla progettazione, le opzioni della riga di comando clang
sono simili a quelle di GCC.
Utilizzo del compilatore Microsoft C dalla riga di comando
Se si utilizza il compilatore Microsoft cl.exe
su un sistema Windows che supporta Visual Studio e se tutte le variabili di ambiente sono impostate, questo esempio C può essere compilato utilizzando il seguente comando che produrrà un file eseguibile hello.exe
all'interno della directory in cui viene eseguito il comando in (Ci sono opzioni di avviso come /W3
per cl
, grosso modo analogo a -Wall
ecc. Per GCC o clang).
cl hello.c
Esecuzione del programma
Una volta compilato, il file binario può quindi essere eseguito digitando ./hello
nel terminale. Al momento dell'esecuzione, il programma compilato stamperà Hello, World
, seguito da una nuova riga, al prompt dei comandi.
Originale "Hello, World!" in K & R C
Quello che segue è l'originale "Hello, World!" programma tratto dal libro The C Programming Language di Brian Kernighan e Dennis Ritchie (Ritchie è stato lo sviluppatore originale del linguaggio di programmazione C presso i Bell Labs), denominato "K & R":
#include <stdio.h>
main()
{
printf("hello, world\n");
}
Si noti che il linguaggio di programmazione C non era standardizzato al momento della stesura della prima edizione di questo libro (1978) e che questo programma probabilmente non verrà compilato sulla maggior parte dei compilatori moderni a meno che non venga loro richiesto di accettare il codice C90.
Questo primissimo esempio nel libro K & R è ora considerato di scarsa qualità, in parte perché manca un tipo di ritorno esplicito per main()
e in parte perché manca un'istruzione return
. La seconda edizione del libro è stata scritta per il vecchio standard C89. In C89, il tipo di main
predefinito su int
, ma l'esempio K & R non restituisce un valore definito per l'ambiente. Negli standard C99 e successivi, è richiesto il tipo restituito, ma è sicuro tralasciare l'istruzione return
di main
(e solo main
), a causa di un caso speciale introdotto con C99 5.1.2.2.3 - equivale a restituire 0 , che indica il successo.
La forma raccomandata e più portabile di main
per i sistemi ospitati è int main (void)
quando il programma non usa alcun argomento della riga di comando, o int main(int argc, char **argv)
quando il programma usa gli argomenti della riga di comando.
C90 §5.1.2.2.3 Terminazione del programma
Un ritorno dalla chiamata iniziale alla funzione
main
equivale a chiamare la funzione diexit
con il valore restituito dalla funzionemain
come argomento. Se la funzionemain
esegue un ritorno che non specifica alcun valore, lo stato di terminazione restituito all'ambiente host non è definito.
C90 §6.6.6.4 Il return
dichiarazione
Se viene eseguita un'istruzione
return
senza un'espressione e il valore della chiamata della funzione viene utilizzato dal chiamante, il comportamento non è definito. Raggiungere il}
che termina una funzione equivale all'esecuzione di un'istruzionereturn
senza un'espressione.
C99 §5.1.2.2.3 Terminazione del programma
Se il tipo restituito della funzione
main
è un tipo compatibile conint
, un ritorno dalla chiamata iniziale alla funzionemain
equivale a chiamare la funzione diexit
con il valore restituito dalla funzionemain
come argomento; raggiungendo il}
che termina la funzionemain
restituisce un valore di 0. Se il tipo restituito non è compatibile conint
, lo stato di terminazione restituito all'ambiente host non è specificato.