C LanguageKomma igång med C-språk


Anmärkningar

C är ett allmänt syfte, nödvändigt datorprogrammeringsspråk, som stöder strukturerad programmering, lexikal variabel räckvidd och rekursion, medan ett statiskt system förhindrar många oavsiktliga operationer. Genom design tillhandahåller C konstruktioner som kartlägger effektivt till typiska maskininstruktioner, och därför har den hittat varaktig användning i applikationer som tidigare hade kodats på monteringsspråk, inklusive operativsystem, samt olika applikationsprogramvara för datorer som sträcker sig från superdatorer till inbäddade system .

Trots dess låga nivåer, var språket utformat för att uppmuntra plattformsprogrammering. Ett standardkompatibelt och portabelt skriven C-program kan sammanställas för ett mycket brett utbud av datorplattformar och operativsystem med få ändringar i dess källkod. Språket har blivit tillgängligt på ett mycket brett spektrum av plattformar, från inbäddade mikrokontroller till superdatorer.

C utvecklades ursprungligen av Dennis Ritchie mellan 1969 och 1973 på Bell Labs och användes för att implementera Unix- operativsystemen igen. Det har sedan dess blivit ett av de mest använda programmeringsspråken genom tiderna, med C-kompilatorer från olika leverantörer tillgängliga för de flesta befintliga datorarkitekturer och operativsystem.

Vanliga kompilatorer

Processen att sammanställa ett C-program skiljer sig mellan kompilatorer och operativsystem. De flesta operativsystem levereras utan en kompilator, så du måste installera ett. Några vanliga val av kompilatorer är:

Följande dokument ska ge dig en bra överblick över hur du kommer igång med att använda några av de vanligaste kompilatorerna:

Support för Compiler C-version

Observera att kompilatorer har olika nivåer av stöd för standard C, med många som fortfarande inte helt stöder C99. Till exempel, från 2015 års utgåva stöder MSVC mycket av C99 men har fortfarande några viktiga undantag för stöd för själva språket (t.ex. förbehandlingen verkar inte överensstämmande) och för C-biblioteket (t.ex. <tgmath.h> ), inte heller dokumenterar de nödvändigtvis sina "implementeringsberoende val". Wikipedia har en tabell som visar support som erbjuds av vissa populära kompilatorer.

Vissa kompilatorer (särskilt GCC) har erbjudit, eller fortsätter att erbjuda, kompilatorförlängningar som implementerar ytterligare funktioner som kompilatorproducenterna anser nödvändiga, hjälpsamma eller tror kan bli en del av en framtida C-version, men som för närvarande inte ingår i någon C-standard. Eftersom dessa tillägg är kompilatorspecifika kan de betraktas som inte tvärkompatibla och kompilatorutvecklare kan ta bort eller ändra dem i senare kompilatorversioner. Användningen av sådana förlängningar kan generellt styras av kompilatorflaggor.

Dessutom har många utvecklare kompilatorer som endast stöder specifika versioner av C som påläggs av den miljö eller plattform som de riktar sig till.

Om du väljer en kompilator, rekommenderas det att välja en kompilator som har det bästa stödet för den senaste versionen av C som är tillåten för målmiljön.

Kodstil (utanför ämnet här):

Eftersom vitt utrymme är obetydligt i C (det vill säga det påverkar inte kodens funktion) använder programmerare ofta vitt utrymme för att göra koden lättare att läsa och förstå, det kallas kodstilen . Det är en uppsättning regler och riktlinjer som används när du skriver källkoden. Den täcker oro som hur linjer ska indragas, om mellanrum eller flikar ska användas, hur hängslen ska placeras, hur rymden ska användas runt operatörer och parenteser, hur variabler ska namnges osv.

Kodstil omfattas inte av standarden och är främst meningsbaserad (olika människor tycker att olika stilar är lättare att läsa), som sådan anses det vanligtvis utanför ämnet på SO. Det övergripande rådet om stil i ens egen kod är att konsistens är av avgörande betydelse - välj, eller gör, en stil och håll dig fast vid den. Det räcker med att förklara att det finns olika namngivna stilar i vanlig användning som ofta väljs av programmerare snarare än att skapa sin egen stil.

