C programovací jazyk
C je programovací jazyk vyvinut Dennisem Ritchieem, v brzy sedmdesátá léta, pro použití na Unixu operační systém. To je nyní používáno na prakticky každém operačním systému, a je nejvíce populární jazyk pro psaní programové vybavení, ačkoli to je také užité na napsaní přihlášek. To je také běžně používané v informatice vzdělání. Populární C + + programovací jazyk je umístěný na C.
C je relativně minimalistický programovací jazyk. To je významně nižší-úroveň než většina jiných programovacích jazyků. Dokonce ačkoli to je někdy odkazoval se na jak”jazyk vysoké úrovně”, to je jen opravdu vyšší-úroveň než různé jazyky symbolických instrukcí.
C má dvě důležité výhody přes shromáždění. Firstly, kód je obecně snadnější ke čtení a hodně méně těžký psát, obzvláště pro zdlouhavé programy. Secondly, kód shromáždění je obvykle použitelný jen k přesný architektura počítače, zatímco C program může být ported k nějaké architektuře na kterém C kompilátor a jistý požadovaný knihovny existují. (C kód je téměř vždy zkompilovaný, poněkud než interpretovaný.) na druhé straně, efektivita C kód je poněkud závislý na schopnosti kompilátora optimalizovat vyplývat programovací jazyk, který je velmi ven kontroly programátora. V kontrastu, výkonnost kódu shromáždění je přesně předurčená od té doby, co shromáždění je jen člověk-čitelný zápis pro programovací jazyk. Z tohoto důvodu, programuje takový jak provozní systém kernelss, ačkoli většinou psaný v C, smět obsahovat “ruka-ladil” fragmenty jazyka symbolických instrukcí kde výkon je obzvláště velmi důležitý.
Podobné výhody a disadvantages rozlišovat C od vyšší-jazyky úrovně: efektivita C kód může být více blízko kontrolovaný, u ceny bytí obecně více obtížný číst a psát. Poznámka, nicméně, to C je přinejmenším jak přenosný jak vyšší-jazyky úrovně, protože nowadays většina architektur počítače je vybaveno s C kompilátor a knihovny; ve faktu, kompilátorech, knihovnách a tlumočnících vyšší-jazyky úrovně jsou často realizovány v C!
Jeden z nejpozoruhodnějších rysů C je že to je nahoru k programátoru řídit obsah paměti počítače. Standard C poskytuje žádné talenty na sadové hranice kontrolovat to nebo automatický odvoz odpadu. V kontrastu, Java a C # jazyky, oba potomci C, poskytovat automat správa paměti, včetně odvozu odpadu. Zatímco manuální správa paměti opatří programátorovi větší odchylku v ladění výkon programu, to také usnadní to produkovat chyby zahrnovat chybné pamětové operace, takový jak vyrovnávací paměť přetéká. Chyby tito třídí získali proslulost pro jejich účinky na nejistotu počítače. Některé nástroje byly vytvořené k nápovědě C programátoři vyhnou se pamětovým chybám, včetně knihoven pro sadu předvádění ověřování hranic a automatický odvoz odpadu, a automatizované zdrojové kódové dámy takový jako Lint.
Některé ty specifické znaky C být:
- An extrémně jednoduchý jazyk jádra, s nepodstatnou funkčností poskytovanou standardizovaným souborem knihovních rutin.
- Zájem o procedurální programovací vzor, s talenty na programování v uspořádaném style.
- Použití preprocesorového jazyka, C preprocesor, pro úlohy takový jak definovat makra a obsahovat rozmanitý zdrojový kód defiluje.
- O (1) výkon pro všechny operátory.
- Nízkoúrovňový přístup k paměti počítače přes použití ukazatelů.
- Parameterss je vždy předán funkcím hodnotou, nikdy odkazem.
- Lexikální proměnné scoping (ale žádná podpora pro uzavření nebo funkce definované ve funkcích).
Historie
Počáteční vývoj C nastal u U a T; Bell laboratoře mezi 1969 a 1973; shodovat se k Ritchieovi, nejtvořivější období vyskytovalo se v 1972. To bylo jmenováno “C” protože mnoho z jeho rysů byl odvozen z časnějšího jazyka nazvaný”B”. Účty se liší pozorovat původy jména “B”: Ken Thompson připočítá BCPL programovací jazyk, ale on také vytvořil jazyk volal Bon v jeho cti manželka Bonnie.
1973, C jazyk stal se silný dost ta většina Unixu jádro, původně zapsaný PDP-11/20 jazyk symbolických instrukcí, byl přepsán v C. toto byl jeden z prvních jádr operačního systému realizovaných v jazyce jiný než shromáždění, časnější příklady být Multics systém (zapsaný PL/já) a Tripos (zapsaný BCPL.)
V 1978, Ritchie a Brian Kernighan vydal první vydání C programovací jazyk. Tato kniha, známý k C programátoři jak “K a R”, sloužil na mnoho let jak neformální specifikace jazyka. Verze C že to popíše je obyčejně odkazoval se na jak “K a R C.” (druhé vydání knižních obálek pozdnější ANSI C standard, popsal dole.)
K a R představil následující rysy k jazyku:
structdatové typydlouhé intdatový typnepodepsané intdatový typ=+operátor byl změněný k+=, a tak dále (=+byl matoucí C překladačový lexikální analyzátor).
V rokách po publikaci K a R C, několik “neoficiálních” rysů bylo přidáno k jazyku, podporovaný kompilátory od u a T a někteří jiní prodavači. Tito obsahovali:
nicotafunguje aneplatný *datový typ- funguje vracet se
structneboodbortypy structjména pole v odděleném jmenném prostoru pro každý typ struct- domácí cvičení pro
structdatové typy constkvalifikace dělat objekt nepřepisovatelný- standardní knihovna včleňovat většinu funkčnosti realizované různými prodavači
- výčty
- jeden-preciznost
plavidlotyp
ANSI C a ISO C
Během pozdní sedmdesátá léta, C začal nahradit Základní jako prokládání mikropočítačový programovací jazyk. Během osmdesátých lét, to bylo přijato k použití s IBM PCa jeho popularita začala ke zvýšení významně. Současně, Bjarne Stroustrup a jiní u Bell laboratoře začaly práci na sčítajícím objektově orientovaném programování pojmy jazyka k C. jazyk, který oni produkovali, nazvaný C + +, je nyní nejvíce obyčejný aplikační programovací jazyk na Microsoft Windows operační systém; C zůstane více populární ve světě unixu.
V 1983, Američan institut národních norem (ANSI) ustavil výbor, X3J11, založit specifikaci standardu C. po dlouhém a svízelném procesu, standard byl dokončen v 1989 (jeden rok po první ANSI standard pro C + +!) a ratifikovaný jako ANSI X3.159-1989 “programovací jazyk C”. Tato verze jazyka je často odkazoval se na jak ANSI C. V 1990, ANSI C standard (s nemnoho menších modifikací) byl adoptován Organizací mezinárodních úrovní (ISO) jak ISO/IEC 9899: 1990.
Jeden z cílů ANSI C proces standardizace měl produkovat superset K a R C, včlenit mnoho z neoficiálních rysů následovně představil. Nicméně, výbor standardů také zahrnoval několik nových rysů, takový jako prototypy funkce (půjčil si od C + +), a schopnější preprocesor.
ANSI C je nyní podporován téměř všichni široce použití kompilátoři. Nejvíce C kód být psán nowadays je založený na ANSI C. nějaký program psaný jediný ve standardu C je zaručil hrát správně na nějaké platformě s přizpůsobovat se C implementace. Nicméně, mnoho programů bylo psané to bude jen překládat na jisté platformě, nebo s jistým kompilátorem, náležitý k (i) použití nestandardních knihoven, např. pro grafické displejea (ii) někteří kompilátoři ne se držet ANSI C standard, nebo jeho nástupce, v jejich standardním režimu.
Po ANSI standardizačním procesu, C specifikace jazyka zůstala relativně statická na nějakou dobu, zatímco C + + pokračoval se vyvinout. (normativní doplněk zákona 1 vytvořil novou verzi C jazyk v 1995, ale tato verze je zřídka potvrzená.) nicméně, standard podstoupil revizi v pozdní devadesátá léta, vést k vydání ISO 9899: 1999 v 1999. Tento standard je obyčejně odkazoval se na jako “C99”. To bylo přijato jako ANSI standard v březnu 2000.
Nové rysy v C99 obsahují:
- vložené funkce
- uvolňovat omezení umístění deklarací proměnné (jak v C + +)
- přidání několika nových datových typů, včetně
dlouho dlouhé int(zmírnit bolest hrozící 32-bit k 64 bitovému přechodu), explicitní booleovský datový typ, akomplexpsát reprezentovat komplexní čísla - různě dlouhé sady
- oficiální podpora pro jednoho-linka komentuje to začínat
//, půjčil si od C + + - několik nových knihovních funkcí, takový jak
snprintf () - několik nových hlavičkových souborů, takový jak
stdint.h
Následující jednoduchá aplikace tiskne”Ahoj, svět” k standardnímu výstupnímu souboru (který je obvykle obrazovka ale síla jsou soubor nebo nějaké jiné hardwarové zařízení). Verze tohoto programu se objevila poprvé v K a R.
\ r \ n # obsahovat \ r \ n \ r \ nint hlavní (nicota) \ r \ n {\ r \ n printf (“ahoj, svět! \ \ n”); \ r \ n návrat 0; \ r \ n} \ r \ nC program sestává z funkcí a proměnných. C funkce jsou jako subrutiny a funkce Fortran nebo procedury a funkce Pascala. Funkce hlavní () je specialita v tom C program vždy začne vykonat na začátku této funkce. Toto znamená to každý C program musí mít hlavní () fungovat.
hlavní () funkce bude obvykle volat jiné funkce pomoci vykonávat jeho práci. Funkce mohou být napsány programátorem, nebo poskytovaný existujícími knihovnami; latter být zpřístupňován tím, že zahrnuje “standardní záhlaví” přes # obsahovat směrnice předběžného zpracování. Jisté knihovní funkce, takový jak printf () v nad příkladem, být definován C standardy; tito jsou odkazoval se na jako standardní knihovna. (implementace C poskytovat všechny standardních knihovních funkcí je nazýván “hoštěnou implementací”; některé implementace nejsou hoštěné, obvykle protože oni nejsou zamýšlel být používán s operačním systémem.) jiné knihovny mohou poskytovat zvláštní funkčnost, takový jako grafické rozhraní, pokročilé matematické operace nebo přístup k platformě- specifické znaky.
Funkce může vrátit hodnotu k prostředí který volalo to. Toto je obvykle jiný C fungovat. hlavní () funkční volací prostředí je operační systém. Proto, v “ahoj, svět!” příklad nahoře, operační systém přijme hodnotu 0 když program skončí. ( printf fungovat nad návraty kolik charakterů bylo tisknuto -- v případě nahoře, 14 -- ale jeho hodnota je účinně ignorována.)
C funkce sestává z typu návratu (nicota jestliže žádná hodnota je vrácena), jedinečný jméno, seznam parametrů v závorce (nicota jestliže tam být žádný) a tělo funkce ohraničené šlemi. syntax funkce tělo je ekvivalentní k tomu složeného příkazu.
Poznámka: vzpružující styl se liší od programátora k programátoru a moci být předmět veliké debaty (“náboženské války”). Vidět Odrazit styl pro další podrobnosti.
Složené příkazy v C mají tvar
{ }a být používán jako skupina funkce nebo kdekoli že jednotlivý příkaz je očekáván.Prohlášení formy
;je výraz sdělení. Jestliže výraz je chybějící, sdělení je nazýváno sdělením nuly.
C má tři druhy sdělení výběru: dva druhy jestliže a přepínač sdělení.
Dva druhy jestliže sdělení být
jestliže ()
a jestliže ()
jinde
V jestliže sdělení, jestliže výraz v závorce je nonzero nebo pravdivý, kontrola přejde na pokračování sdělení jestliže. Jestliže jinde klauzule je dar, kontrola přejde na pokračování sdělení jinde klauzule jestliže výraz v závorce je nulový nebo nepravdivý. Dva být disambiguated lícováním jinde k příští předchozí nesrovnatelný jestliže na stejné hnízdící úrovni. Šle mohou být používány nedbat tohoto nebo pro jasnost.přepínač sdělení přiměje kontrolu, aby byl přenesený do jednoho z několika sdělení se spoléhat na hodnotu výrazu, který musí mít základní typ. Substatement řízený vypínačem je typicky složený. Nějaké sdělení uvnitř substatement může být označeno jedním nebo více případ popisky, který sestávat z klíčového slova případ následovaný konstantním výrazem a pak dvojtečka (:). Ne dva případu konstanty spojené se stejným přepínačem mohou mít stejnou hodnotu. Tam smět být u nejvíce jeden výchozí hodnota štítek se sdružil s vypínačem; kontrola přejde na výchozí hodnota popiska jestliže žádný z případu popisky jsou stejné s výrazem v závorce následovat přepínač. Přepínače mohou být vložené; případ nebo výchozí hodnota štítek je spojován s nejmenším přepínačem, který obsahuje to. Sdělení přepínače mohou “padat-přes”, to je, když jedna sekce případu dokončila jeho provádění, sdělení budou pokračovat být vykonán klesající až do zlomu sdělení je narazeno. Toto může ukázat se užitečné za jistých okolností, novější programovací jazyky zakážou sdělení případu k “padat-přes”. V pod příkladem, jestliže je podáván, sdělení být vykonán a nic více uvnitř šlí. Nicméně jestliže je podáván, oba a být vykonán protože tam je ne přerušení oddělit dvě případová sdělení.
přepínač () {případ :
případ :
se zlomit; standardní:
}Sdělení iterace
C má tři formy sdělení iterace:
dělat
zatímco (); zatímco ()
pro ( ; ; )
V chvíle a dělat sdělení, substatement je vykonán opakovaně tak dlouho, zatímco hodnota výrazu zůstane nonzero nebo pravdivá. S chvíle, test, včetně všech postranních efektů od výrazu, nastane před každým prováděním sdělení; s dělat, test následuje každou iteraci.Jestliže všechny tři výrazy jsou přítomné v pro, sdělení
pro (e1; e2; e3) s;je ekvivalent k
e1; zatímco (e2) {s; e3;}Některý tří výrazů v pro smyčka může být vynechána. Chybějící druhý výraz dělá chvíle nonzero testu, vytvářet nekonečnou smyčku.Sdělení skoku přenesou kontrolu bezpodmínečně. Tam jsou čtyři druhy sdělení skoku v C: goto, pokračovat, přerušení, a návrat.
goto sdělení vypadá jako toto:
goto identifikátor >;identifikátor musí být popiska umístila ve funkci proudu. Kontrola se přenese do značeného sdělení.
A pokračovat sdělení může objevit se jen uvnitř sdělení iterace a kontroly příčin ke vstupence do smyčky-porce pokračování nejmenší přikládat takové sdělení. To je, uvnitř každého sdělení
zatímco (výraz) {/ *... * / cont:;} dělat {/ *... * / cont:;} zatímco (výraz);
pro (nepovinný-expr; optexp2; optexp3) {/ *... * / cont:;}
a pokračovat ne obsahoval uvnitř vložené iterace sdělení je stejné jak cont goto.přerušení sdělení je používáno vyjít ven pro smyčka, chvíle smyčka, dělat smyčka, nebo přepínač sdělení. Kontrola přejde na sdělení po skončeném sdělení.
Funkce se vrátí k jeho návštěvníkovi návrat sdělení. Když návrat je následovaný výrazem, hodnota je se vrátil k návštěvníkovi funkce. Proudění mimo konec funkce je ekvivalent k návrat s žádným výrazem. V jednom případě, vrácená hodnota je undefined.
() [] - >. + + -- (obsazení) postfixoví operátoři + + -- * a ~! + - sizeof unární operátory * / % multiplikativní operátoři + - operátoři přísady
Deklarace dat
Hodnoty v limits.h > a float.h > záhlaví určují rozsahy základních datových typů. Rozsahy plavidlo, dvojitý, a dlouho se zdvojnásobit typy jsou typicky ti zmínili se v IEEE 754 standard.
| jméno | minimální rozsah |
|---|---|
znak | - 127.. 127 nebo 0.. 255 |
nepodepsaný znak | 0..255 |
podepsaný znak | -127..127 |
int | -32767..32767 |
krátké int | -32767..32767 |
dlouhé int | -2147483647..2147483647 |
plavidlo | 1e-37.. 1e + 37 (pozitivní rozsah) |
dvojitý | 1e-37.. 1e + 37 (pozitivní rozsah) |
dlouho se zdvojnásobit | 1e-37.. 1e + 37 (pozitivní rozsah) |
Jestliže deklarace suffixed číslem v hranatých závorkách ([]), deklarace je řekl, aby byl deklarace pole. Řetězce jsou jen sady charakteru. Oni jsou skončeni nulou charakteru (reprezentovaný v C '\\0', charakter nuly). Hranice sady nejsou kostkované, a jestliže umístění paměti za sadou je psáno k, to může vyústit v chybu segmentace.
Příklady:
int myvector [100]; mystring znaku [80]; vznášet se mymatrix [3] [2] = {2.0, 10.0, 20.0, 123.0, 1.0, 1.0} lexikon znaku [10000] [300]; / * 10000 záznamů s maximální 300 připálí každého. * / int [3] [4];Poslední příklad nahoře vytvoří soubor sad, ale moci být myšlenka jako vícerozměrná sada pro většinu účelů. 12 int hodnoty vytvořily mohl být zpřístupňován takto:a[0][0] | a[0][1] | a[0][2] | a[0][3] |
a[1][0] | a[1][1] | a[1][2] | a[1][3] |
a[2][0] | a[2][1] | a[2][2] | a[2][3] |
Jestliže proměnná má hvězdičku (*) v jeho deklaraci to je řekl, aby byl ukazatel.
Příklady:
int * pi; / * ukazatel na int * / int * api [3]; / * množství 3 ukazatelů na int * / připálit * * argv; / * ukazatel na ukazatel na čaj * /hodnota u adresy skladoval v ukazateli proměnná může pak být zpřístupňována v programu s hvězdičkou. Například, daný první deklarace příkladu nahoře,
* pi je int. Toto je voláno “dereferencing” ukazatel.Další operátor, &(ampersand), volal adresu-operátora, vrátí adresu proměnné, sada, nebo fungovat. Tak, daný pokračování
int i, * pi; / * int a ukazatel na int * / pi = a i;
i a * pi mohl být používán zaměnitelně (přinejmenším until pi je soubor k něčemu jinému).Řetězce mohou být vykonávány bez používání standardní knihovna. Nicméně, knihovna obsahuje mnoho užitečných funkcí pro pracovat s oběma nula-skončil řetězce a unterminated sady znak.
Nejvíce obyčejně použité řetězcové funkce jsou:
strcat (dest, zdroj)- připojí řetězeczdrojke konci řetězcedeststrchr (s, c)- najde první příklad se povahoucv řetězcisa vrátí ukazatel na to nebo nulový pointer jestližecje ne objevilstrcmp (, b)- porovná řetězceaab(lexikální uspořádání); zápor návratů jestližeaje méně nežb, 0 jestliže se rovnat, pozitivní jestliže větší.strcpy (dest, zdroj)- kopíruje řetězeczdrojk řetězcideststrlen (st)- vrátit délku řetězceststrncat (dest, zdroj, n)- připojí maximumncharaktery od řetězcezdrojke konci řetězcedest; charaktery po nule terminator být ne kopírovaný.strncmp (, b, n)- porovná maximumncharaktery od řetězcůaab(lexikální uspořádání); zápor návratů jestližeaje méně nežb, 0 jestliže se rovnat, pozitivní jestliže větší.strncpy (dest, zdroj, n)- kopíruje maximumncharaktery od řetězcezdrojk řetězcideststrrchr (s, c)- najde poslední příklad se povahoucv řetězcisa vrátí ukazatel na to nebo nulový pointer jestližecje ne objevil
strcoll (s1, s2)- porovnat dva řetězce shodovat se k lokalitě-specifické snášení sekvencestrcspn (s1, s2)- vrátí index prvního charakteru vs1to odpovídá nějakému charakteru vs2strerror (chybují)- vrátí řetězec s chybovou zprávou odpovídající kódu vchybovatstrpbrk (s1, s2)- vrátí ukazatel do prvního charakteru vs1to odpovídá nějakému charakteru vs2nebo nulový pointer jestliže ne objevilstrspn (s1, s2)- vrátí index prvního charakteru vs1to odpovídá žádnému charakteru vs2strstr (st, subst)- vrátí ukazatel do prvního výskytu řetězcesubstvstnebo nulový pointer jestliže žádný takový podřetězec existuje.strtok (s1, s2)- vrátí ukazatel známce uvnitřs1ohraničený charaktery vs2.strxfrm (s1, s2, n)- převádís2dos1používat místo-specifická pravidla
Vstup souboru / výstup
V C, vstup a výstup jsou vykonáváni přes skupinu funkcí ve standardní knihovně. V ANSI/ISO C, ty funkce jsou definovány vstdio.h > záhlaví.Standard já/O
Tři standard já/O potoky jsou predefined:
stdinstandardní vstupstdoutstandardní výstupstderrstandardní chyba
Následování příkladu demonstruje jak filtrový program je typicky uspořádaný:
\ r \ n # obsahovat \ r \ n \ r \ nint hlavní () \ r \ n {\ r \ n int c; \ r \ n \ r \ n zatímco (( c = getchar ())! = EOF) {\ r \ n / * dělat různé věci \ r \ n k charakterům * / \ r \ n \ r \ n jestliže (anErrorOccurs) {\ r \ n fputs (“eee chyby nastal \ \ n”, stderr); \ r \ n se zlomit; \ r \ n} \ r \ n \ r \ n / *... * / \ r \ n putchar (c); \ r \ n / *... * / \ r \ n \ r \ n} \ r \ n návrat 0; \ r \ n} \ r \ nPomíjivé příkazové linkové argumenty
Parametry dávané na příkazové řádce jsou přešel na C program se dvěma predefined proměnnými - počet příkazových linkových argumentů v argc a jednotlivec argumenty jako sady charakteru v sadě ukazatele argv. Tak příkaz
myFilt p1 p2 p3vyústí v něco jako
(Poznámka: není tam žádná záruka to jednotlivec řetězce jsou sousedící.)
Individuální hodnoty parametrů mohou být zpřístupňovány s argv [1], argv [2], a argv [3].
An zajímavý (ačkoli jistě ne jedinečný) aspekt C standardy je že chování jistého kódu je řekl, aby byl “undefined”. V praxi, toto znamená, že program produkovaný od tohoto kódu může dělat něco, od (náhodně) pracovní jak zamýšlený k rozbíjet každý čas to je provozováno
Například, dodržování kodexu produkuje undefined chování, protože proměnná b je operován více než jakmile ve výrazu a = b + b++;:
\ r \ n # obsahovat \ r \ n \ r \ nint hlavní (nicota) \ r \ n {\ r \ n int, b = 1; \ r \ n = b + b + +; \ r \ n printf (“% d \ \ n”,); \ r \ n návrat 0; \ r \ n} \ r \ nExterní odkazy
- Vývoj C jazyk Dennis M. Ritchie
- Programování v C: Konzultace Brian W. Kernighan
- Lysator sbírka C prostředky jazyka
- comp.lang.c odpovědi na časté dotazy (FAQ seznam) Steve sumitem
- Zabezpečit programovací cupaninu - první pomoc pro programátory
Odkazy
- C programovací jazyk, Brian Kernighan a Dennis Ritchie. Také známý jak K a R. Kniha originálu na C.
- 1st, Prentice-Hall 1978; ISBN 0-131-10163-3. Pre-ANSI C.
- 2nd, Prentice-Hall 1988; ISBN 0-131-10362-8. ANSI C.
- C standard, editoval britským standardním institutem. Oficiální ISO standard (C99) v knižní formě.
- Wiley, 2003; ISBN 0-470-84573-2.
- C: Referenční příručka, Samuel P. Harbison a Guy L. Steele. Tato kniha je vynikající jako konečná referenční příručka, a pro ty pracovat na C kompilátor a procesory. Kniha obsahuje BNF gramatiku pro C.
- 4th, Prentice-Hall 1994; ISBN 0-133-26224-3.
- 5th, Prentice-Hall 2002; ISBN 0-130-89592-X.