Vissa vanliga strecksatser är: K & R-stil, Allman-stil, GNU-stil och så vidare. Vissa av dessa stilar har olika varianter. Allman, till exempel, används som antingen vanlig Allman eller den populära varianten, Allman-8. Information om några av de populära stilarna finns på Wikipedia . Sådana stilnamn är hämtade från de standarder som författarna eller organisationerna ofta publicerar för användning av de många som bidrar till deras kod, så att alla lätt kan läsa koden när de känner till stilen, till exempel GNU-formateringsguiden som utgör en del av GNU-kodningsstandarddokumentet .

Några vanliga namnkonventioner är: UpperCamelCase, LowerCamelCase, Lower_case_with_underscore, ALL_CAPS osv. Dessa stilar kombineras på olika sätt för användning med olika objekt och typer (t.ex. använder makron ofta ALL_CAPS-stil)

K & R-stil rekommenderas vanligtvis för användning i SO-dokumentation, medan de mer esoteriska stilarna, såsom Pico, är avskräckta.

Bibliotek och API: er som inte omfattas av C-standarden (och därför inte är ämne här):

versioner

Version Standard Publiceringsdatum
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

Hej världen

För att skapa ett enkelt C-program som skriver ut "Hej, värld" på skärmen använder du en textredigerare för att skapa en ny fil (t.ex. hello.c - filändelsen måste vara .c ) som innehåller följande källkod:

Hej C

#include <stdio.h>

int main(void)
{
    puts("Hello, World");
    return 0;
}
 

Live-demo på Coliru

Låt oss titta på detta enkla program rad för rad

#include <stdio.h>
 

Den här raden berättar kompilatorn att inkludera innehållet i standardbibliotekets rubrikfil stdio.h i programmet. Rubriker är vanligtvis filer som innehåller funktionsdeklarationer, makron och datatyper, och du måste inkludera rubrikfilen innan du använder dem. Denna rad inkluderar stdio.h så att den kan ringa funktionen puts() .

Se mer om rubriker.

int main(void)
 

Denna rad startar definitionen av en funktion. Den anger namnet på funktionen ( main ), typen och antalet argument som den förväntar sig ( void , vilket betyder ingen) och vilken typ av värde som den här funktionen returnerar ( int ). Programutförande startar i huvudfunktionen main() .

{
    …
}
 

De lockiga hängslen används parvis för att indikera var ett kodblock börjar och slutar. De kan användas på många sätt, men i detta fall anger de var funktionen börjar och slutar.

    puts("Hello, World");
 

Den här raden anropar puts() -funktionen för att mata ut text till standardutdata (skärmen som standard) följt av en ny linje. Strängen som ska matas ut ingår i parenteserna.

"Hello, World" är strängen som kommer att skrivas på skärmen. I C måste varje strängbokstavligt värde vara inne i de dubbla citaten "…" .

Se mer om strängar.

I C-program måste varje uttalande avslutas av en semikolon (dvs ; ).

    return 0;
 

När vi definierade main() förklarade vi det som en funktion som returnerar ett int , vilket betyder att det måste returneras ett heltal. I det här exemplet returnerar vi heltalvärdet 0, som används för att indikera att programmet har avslutat framgångsrikt. Efter return 0; uttalande kommer exekveringsprocessen att avslutas.

Redigera programmet

Enkla textredigerare inkluderar vim eller gedit på Linux eller Notepad på Windows. Cross-platform redaktörer inkluderar också Visual Studio Code eller Sublime Text .

Redaktören måste skapa vanliga textfiler, inte RTF eller något annat format.

Kompilera och köra programmet

För att köra programmet måste den här källfilen ( hello.c ) först sammanställas till en körbar fil (t.ex. hello på Unix / Linux-system eller hello.exe på Windows). Detta görs med en kompilator för C-språket.

Se mer om sammanställning

Kompilera med GCC

GCC (GNU Compiler Collection) är en mycket använt C-kompilator. För att använda den öppnar du en terminal, använder kommandoraden för att navigera till källfilens plats och sedan köra:

gcc hello.c -o hello
 

Om inga fel finns i källkoden ( hello.c ), kommer kompilatorn att skapa en binär fil, vars namn ges av argument till -o kommandorad alternativ ( hello ). Detta är den slutliga körbara filen.

Vi kan också använda varningsalternativen -Wall -Wextra -Werror , som hjälper till att identifiera problem som kan göra att programmet misslyckas eller ger oväntade resultat. De är inte nödvändiga för det här enkla programmet men det är sättet att lägga till dem:

gcc -Wall -Wextra -Werror -o hello hello.c
 

Använda clang-kompilatorn

För att sammanställa programmet med hjälp av clang du använda:

clang -Wall -Wextra -Werror -o hello hello.c
 

Genom design, clang kommandoradsalternativ liknar dem i GCC.

Använda Microsoft C-kompilatorn från kommandoraden

Om du använder Microsoft cl.exe kompilatorn i ett Windows-system som stöder Visual Studio och om alla miljövariabler är inställda kan detta C-exempel kompileras med följande kommando som ger en körbar hello.exe i katalogen som kommandot körs i (Det finns varningsalternativ som /W3 för cl , ungefär analogt med -Wall etc för GCC eller clang).

cl hello.c
 

Utför programmet

När den har kompilerats kan den binära filen sedan ./hello genom att skriva ./hello i terminalen. Vid körning kommer det sammanställda programmet att skriva ut Hello, World följt av en ny linje till kommandotolken.

Original "Hej, världen!" i K&R C

Följande är originalet "Hej, världen!" program från boken The C Programming Language av Brian Kernighan och Dennis Ritchie (Ritchie var den ursprungliga utvecklaren av C-programmeringsspråket på Bell Labs), kallad "K&R":

K & R
#include <stdio.h>

main()
{
    printf("hello, world\n");
}
 

Lägg märke till att C-programmeringsspråket inte standardiserades vid skrivandet av den första utgåvan av denna bok (1978), och att detta program antagligen inte kommer att kompilera på de flesta moderna kompilatorer såvida de inte instrueras att acceptera C90-kod.

Detta första exempel i K & R bok anses nu vara dålig kvalitet, bland annat eftersom den saknar en uttrycklig returtyp för main() , dels eftersom den saknar en return uttalande. Den andra upplagan av boken skrevs för den gamla C89-standarden. I C89 skulle typ av main standard vara int , men K & R-exemplet returnerar inte ett definierat värde till miljön. I C99 och senare standarder typen avkastning som krävs, men det är säkert att lämna ut return uttalande main (och enda main ), på grund av ett specialfall introduceras med C99 5.1.2.2.3 - det motsvarar att återvända 0 , vilket indikerar framgång.

Den rekommenderade och mest bärbara formen för main för värdade system är int main (void) när programmet inte använder några kommandoradsargument, eller int main(int argc, char **argv) när programmet använder kommandoradsargumenten.


C90 §5.1.2.2.3 Programuppsägning

En återgång från det första samtalet till den main funktion är likvärdigt med att ringa exit funktionen med värdet som returneras av main funktion som dess argument. Om main utför en avkastning som anger inget värde, är avslutningsstatus returneras till värdmiljön odefinierad.

C90 §6.6.6.4 Den return uttalande

Om en return uttalande utan ett uttryck utförs, och värdet av funktionen samtalet används av den som ringer, är beteendet odefinierat. Nå } som avslutar en funktion motsvarar att köra en return uttalande utan ett uttryck.

C99 §5.1.2.2.3 Programuppsägning

Om retur typen av main är en typ kompatibel med int , en retur från det första samtalet till main motsvarar anropa funktionen exit funktion med värdet som returneras av main funktion som dess argument; når } som avslutar main returnerar värdet 0. Om returtypen inte är kompatibel med int , är avslutningsstatus returneras till värdmiljön ospecificerad.