Pojdi na vsebino

Programski jezik C: Razlika med redakcijama

Iz Wikipedije, proste enciklopedije
Izbrisana vsebina Dodana vsebina
m m+/dp
m+/dp
Vrstica 1: Vrstica 1:
{{Infopolje Programski jezik
{{infopolje Programski jezik
| name = C
| name = C
| paradigm = [[imperativno programiranje|imperativna]] ([[proceduralno programiranje|proceduralna]]), [[strukturalno programiranje|strukturalna]]
| paradigm = [[imperativno programiranje|imperativna]] ([[proceduralno programiranje|proceduralna]]), [[strukturalno programiranje|strukturalna]]
| logo = [[Slika:The C Programming Language logo.svg|140px|alt=Text in light blue serif capital letters on white background and very large light blue sans-serif letter C.]]
| logo = [[Slika:The C Programming Language logo.svg|140px|alt=Text in light blue serif capital letters on white background and very large light blue sans-serif letter C.]]
| logo caption = ''[[Programski jezik C (knjiga)|Programski jezik C]]'' (''The C Programming Language'')<ref name="k&r1e">{{sktxt|Kernighan|Ritchie|1978}}.</ref> (velikokrat imenovana »K&R«), osnovna knjiga o C-ju
| logo caption = ''[[Programski jezik C (knjiga)|Programski jezik C]]'' (''The C Programming Language'')<ref name="k&r1e" /> (velikokrat imenovana »K&R«), osnovna knjiga o C-ju
| year = {{start date and age|[[1972 v znanosti|1972]]}}{{efn|»[[Kenneth Thompson|Thompson]] je na kratko leta 1972 poskusil tvoriti sistem v zgodnji različici C-ja pred strukturami, vendar je prenehal.«<ref name="ritchie_1993">{{sktxt|Ritchie|1993}}.</ref>}}
| year = {{start date and age|[[1972 v znanosti|1972]]}}{{efn|»[[Kenneth Thompson|Thompson]] je na kratko leta 1972 poskusil tvoriti sistem v zgodnji različici C-ja pred strukturami, vendar je prenehal.«<ref name="ritchie_1993">{{sktxt|Ritchie|1993}}.</ref>}}
| designer = [[Dennis Ritchie]]
| designer = [[Dennis Ritchie]]
Vrstica 41: Vrstica 41:
* majhno fiksno število [[rezervirana beseda|rezerviranih besed]], ki vključuje polno množico primitivov [[nadzorni pretok|nadzornega pretoka]]: <code>[[zanka for|for]]</code>, <code>[[pogojni operator|if/else]]</code>, <code>[[zanka while|while]]</code>, <code>[[stavek switch|switch]]</code> in <code>[[zanka do while|do/while]]</code>. Obstaja en [[imenski prostor]], imena, ki jih opredeli uporabnik, se ne morejo razlikovati od rezerviranih besed z nobeno vrsto [[sigla (računalništvo)|sigle]],
* majhno fiksno število [[rezervirana beseda|rezerviranih besed]], ki vključuje polno množico primitivov [[nadzorni pretok|nadzornega pretoka]]: <code>[[zanka for|for]]</code>, <code>[[pogojni operator|if/else]]</code>, <code>[[zanka while|while]]</code>, <code>[[stavek switch|switch]]</code> in <code>[[zanka do while|do/while]]</code>. Obstaja en [[imenski prostor]], imena, ki jih opredeli uporabnik, se ne morejo razlikovati od rezerviranih besed z nobeno vrsto [[sigla (računalništvo)|sigle]],
* veliko število aritmetičnih, logičnih (eniških, dvojiških, trojiških) in pozapisnih operatorjev, kot so npr.: <code>+</code>, <code>-</code>, <code>!</code>, <code>*</code>, <code>&</code>, <code>~</code>, <code>+=</code>, <code>++</code>, <code><<</code>, <code>? :</code>, <code>.</code>, <code>-></code> ipd.,
* veliko število aritmetičnih, logičnih (eniških, dvojiških, trojiških) in pozapisnih operatorjev, kot so npr.: <code>+</code>, <code>-</code>, <code>!</code>, <code>*</code>, <code>&</code>, <code>~</code>, <code>+=</code>, <code>++</code>, <code><<</code>, <code>? :</code>, <code>.</code>, <code>-></code> ipd.,
* v enem stavku se lahko izvede več kot ena [[prireditev (računalništvo)|dodelitev]],
* v enem stavku se lahko izvede več kot ena [[prireditev (računalništvo)|prireditev]],
* preprost sistem [[podatkovni tip|podatkovnih tipov]], ki obvaruje pred brezpredmetnimi operacijami,
* preprost sistem [[podatkovni tip|podatkovnih tipov]], ki obvaruje pred brezpredmetnimi operacijami,
* [[statično področje|slovarsko področje spremenljivk]],
* [[statično področje|slovarsko področje spremenljivk]],
Vrstica 123: Vrstica 123:
* funkcije <code>[[void (podatkovni tip)|void]]</code> (funkcije, ki ne vračajo vrednosti)
* funkcije <code>[[void (podatkovni tip)|void]]</code> (funkcije, ki ne vračajo vrednosti)
* funkcije, ki vračajo podatkovne tipe <code>[[struktura (podatkovni tip)|struct]]</code> ali <code>[[unija (podatkovni tip)|union]]</code> (namesto [[kazalec (računalništvo)|kazalcev]])
* funkcije, ki vračajo podatkovne tipe <code>[[struktura (podatkovni tip)|struct]]</code> ali <code>[[unija (podatkovni tip)|union]]</code> (namesto [[kazalec (računalništvo)|kazalcev]])
* [[prireditev (računalništvo)|dodelitev]] za podatkovne tipe <code>struct</code>
* [[prireditev (računalništvo)|prireditev]] za podatkovne tipe <code>struct</code>
* [[naštevni tip]]i (''enumerated types'')
* [[naštevni tip]]i (''enumerated types'')


Vrstica 161: Vrstica 161:
Leta 2007 so se začela dela na novi različici standarda C, ANSI C11 ali ISO/IEC 9899:2011, do objave 8. decembra 2011 neformalno imenovane »C1X«. Standardizacijski odbor je sprejel smernice za omejitev usvojitve novih gradnikov, ki jih niso preskusili z obstoječimi izvedbami.
Leta 2007 so se začela dela na novi različici standarda C, ANSI C11 ali ISO/IEC 9899:2011, do objave 8. decembra 2011 neformalno imenovane »C1X«. Standardizacijski odbor je sprejel smernice za omejitev usvojitve novih gradnikov, ki jih niso preskusili z obstoječimi izvedbami.


V standardu C11 se je pojavilo več novih gradnikov jezika C in knjižnic, na primer: makroji rodovnih tipov, anonimne strukture, izboljšana podpora [[kodiranje|kodirnega]] standarda [[Unicode]], atomske operacije, [[mnogonitnost]] in funkcije s preverjanjem mej. Neketeri deli obstoječe knjižnice C99 so postali izbirni, izboljšana je bila tudi združljivost s C++.
V standardu C11 se je pojavilo več novih gradnikov jezika C in knjižnic, na primer: makroji rodovnih tipov, anonimne strukture, izboljšana podpora [[kodiranje|kodirnega]] standarda [[Unicode]], atomske operacije, [[mnogonitnost]] in funkcije s preverjanjem mej. Neketeri deli obstoječe knjižnice C99 so postali izbirni, izboljšana je bila tudi združljivost s C++. Standardni [[makro]] <code>__STDC_VERSION__</code> je definiran kot <code>201112L</code> in tako označuje, da je na voljo podpora standardu C11.


=== Vdelani C ===
=== Vdelani C ===
Vrstica 175: Vrstica 175:
{{glavni|skladnja jezika C}}
{{glavni|skladnja jezika C}}


C ima [[formalna slovnica|formalno slovnico]], ki jo določa standard C.<ref name="h&s5e">{{sktxt|Harbison|Steele|2002}}.</ref> Z razliko od nekaterih drugih jezikov, kot je npr. [[FORTRAN 77]], je izvorna koda C-ja proste oblike, kjer se znaki za prazni prostor lahko rabijo poljubno, koda pa ni odvisna od stolpčnih ali besedilno-vrstičnih omejitev. Komentarji so lahko med razmejilnima znakoma <code>/*</code> in <code>*/</code> enovrstično ali mnogovrstično, od standarda C99 naprej pa tudi za razmejilnima znakoma <code>//</code> enovrstično do konca vrstice. Komentarji, ki jih razmejujeta <code>/*</code> in <code>*/</code>, ne smejo biti vgnezdeni. Če se zaporedje teh dveh znakov pojavi znotraj [[literal znakovnega niza|znakovnega niza]] ali znakovnega [[literal|črkovnega simbola]], se ne obravnavata kot razmejilna znaka komentarja.<ref name="k&r2e" /> Komentarji oblike:
C ima [[formalna slovnica|formalno slovnico]], ki jo določa standard C.<ref name="h&s5e">{{sktxt|Harbison|Steele|2002}}.</ref> Z razliko od nekaterih drugih jezikov, kot je npr. [[FORTRAN 77]], je izvorna koda C-ja proste oblike, kjer se znaki za prazni prostor lahko rabijo poljubno, koda pa ni odvisna od stolpčnih ali besedilno-vrstičnih omejitev. Meje vrstic so drugače med predprocesorsko fazo pomembne.
=== Komentarji ===
Komentarji so lahko med razmejilnima znakoma <code>/*</code> in <code>*/</code> enovrstično ali mnogovrstično, od standarda C99 naprej pa tudi za razmejilnima znakoma <code>//</code> enovrstično do konca vrstice. Komentarji, ki jih razmejujeta <code>/*</code> in <code>*/</code>, ne smejo biti vgnezdeni. Če se zaporedje teh dveh znakov pojavi znotraj [[literal znakovnega niza|znakovnega niza]] ali znakovnega [[literal|črkovnega simbola]], se ne obravnavata kot razmejilna znaka komentarja.<ref name="k&r2e" /> Komentarji oblike:


<source lang="c">
<source lang="c">
Vrstica 210: Vrstica 214:
saj drugo zaporedje <code>/*</code> ne velja za razmejilni znak komentarja, kot tudi ne drugo zaporedje <code>*/</code>, ki je sedaj zunaj komentarja, in prevajalnik bi v obeh primerih javil napako.
saj drugo zaporedje <code>/*</code> ne velja za razmejilni znak komentarja, kot tudi ne drugo zaporedje <code>*/</code>, ki je sedaj zunaj komentarja, in prevajalnik bi v obeh primerih javil napako.


=== Izrazi ===
Datoteke s C-jevsko izvorno kodo vsebujejo označitev in opredelitev funkcij. Opredelitve funkcij po vrsti vsebujejo označitve in [[stavek (programiranje)|stavke]]. Označitve opredeljujejo nove podatkovne tipe z rezerviranimi besedami, kot so: <code>struct</code>, <code>union</code> in <code>enum</code>, ali prirejajo tipe in morda rezervirajo pomnilniška mesta novim spremenljivkam, po navadi z zapisom tipa, ki mu sledi ime spremenljivke. Rezervirane besede, kot sta <code>char</code> in <code>int</code>, označujejo vgrajene tipe. Deli kode so obdani z [[zaviti oklepaj|zavitima oklepajema]] <code>{</code> in <code>}</code>, ki omejujeta označitveno področje ali pa delujeta kot samostojni stavek za [[nadzorna struktura|nadzorne strukture]].

Datoteke s C-jevsko izvorno kodo vsebujejo označitev (deklaracijo) in opredelitev (definicijo) funkcij. Opredelitve funkcij po vrsti vsebujejo označitve in [[stavek (programiranje)|stavke]]. Označitve opredeljujejo nove podatkovne tipe z rezerviranimi besedami, kot so: <code>struct</code>, <code>union</code> in <code>enum</code>, ali prirejajo tipe in morda rezervirajo pomnilniška mesta novim spremenljivkam, po navadi z zapisom tipa, ki mu sledi ime spremenljivke. Rezervirane besede, kot sta <code>char</code> in <code>int</code>, označujejo vgrajene tipe. Deli kode so obdani z [[zaviti oklepaj|zavitima oklepajema]] <code>{</code> in <code>}</code>, ki omejujeta označitveno področje ali pa delujeta kot samostojni stavek za [[nadzorna struktura|nadzorne strukture]].

C kot imperativni jezik za označitev dejanj rabi stavke. Najbolj razširjeni stavek je izrazni stavek, ki vsebuje izraz, kateremu je treba določiti vrednost, izrazu pa sledi [[podpičje]]. Zaradi še večje preglednosti se podpičje velikokrat razmakne od označitvenih/ukaznih besed z dodatnim presledkom. Na primer:

<source lang="c">
int a; | int a ;
for (i=0; i<max; i++) | for (i = 0 ; i < max ; i++)
</source>

Kot stranski pojav določitve vrednosti se funkcije lahko kličejo in spremenljivkam se lahko priredijo nove vrednosti. Za spreminjanje normalne zaporedne izvršitve stavkov ima C več stavkov za nadzor toka, ki jih označujejo rezervirane besede. [[Strukturalno programiranje]] je podprto s pogojno ivršitvijo <code>if</code>(-<code>else</code>), z iterativnimi izvršitvami (zankami) <code>if</code>(-<code>else</code>), <code>while</code> in <code>for</code>. Stavek <code>for</code> ima ločene dodelitvene izraze, izraze za preverjanje in izraze za ponovno dodelitev – vsak od njih pa se lahko opusti. Izraza <code>break</code> in <code>continue</code> se lahko rabita za zapustitev najbolj notranjega zančnega stavka ali za preskočitev na njeno ponovno dodelitev. Obstaja tudi nestrukturalni stavek <code>goto</code>, ki preusmerja neposredno na imenovano oznako znotraj funkcije. <code>switch</code> izbere primer, ki se izvede na podlagi vrednosti celoštevilskega izraza.

Izrazi lahko rabijo različne vgrajene operatorje in lahko vsebujejo klice funkcij. Vrstni red po katerem se določijo vrednosti argumentom funkcij in operandom večine operatorjev ni določen. Določevanje vrednost je lahko tudi vloženo vmes. Vendar se bodo vsi stranski vplivi, (vključno s pomnilnikom do spremenljivk) pojavili pred naslednjo »[[zaporedna točka|zaporedno točko]]«. Zaporedne točke vsebujejo zaključek vsakega izraznega stavka ter vstop in vračanje iz vsakega klica funkcije. Zaporedne točke se pojavijo tudi med določevanjem vrednosti izrazov, ki vsebujejo določene operatorje (<code>&&</code>, <code>||</code>, <code>[[?:]]</code> in [[operator vejica]]). To dovoljuje visoko stopnjo optimizacije kode prevajalnika, vendar od programerjev v C zahteva večjo skrb za dosego zanesljivih rezultatov kot je potrebna pri drugih programskih jezikih.

Kernighan in Ritchie v uvodu knjige ''Progranski jezik C'' pravita: »C ima, kot drugi jeziki, svoje hibe. Nekateri od operatorjev imajo napačno prednost; nekateri deli skladnje bi lahko bili boljši.«{{refn|Stran 3 izvirne K&R<ref name="k&r1e">{{sktxt|Kernighan|Ritchie|1978}}.</ref>}} Standard C ni poskušal popraviti veliko od teh hib zaradi vpliva takšnih sprememb na že obstoječo programsko opremo.


=== Nabor znakov ===
=== Nabor znakov ===
Vrstica 289: Vrstica 308:
{{col-end}}
{{col-end}}


Besede so občutljive na male ali velike črke. <tt>INT</tt>, <tt>INt</tt>, <tt>InT</tt>, <tt>Int</tt>, <tt>iNT</tt>, <tt>iNt</tt> ali <tt>inT</tt> na primer ni enako kot <code>int</code>. V različnih izvedbah prevajalnikov za C se lahko pojavijo tudi druge rezervirane besede, npr. <tt>ada</tt>, <tt>asm</tt>, <tt>fortran</tt>, <tt>pascal</tt>, čeprav se tam običajno nestandardne besede začnejo z enim ali dvema [[podčrtaj]]ema, npr. <tt>__asm</tt>, <tt>_Cdecl</tt> ipd.<ref name="watcom_clr" /> V primerjavi z drugimi velikimi jeziki ima C majhno število rezerviranih besed. [[Ada (programski jezik)|Ada]] jih ima na primer 62. Ena od značilnosti jezika C je, da lahko naredi veliko z relativno malo posebnimi simboli in rezerviranimi besedami.<ref name="kelley_pohl_1984" /> Na začetku je imel C manj rezerviranih besed, na primer 29, sedaj pa jih pozna 44. Kasneje so bile dodane rezervirane besede, kot so: <tt>_Bool</tt>, <tt>_Complex</tt>, <tt>const</tt>, <tt>_Imaginary</tt>, <tt>inline</tt>, <tt>restrict</tt>, <tt>signed</tt> in <tt>volatile</tt>. Beseda <tt>entry</tt> se ni nikoli rabila in sedaj ni več rezervirana.<ref name="k&r2e" />
Besede so občutljive na male ali velike črke. <tt>INT</tt>, <tt>INt</tt>, <tt>InT</tt>, <tt>Int</tt>, <tt>iNT</tt>, <tt>iNt</tt> ali <tt>inT</tt> na primer ni enako kot <code>int</code>. V različnih izvedbah prevajalnikov za C se lahko pojavijo tudi druge rezervirane besede, npr. <tt>ada</tt>, <tt>asm</tt>, <tt>fortran</tt>, <tt>pascal</tt>, čeprav se tam običajno nestandardne besede začnejo z enim ali dvema [[podčrtaj]]ema, npr. <tt>__asm</tt>, <tt>_Cdecl</tt> ipd.<ref name="watcom_clr" /> V primerjavi z drugimi velikimi jeziki ima C majhno število rezerviranih besed. [[Ada (programski jezik)|Ada]] jih ima na primer 62. Ena od značilnosti jezika C je, da lahko naredi veliko z relativno malo posebnimi [[simbol]]i in rezerviranimi besedami.<ref name="kelley_pohl_1984" /> Na začetku je imel C manj rezerviranih besed, na primer 29, sedaj pa jih pozna 44. Kasneje so bile dodane rezervirane besede, kot so: <tt>_Bool</tt>, <tt>_Complex</tt>, <tt>const</tt>, <tt>_Imaginary</tt>, <tt>inline</tt>, <tt>restrict</tt>, <tt>signed</tt> in <tt>volatile</tt>. Beseda <tt>entry</tt> se ni nikoli rabila in sedaj ni več rezervirana.<ref name="k&r2e" />

=== Operatorji ===
{{glavni|operatorji v C in C++}}

C podpira bogat nabor [[operator (računalništvo)|operator]]jev, ki so simboli znotraj [[izraz (računalništvo)|izraz]]a za določevanje potrebnih opravil med njegovim izvajanjem. C ima operatorje za:

* [[aritmetika]]: [[seštevanje|<code>+</code>]], [[odštevanje|<code>-</code>]], [[množenje|<code>*</code>]], [[deljenje|<code>/</code>]], [[modulo|<code>%</code>]]
* [[prireditev (računalništvo)|prireditev]]: <code>=</code>
* [[povečana prireditev]]: <code>+=</code>, <code>-=</code>, <code>*=</code>, <code>/=</code>, <code>%=</code>, <code>&=</code>, <code>|=</code>, <code>^=</code>, <code>&lt;&lt;=</code>, <code>&gt;&gt;=</code>
* [[bitna operacija|bitna logika]]: <code>~</code>, <code>&</code>, <code>|</code>, <code>^</code>
* [[bitni pomik]]: <code>&lt;&lt;</code>, <code>&gt;&gt;</code>
* [[Booleova algebra|Booleova logika]]: <code>!</code>, <code>&&</code>, <code>||</code>
* [[?:|pogojna določitev vrednosti]]: [[?:|<code>? :</code>]]
* primerjanje enakosti: [[enakost (matematika)|<code>==</code>]], [[neenakost|<code>!=</code>]]
* [[podprogram|klicanje funkcij]]: <code>( )</code>
* [[operatorja povečanja in zmanjšanja|povečanje in zmanjšanje]]: <code>++</code>, <code>--</code>
* [[zapis (računalništvo)|izbira elementa]]: <code>.</code>, <code>-></code>
* velikost objekta: <code>[[sizeof]]</code>
* [[relacija urejenosti|relacije urejenosti]]: <code><</code>, <code><=</code>, <code>></code>, <code>>=</code>
* [[kazalec (računalništvo)|referenca in dereferenca]]: <code>&</code>, <code>*</code>, <code>[ ]</code>
* vrstni red: [[operator vejica|<code>,</code>]]
* [[vrstni red operacij|združevanje podizrazov]]: <code>( )</code>
* [[pretvorba tipov]]: <code>(''typename'')</code>

C rabi operator <code>=</code>, ki je v matematiki rezerviran za izražanje [[enakost (matematika)|enakost]]i, za naznanitev prireditve po zgledu predhodnih jezikov [[Fortran]]a in [[PL/I]], vendar z razliko od [[ALGOL]]a in njegovih izpeljank. Podobnost med cejevskima operatorjema za prireditev in za primerjanje enakosti (<code>==</code>) so kritizirali, saj se ju lahko preprosto zamenja. V mnogih primerih mora biti vsak rabljen v kontekstu drugega brez napak prevajalnika, čeprav nekateri prevajalniki tvorijo opozorila. Pogojni izraz v <code>if(a=b+1)</code> je pravilen, če <code>a</code> ni enak nič po prireditvi.<ref name="AutoTX-8">{{navedi splet|url=http://www.cs.ucr.edu/~nxiao/cs10/errors.htm|title=10 Common Programming Mistakes in C++|publisher=Cs.ucr.edu|date= |accessdate= 2009-06-26|language=en}}</ref> Poleg tega [[vrstni red operacij|operatorska prednost]] ni intuitivna, saj se operator <code>==</code> zvezuje tesneje kot operatorja <code>&</code> in <code>|</code> v izrazih, kot je <code>x & 1 == 0</code>, ki bi moral biti zapisan kot <code>(x & 1) == 0</code> za pravilno določitev vrednosti.<ref name="AutoTX-9">{{sktxt|Schultz|2004|pp=20}}.</ref>


== Zgradba, oblika programa in slog v C ==
== Zgradba, oblika programa in slog v C ==
Vrstica 470: Vrstica 514:
!| pojasnilo
!| pojasnilo
!| mejne vrednosti <br /> v <code>[[limits.h]]</code>
!| mejne vrednosti <br /> v <code>[[limits.h]]</code>
!| formatno določilo
!| določilnik formata
|-
|-
| <syntaxhighlight lang="c" enclose="none">char</syntaxhighlight> || najmanjša naslovljiva enota stroja, ki lahko vsebuje osnovni nabor znakov. Njen tip je celoštevilski. Dejanski tip je lahko predznačen ali nepredznačen, kar je odvisno od izvedbe. Vsebuje <code>CHAR_BIT</code> bitov in je njegov obseg [−128,&nbsp;+127]. || <code>CHAR_MIN</code>, <code>CHAR_MAX</code> || <code>%c</code>
| <syntaxhighlight lang="c" enclose="none">char</syntaxhighlight> || najmanjša naslovljiva enota stroja, ki lahko vsebuje osnovni nabor znakov. Njen tip je celoštevilski. Dejanski tip je lahko predznačen ali nepredznačen, kar je odvisno od izvedbe. Vsebuje <code>CHAR_BIT</code> bitov in je njegov obseg [−128,&nbsp;+127]. || <code>CHAR_MIN</code>, <code>CHAR_MAX</code> || <code>%c</code>
Vrstica 476: Vrstica 520:
| <syntaxhighlight lang="c" enclose="none">signed char</syntaxhighlight> || enaka velikost kot <code>char</code>, vendar je zagotovo predznačena in je njegov obseg [−128,&nbsp;+127]. || <code>SCHAR_MIN</code>, <code>SCHAR_MAX</code> || <code>%c</code> <small>(ali <code>%hhi</code> za numerični vnos)</small>
| <syntaxhighlight lang="c" enclose="none">signed char</syntaxhighlight> || enaka velikost kot <code>char</code>, vendar je zagotovo predznačena in je njegov obseg [−128,&nbsp;+127]. || <code>SCHAR_MIN</code>, <code>SCHAR_MAX</code> || <code>%c</code> <small>(ali <code>%hhi</code> za numerični vnos)</small>
|-
|-
| <syntaxhighlight lang="c" enclose="none">unsigned char</syntaxhighlight> || enaka velikost kot <code>char</code>, vendar je zagotovo nepredznačena. V dvojiškem zapisu je predstavljen brez zapolnjevalnih bitov, tako je njegov obseg točno [0,&nbsp;2<sup><code>CHAR_BIT</code></sup>−1],<ref name=c99generalrepr>{{navedi knjigo | url=http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf | title=ISO/IEC 9899:1999 specification, TC3 | at=p. 37, § 6.2.6.1 ''Representations of types — General''|language = en}}</ref> običajno [0,&nbsp;+255] || <code>UCHAR_MAX</code> || <code>%c</code> <small>(ali <code>%hhu</code> za numerični vnos)</small>
| <syntaxhighlight lang="c" enclose="none">unsigned char</syntaxhighlight> || enaka velikost kot <code>char</code>, vendar je zagotovo nepredznačena. V dvojiškem zapisu je predstavljen brez zapolnjevalnih bitov, tako je njegov obseg točno [0,&nbsp;2<sup><code>CHAR_BIT</code></sup>−1],<ref name=c99generalrepr>{{navedi knjigo | url=http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf | title=ISO/IEC 9899:1999 specification, TC3 | at=str. 37, § 6.2.6.1 ''Representations of types — General''|language = en}}</ref> običajno [0,&nbsp;+255] || <code>UCHAR_MAX</code> || <code>%c</code> <small>(ali <code>%hhu</code> za numerični vnos)</small>
|-
|-
| <syntaxhighlight lang="c" enclose="none">short</syntaxhighlight> <br /> <syntaxhighlight lang="c" enclose="none">short int</syntaxhighlight> <br /> <syntaxhighlight lang="c" enclose="none">signed short</syntaxhighlight> <br /> <syntaxhighlight lang="c" enclose="none">signed short int</syntaxhighlight> || predznačeni celoštevilski tip ''short''. Njegov obseg je vsaj [−32768,&nbsp;+32767],<ref name=c99sizes>{{navedi knjigo|url= http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf|title= ISO/IEC 9899:1999 specification, TC3 |at= str. 22, § 5.2.4.2.1 ''Sizes of integer types <code><limits.h></code>''}}</ref> in zato je njegova velikost vsaj [[16-bitna arhitektura|16 bitov]]. || <code>SHRT_MIN</code>, <code>SHRT_MAX</code> || <code>%hi</code>
| <syntaxhighlight lang="c" enclose="none">short</syntaxhighlight> <br /> <syntaxhighlight lang="c" enclose="none">short int</syntaxhighlight> <br /> <syntaxhighlight lang="c" enclose="none">signed short</syntaxhighlight> <br /> <syntaxhighlight lang="c" enclose="none">signed short int</syntaxhighlight> || predznačeni celoštevilski tip ''short''. Njegov obseg je vsaj [−32768,&nbsp;+32767],<ref name=c99sizes>{{navedi knjigo|url= http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf|title= ISO/IEC 9899:1999 specification, TC3 |at= str. 22, § 5.2.4.2.1 ''Sizes of integer types <code><limits.h></code>''}}</ref> in zato je njegova velikost vsaj [[16-bitna arhitektura|16 bitov]]. || <code>SHRT_MIN</code>, <code>SHRT_MAX</code> || <code>%hi</code>
Vrstica 512: Vrstica 556:


Tudi dejanska velikost in obnašanje tipov s plavajočo vejico se razlikuje v izvedbah. Edino zagotovilo je, da <code>long double</code> ni manjši od <code>double</code>, ki ni manjši od <code>float</code>. Če ju strojna oprema podpira, se po navadi rabita 32-bitna in 64-bitna dvojiška formata s plavajočo vejico [[IEEE 754]].
Tudi dejanska velikost in obnašanje tipov s plavajočo vejico se razlikuje v izvedbah. Edino zagotovilo je, da <code>long double</code> ni manjši od <code>double</code>, ki ni manjši od <code>float</code>. Če ju strojna oprema podpira, se po navadi rabita 32-bitna in 64-bitna dvojiška formata s plavajočo vejico [[IEEE 754]].

=== Kazalci ===

C podpira rabo [[kazalec (računalništvo)|kazalcev]], vrsto [[referenca (računalništvo)|reference]], ki zapisuje naslov ali lego objekta ali funkcije v pomnilniku. Kazalci se lahko ''dereferencirajo'' za dostop podatkov, ki so shranjeni na naslovu na katere kažejo, ali kličejo funkcije na katere kažejo. S kazalci se lahko upravlja s pomočjo prirejanja ali [[kazalčna aritmetika|kazalčne aritmetike]]. Predstavitev vrednosti kazalca pri zagonu je običajno surov pomnilniški naslov (mogoče povečan z izravnavo znotraj besedilnega polja), vendar ker kazalčni tip vsebuje tip objekta na katerega kaže, se lahko izrazi, ki vključujejo kazalce preverijo glede na tip že med prevajanjem. Kazalčna aritmetika se samodejno skalira z velikostjo podatkovnega tipa na katero se kaže. Kazalci se v C rabijo za več namenov. Z besedilnimi [[znakovni niz|znakovnimi nizi]] se običajno upravlja s pomočjo kazalcev v polja znakov. [[Dinamičja dodelitev pomnilnika]] se izvaja s kazalci. Veliko podatkovnih tipov, kot so na primer [[drevo (podatkovna struktura)|drevesa]], je velikokrat izvedeno kot dinamično dodeljeni objekti <code>struct</code>, ki so med seboj povezani s kazalci. Kazalci na funkcije so uporabni za prenašanje funkcij kot argumenti na [[funkcija višjega reda|funkcije višjega reda]], kot na primer [[qsort]] ali [[dvojiško iskanje|bsearch]]), ali kot [[povratni klic (računaništvo)|povratni klic]] (''callback''), ki ga izvedejo obdelovalniki dogodkov (''event handlers'').<ref name="bk21st" />

''Vrednost [[ničelni kazalec|ničelnega kazalca]] (null pointer value)'' eksplicitno kaže na nobeno veljavno mesto v pomnilniku. Dereferenciranje vrednosti ničelnega kazalca je nedoločeno, kar velikokrat povzroča [[segmentacijska odpoved|segmentacijsko odpoved]] (''segmentation fault''). Vrednosti ničelnih kazalcev so uporabne pri nakazovanju posebnih primerov, kot so brez »naslednjega« kazalca v končnem vozlišču [[povezani seznam|povezanega seznama]], ali kot naznanitev napake iz funkcij, ki vračajo kazalce. V ustreznih kontekstih izvorne kode, ko je prirejanje kazalčne spremenljivke, se lahko ''konstanta ničelnega kazalca'' zapiše kot <code>0</code>, z ali brez eksplicitne opustitve na tip kazalca, ali kot makro <code>NULL</code>, ki je opredeljen v več standardnih zaglavnih datotekah. V pogojnih zvezah imajo vrednosti ničelnih kazalcev vrednost napačno, vse druge vrednosti kazalcev pa vrednost pravilno.

Prazni kazalci (<code>void *</code>) kažejo na objekte nedoločenega tipa, in se lahko zaradi tega uporabijo kot »generični« podatkovni kazalci. Ker velikost in tip nakazanih objektov ni znana, se prazni kazalci ne morejo dereferencirati, in tudi kazalčna aritmetika nad njimi ni dovoljena, čeprav se lahko enostavno (in v mnogih zvezah so) pretvorjeni v in iz poljubnega tipa objektnega kazalca.<ref name="bk21st" />

Neprevidna raba kazalcev je potencialno nevarna. Ker so njihov tip ne preverja, lahko kazalčna spremenljivka kaže na poljubno mesto v pomnilniku, kar lahko povzroči nezaželene učinke. Čeprav pravilno rabljeni kazalci kažejo na varna mesta, lahko kažejo na nevarna mesta, če se zanje rabi nepravilna kazalčna aritmetika
. Objekti na katera kažejo se lahko ponovno dodelijo in uporabijo ([[viseči kazalec|obviseli kazalci]]) – lahko se uporabijo brez, da bi se jim dodelila vrednost ([[divji kazalec|divji kazalci]]), ali pa se jim neposredno lahko dodeli nevarno vrednost s pomočjo opustitve, unije ali prek drugega pokvarjenega kazalca. V splošnem C dopušča upravljanje in pretvarjanje med tipi kazalcev, čeprav običajno prevajalniki preskrbijo možnosti za različne nivoje preverjanja. Nekateri drugi programski jeziki te probleme rešujejo z bolj omejevalnimi tipi referenc.


== Glej tudi ==
== Glej tudi ==
Vrstica 517: Vrstica 572:
* [[C++]]
* [[C++]]
* [[C sharp (programski jezik)|C#]]
* [[C sharp (programski jezik)|C#]]
* [[primerjava paskala in C]]
* [[primerjava programskih jezikov]]


== Opombe ==
== Opombe ==
Vrstica 530: Vrstica 587:
{{refbegin|colwidth=30em}}
{{refbegin|colwidth=30em}}
* {{citat|last1= Ashley|first1= Michael|url= http://newt.phys.unsw.edu.au/~mcba/phys2020/|title= PHYS2020 - Computational Physics, based on the C programming language|date=2004|work= School of Physics, [[Univerza Novega Južnega Walesa]] (UNSW)|accessdate= 2014-10-08|language= en|ref= harv}}
* {{citat|last1= Ashley|first1= Michael|url= http://newt.phys.unsw.edu.au/~mcba/phys2020/|title= PHYS2020 - Computational Physics, based on the C programming language|date=2004|work= School of Physics, [[Univerza Novega Južnega Walesa]] (UNSW)|accessdate= 2014-10-08|language= en|ref= harv}}
* {{citat|last1= Banahan|first1= Mike|last2= Brady|first2= Declan|last3= Doran|first3= Mark|title= The C Book|url= http://publications.gbdirect.co.uk/c_book/|edition=2.|date= 1991|publisher= Addison-Wesley|ref= harv}}
* {{citat|last1= Banahan|first1= Mike|last2= Brady|first2= Declan|last3= Doran|first3= Mark|title= The C Book|url= http://publications.gbdirect.co.uk/c_book/|edition=2.|date= 1991|publisher= [[Addison-Wesley]]|ref= harv}}
* {{citat|last1= Binstock|first1= Andrew|url= http://www.drdobbs.com/cpp/interview-with-herb-sutter/231900562 |title= Interview with Herb Sutter|website= [[Dr. Dobb's Journal|Dr. Dobb's]]|date= 2011-10-12|accessdate= 2013-09-07|language= en|ref =harv}}
* {{citat|last1= Binstock|first1= Andrew|url= http://www.drdobbs.com/cpp/interview-with-herb-sutter/231900562 |title= Interview with Herb Sutter|website= [[Dr. Dobb's Journal|Dr. Dobb's]]|date= 2011-10-12|accessdate= 2013-09-07|language= en|ref =harv}}
* {{citat|author= [[British Standard Institute]]|title= The C Standard|publisher= John Wiley & Sons|isbn= 0-470-84573-2}} Uradni standard ISO (C99) v knjižni obliki.
* {{citat|author= [[British Standard Institute]]|title= The C Standard|publisher= John Wiley & Sons|isbn= 0-470-84573-2}} Uradni standard ISO (C99) v knjižni obliki.
* {{citat|last1= Dawkins|first1= Kyle|url= http://www.drdobbs.com/examining-objective-c/184402055|title= Examining Objective-C|date=2006-01-01|accessdate= 2014-10-13|language= en|quote= Objective-C je objektno usmerjena stroga supermnožica C|ref= harv}}
* {{citat|last1= Dawkins|first1= Kyle|url= http://www.drdobbs.com/examining-objective-c/184402055|title= Examining Objective-C|date=2006-01-01|accessdate= 2014-10-13|language= en|quote= Objective-C je objektno usmerjena stroga supermnožica C|ref= harv}}
* {{citat|last1= Feuer|first1= Alan R.|title= The C Puzzle Book|edition= 1.|date= 1998|publisher= [[Addison-Wesley]]|isbn= 978-0-201-60461-0|ref= harv}}
* {{citat|last1= Feuer|first1= Alan R.|title= The C Puzzle Book|edition= 1.|date= 1998|publisher= Addison-Wesley|isbn= 978-0-201-60461-0|ref= harv}}
* {{citat|last1= Feuer|first1= Alan R.|last2= Gehani|first2= Narain H.|title= Comparison of the Programming Languages C and Pascal|journal= ACM Computing Surveys|date= 1982-03|volume= 14|issue= 1|pages= 73-92|doi= 10.1145/356869.356872|subscription= yes|ref= harv}}
* {{citat|last1= Feuer|first1= Alan R.|last2= Gehani|first2= Narain H.|title= Comparison of the Programming Languages C and Pascal|journal= ACM Computing Surveys|date= 1982-03|volume= 14|issue= 1|pages= 73-92|doi= 10.1145/356869.356872|subscription= yes|ref= harv}}
* {{navedi enciklopedijo|last1= Giannini|first1= Mario|author2= Code Fighter, Inc.|author3= Univerza Columbia|editor1-last= Hossein|editor1-first= Bidgoli|encyclopedia= The Internet encyclopedia|volume= 1|date= 2004|publisher= John Wiley and Sons|isbn= 0-471-22201-1|title= C/C++ |url= http://www.wiley.com/WileyCDA/WileyTitle/productCd-0471222011.html|accessdate=2012-12-16|authorlink3=Univerza Columbia|ref= harv}}
* {{navedi enciklopedijo|last1= Giannini|first1= Mario|author2= Code Fighter, Inc.|author3= Univerza Columbia|editor1-last= Hossein|editor1-first= Bidgoli|encyclopedia= The Internet encyclopedia|volume= 1|date= 2004|publisher= John Wiley and Sons|isbn= 0-471-22201-1|title= C/C++ |url= http://www.wiley.com/WileyCDA/WileyTitle/productCd-0471222011.html|accessdate=2012-12-16|authorlink3=Univerza Columbia|ref= harv}}
Vrstica 549: Vrstica 606:
* {{citat|last1= Klemens|first1= Ben|authorlink1= Ben Klemens|title= 21st Century C|edition= 2.|publisher= [[O'Reilly Media]]|date= 2014|isbn= 1-4919-0389-9|url= http://shop.oreilly.com/product/0636920033677.do|ref= harv}}
* {{citat|last1= Klemens|first1= Ben|authorlink1= Ben Klemens|title= 21st Century C|edition= 2.|publisher= [[O'Reilly Media]]|date= 2014|isbn= 1-4919-0389-9|url= http://shop.oreilly.com/product/0636920033677.do|ref= harv}}
* {{citat|last1= Kochan|first1= Stephen G.|title= Programming in C|publisher= Addison-Wesley|location= Upper Saddle River [etc.]|date= 2014|isbn= 0-321-77641-0|cobiss= 10745940|url= http://books.google.si/books?id=jc5-3BArEjQC&|ref= harv}}
* {{citat|last1= Kochan|first1= Stephen G.|title= Programming in C|publisher= Addison-Wesley|location= Upper Saddle River [etc.]|date= 2014|isbn= 0-321-77641-0|cobiss= 10745940|url= http://books.google.si/books?id=jc5-3BArEjQC&|ref= harv}}
* {{citat|last1= Koenig|first1= Andrew|authorlink1= Andrew R. Koenig|date= 1989|title= [[C Traps and Pitfalls]]|publisher= Addison-Wesley|location= Reading, Mass.|isbn= 0-201-17928-8|cobiss= 2987248|oclc= 18014955|ref= harv}}
* {{citat|last1= Larson|first1= Jim|title= High and Low-Level C|url= http://www.jetcafe.org/jim/highlowc.html|date= 1996a-09-13|accessdate=2014-10-17|language= en|ref= harv}}
* {{citat|last1= Larson|first1= Jim|title= High and Low-Level C|url= http://www.jetcafe.org/jim/highlowc.html|date= 1996a-09-13|accessdate=2014-10-17|language= en|ref= harv}}
* {{citat|last1= Larson|first1= Jim|title= Standards and Style for Coding in ANSI C|url= http://www.jetcafe.org/jim/c-style.html|date= 1996b-12-31|accessdate= 2014-10-29|language= en|ref= harv}}
* {{citat|last1= Larson|first1= Jim|title= Standards and Style for Coding in ANSI C|url= http://www.jetcafe.org/jim/c-style.html|date= 1996b-12-31|accessdate= 2014-10-29|language= en|ref= harv}}
Vrstica 564: Vrstica 622:
* {{citat|last1= Sawtell|first1= Chris|url= http://gd.tuwien.ac.at/languages/c/cref-mleslie/CONTRIB/SAWTELL/intro.html|title= C Lesson|date= 1994|work= |accessdate=2014-10-17|language= en|ref= harv}}
* {{citat|last1= Sawtell|first1= Chris|url= http://gd.tuwien.ac.at/languages/c/cref-mleslie/CONTRIB/SAWTELL/intro.html|title= C Lesson|date= 1994|work= |accessdate=2014-10-17|language= en|ref= harv}}
* {{citat|last1= Scheffler|first1= Thomas|title= How to Think Like a Computer Scientist - 'C-Version'|date= 2013|url= http://prof.beuth-hochschule.de/scheffler/lehre/programmieren-in-c/|ref= harv}} Predelava knjige Downey, Allen B., ''How to Think Like a Computer Scientist - C++-Version''
* {{citat|last1= Scheffler|first1= Thomas|title= How to Think Like a Computer Scientist - 'C-Version'|date= 2013|url= http://prof.beuth-hochschule.de/scheffler/lehre/programmieren-in-c/|ref= harv}} Predelava knjige Downey, Allen B., ''How to Think Like a Computer Scientist - C++-Version''
* {{citat|last1= Schildt|first1= Herbert|authorlink1= Herbert Schildt|title= Artificial intelligence using C|date= 1987|publisher= Osborne/McGraw-Hill|location= Berkeley|isbn= 0-07-881255-0|cobiss= 773|ref= harv}}
* {{citat|last1= Schildt|first1= Herbert|authorlink1= |title= Advanced C|date= 1988|edition= 2.|publisher= Osborne/McGraw-Hill|location= Berkeley|isbn= 0-07-881348-4|cobiss= 17012736|ref= harv}}
* {{citat|last1= Schildt|first1= Herbert|authorlink1= |title= C : The Complete Reference|date= 2000|edition= 4.|publisher= Osborne/McGraw-Hill|location= Berkeley|isbn= 0-07-212124-6|cobiss= 25067781|ref= harv}}
* {{citat|last1= Schultz|first1= Thomas W.|title= C and the 8051|edition= 3.|date= 2004|publisher= PageFree Publishing Inc.|location= Otsego, MI|isbn= 1-58961-237-X|url= https://books.google.si/?id=rI0c8kWbxooC|accessdate= 2012-02-10|ref= harv}}
* {{citat|last1= Sedgewick|first1= Robert|authorlink1= Robert Sedgewick|title= Algorithms in C|date= 2009|publisher= Addison-Wesley|isbn= 0-201-31452-5|cobiss= 23760935|ref= harv}} (deli 1-4)
* {{citat|last1= Sedgewick|first1= Robert|authorlink1= Robert Sedgewick|title= Algorithms in C|date= 2009|publisher= Addison-Wesley|isbn= 0-201-31452-5|cobiss= 23760935|ref= harv}} (deli 1-4)
* {{citat|last1= Sedgewick|first1= Robert|authorlink1= |title= Algorithms in C|date= 2009|publisher= Addison-Wesley|isbn= 0-201-31663-3|cobiss= 23760679|ref= harv}} (del 5)
* {{citat|last1= Sedgewick|first1= Robert|authorlink1= |title= Algorithms in C|date= 2009|publisher= Addison-Wesley|isbn= 0-201-31663-3|cobiss= 23760679|ref= harv}} (del 5)
Vrstica 587: Vrstica 649:
* [http://cgibin.erols.com/ziring/cgi-bin/cep/cep.pl?_alpha=c C] na Dictionary of Programming Languages {{ikona en}}
* [http://cgibin.erols.com/ziring/cgi-bin/cep/cep.pl?_alpha=c C] na Dictionary of Programming Languages {{ikona en}}
* [http://www.lysator.liu.se/c/ Programming in C] (zbirka dokumentov na Lysator) {{ikona en}}
* [http://www.lysator.liu.se/c/ Programming in C] (zbirka dokumentov na Lysator) {{ikona en}}
* [http://www.iso-9899.info/wiki/Main_Page Spletišče wiki IRC-kanala ##C] na [[Fr{{ikona en}}
* [http://www.iso-9899.info/wiki/Main_Page Spletišče wiki IRC-kanala ##C] na [[Freenode]] {{ikona en}}
* [http://directory.fsf.org/wiki/Category/Library/C Category/Library/C] na [[Free Software Foundation|FSF]] {{ikona en}}
* [http://directory.fsf.org/wiki/Category/Library/C Category/Library/C] na [[Free Software Foundation|FSF]] {{ikona en}}
* [http://www.open-std.org/JTC1/SC22/WG14/ ISO/IEC JTC1/SC22/WG14 - C] {{ikona en}}
* [http://www.open-std.org/JTC1/SC22/WG14/ ISO/IEC JTC1/SC22/WG14 - C] {{ikona en}}
* [http://www.thefreecountry.com/documentation/onlinecpp.shtml Free Online C / C++ Tutorials and Documentation] {{ikona en}}
* [http://www.thefreecountry.com/documentation/onlinecpp.shtml Free Online C / C++ Tutorials and Documentation] {{ikona en}}
* [http://en.cppreference.com/w/c C reference] na cppreference.com {{ikona en}}
* [http://en.cppreference.com/w/c C reference] na cppreference.com {{ikona en}}

=== Spletni prevajalniki ===
<!-- {{Expand list|date=2016-04}} -->
{| class="wikitable"
! &nbsp;<br />url
! barvanje<br />skladnje
! različni<br />urejevalniki
! preverjanje<br />prevoda
! zagon<br />kode
! podprti<br />jeziki
! izhod v zbirnem<br /> jeziku
! &nbsp;<br />prevajalnik(i)
! opombe
<!-- |-
| [http://webcompiler.cloudapp.net/ cloudapp.net] || {{yes}} || {{no}} || {{yes}} || {{yes}} || {{yes|C}} || {{no}} || {{yes|gcc, clang}} || {{ikona en}} -->
|-
| [http://codepad.org/ codepad.org] || {{yes}} || {{yes}} || {{no}} || {{yes}} || {{yes|C, C++, ...}} || {{no}} || {{yes|–}} || {{ikona en}}
|-
| [http://comeaucomputing.com/tryitout/ comeaucomputing.com] || – || – || – || – || {{yes|C, C++}} || – || – || {{slepa povezava|date=2016-04-01}}
|-
| [http://www.compilr.com/ compilr.com] || – || – || – || – || – || – || – || {{slepa povezava|date=2016-04-10}}
|-
| [http://www.delorie.com/djgpp/compile/ delorie.com] || – || – || – || – || – || – || – || {{slepa povezava|date=2016-04-10}}
|-
| [http://gcc.godbolt.org/ godbolt.org] || {{yes}} || {{no}} || {{yes}} || {{no}} || {{yes|C, C++}} || {{yes}} || {{yes|gcc, clang}} || {{ikona en}}
|-
| [http://ideone.com ideone.com] || {{yes}} || {{no}} || {{yes}} || {{yes}} || {{yes|C, C++}} || {{no}} || {{yes|gcc, clang}} || {{ikona en}}
|-
| [http://melpon.org/wandbox melpon.org] || {{yes}} || {{yes|3×}} || {{yes}} || {{yes}} || {{yes|C, C++, C#, ...}} || {{no}} || {{yes|gcc, clang}} || {{ikona en}}
|-
| [http://rextester.com/runcode rextester.com] || {{yes}} || {{yes|3×}} || {{yes}} || {{yes}} || {{yes|C, C++, C#, ...}} || {{no}} || {{yes|gcc, clang, vs C}} || {{ikona en}}
|-
| [http://coliru.stacked-crooked.com/ stacked-crooked.com] || {{yes}} || {{no}} || {{yes}} || {{yes}} || {{yes|C, C++}} || {{no}} || {{yes|gcc, g++}} || {{ikona en}}
<!-- |-
| [http://www.tutorialspoint.com/compile_c_online.php tutorialspoint.com] || {{yes|20×}} || {{yes}} || {{yes}} || {{yes}} || {{yes|C, C++, C#, ...}} || {{no}} || {{yes|gcc}} || {{ikona en}} -->
|}


{{glavni programski jeziki}}
{{glavni programski jeziki}}

Redakcija: 18:59, 10. april 2016

C
Text in light blue serif capital letters on white background and very large light blue sans-serif letter C.
Paradigmaimperativna (proceduralna), strukturalna
Začetna izdaja1972 (1972)[a]
OblikovalDennis Ritchie
RazvijalecDennis Ritchie & AT&T Bellovi laboratoriji (tvorci);
ANSI X3J11 (ANSI C);
ISO/IEC JTC1/SC22/WG14 (ISO C)
Stabilna izdajaC11 (2011-12-08)
Tipizacijastatična, šibka, manifestna, imenska
Večje implementacijeGCC, Clang, Intel C, MSVC, Pelles C, Watcom C/C++
DialektiCyclone, Unified Parallel C, Split-C, Cilk, C*
VpliviB (BCPL, CPL), ALGOL 68,[b] zbirni jezik, Speedcoding, PL/I, FORTRAN
Vplival naštevilne: AMPL, AWK, csh, C++, C--, C#, Objective-C, BitC, D, Go, Rust, java, JavaScript, Limbo, LPC, Perl, PHP, Pike, Processing, Python, Seed7, Verilog (HDL)[2]
OSmnogoplatformsko
Običajna končnica datoteke.c, .h, a.out
Spletna stranhttps://www.iso.org/standard/74528.html in https://www.open-std.org/jtc1/sc22/wg14/
Wikibooks logo C Programming na Wikibooks
Koda za program Pozdravljen, svet v urejevalniku Gedit

Prográmski jêzik C ali kar C (izgovorjava [cé] ali po izvirniku [sí], /ˈs/) je nizkonivojski imperativni standardizirani računalniški programski jezik tretje generacije (3GL) za splošno rabo, ki ga je prvotno razvil Dennis Ritchie med letoma 1969 in 1973 v AT&T Bellovih laboratorijih.[3][1][4] Ritchie in Ken Thompson sta najprej razvila prevajalnik za operacijski sistem Unix, ki je bil v osnovi napisan v zbirnem jeziku. Unixovo jedro je bilo tako prvo napisano v drugem jeziku in ne v zbirnem. Kasneje se je C hitro pojavil tudi na drugih operacijskih sistemih.

Kot večina imperativnih jezikov v tradiciji ALGOLa je C zmožen strukturalnega programiranja in omogoča leksično območje spremenljivk ter rekurzijo, statični sistem tipov pa preprečuje mnogo nenameravanih operacij. Njegova konstrukcija omogoča konstrukte, ki se učinkovito preslikujejo v tipične strojne ukaze, in zaradi tega se je C začel rabiti v aplikacijah, ki so bile prej razvite v zbirnem jeziku, še posebej v sistemskem programju, kot je npr. računalniški operacijski sistem Unix,[5] kot tudi različnem uporabniškem programju za računalnike od superračunalnikov do vgrajenih sistemov.

C velja za učinkovit jezik in je primeren za sistemska opravila, ni pa najprimernejši za učenje programiranja, čeprav se pogosto pojavlja v izobraževanju. Je tudi eden od najbolj razširjenih programskih jezikov, skupaj z javo, C++ ali PHP, od leta 2008 pa mu priljubljenost celo rahlo narašča.[6][7] Obstaja zelo malo arhitektur in operacijskih sistemov za katere ni na voljo prevajalnika za C. C se veliko rabi tudi za razvoj prenosljivega uporabniškega programja.[5]

Razvoj jezika C je zelo vplival na druge programske jezike, še posebej na C++, ki se je razvil kot razširitev C-ja. Mnogo kasnejših jezikov si je neposredno ali posredno sposodilo določene gradnike C-ja, na primer: D, Go, Rust, java, JavaScript, Limbo, LPC, C#, Objective-C, Perl, PHP, Python, Verilog (strojni opisni jezik),[2] in Unixova C shell. Ti jeziki so dobili mnogo svojih nadzornih struktur in drugih osnovnih gradnikov od C-ja. Večina od njih, kjer je Python največja izjema, je tudi skladenjsko podobnih C-ju v splošnem in so usmerjeni na združevanje razpoznavnih izrazov in stavkov skladnje jezika C z osnovo sistemov tipa, podatkovnih modelov in semantiko, ki je lahko popolnoma drugačna. Skladnja pri teh jezikih včasih vključuje tudi enakovredne preproste nadzorne strukture.[8][c][9][10][d] C++ in Objective-C sta bila na začetku jezika prevajalnikov, ki so tvorila kodo v C. C++ je trenutno skoraj supermnožica C,[11] Objective-C pa je stroga supermnožica C.[12][13][14] C se rabi tudi kot posredni jezik za druge jezike[15] ter za ustvarjanje standardnih knjižnic in izvajalnih sistemov za višjenivojske jezike, kot je npr. CPython.[16]

Pred uradnim standardom za C se je mnogo uporabnikov in izvršiteljev opiralo na neuradno specifikacijo, opisano v knjigi Programski jezik C Briana Kernighana in Ritchieja. Ta različica je v splošnem znana kot »K&R« C. Leta 1989 je Ameriški državni inštitut za standarde (ANSI) objavil standard za C (v splošnem imenovan »ANSI C« ali »C89«). Naslednje leto je to specifikacijo potrdila Mednarodna organizacija za standardizacijo (ISO) kot mednarodni standard (v splošnem imenovan »C90«). ISO je kasneje izdala razširitev standarda za podporo internacionalizacije leta 1995 in popravljeni standard (znan kot »C99«) leta 1999. Ta standard je do sedaj najbolj razširjen. Trenutna različica standarda (sedaj imenovana »C11«) je ISO kot ISO/IEC 9899:2011 potrdila 8. decembra 2011.[17]

Osnovne značilnosti jezika

C je dokaj skop programski jezik, ki deluje blizu strojne opreme, in je z razliko od večine programskih jezikov bolj podoben zbirniku. Včasih ga imenujejo »prenosljivi zbirnik«, kar tudi označuje njegovo pomembno razliko od zbirniškega jezika. Izvorno kodo, napisano v C, se da prevesti in pognati na skoraj vsakem stroju. Tega ne zmore skoraj noben obstoječ programski jezik in tudi kodo, zapisano v zbirniku, se lahko požene le na določenih vrstah strojev. C po navadi imenujejo nizkonivojski ali srednjenivojski jezik, kar označuje kako blizu strojne opreme lahko deluje.

V C-ju je izvršna koda vsebovana znotraj podprogramov, imenovanih »funkcije«, čeprav ne v strogem pomenu funkcionalnega programiranja. Parametri funkcij se vedno prenašajo po vrednosti. Prenos po sklicu se v C simulira z eksplicitnim prenašanjem vrednosti kazalcev. Izvorno besedilo programa v C je v prostem formatu in za končnik stavkov rabi podpičje (;), ter zavita oklepaja ({ }) za združevanje blokov stavkov.

C so naredili zaradi enega samega pomembnega namena, kar ni slučajnost, da bi bilo moč pisati velike programe z manj napakami v proceduralnem programiranju in, da pisec programov ne bi nosil bremena tvorjenja prevajalnika za C, ki ga otežujejo zapleteni gradniki jezika. V tem smislu ima C naslednje pomembne značilnosti:

  • majhno fiksno število rezerviranih besed, ki vključuje polno množico primitivov nadzornega pretoka: for, if/else, while, switch in do/while. Obstaja en imenski prostor, imena, ki jih opredeli uporabnik, se ne morejo razlikovati od rezerviranih besed z nobeno vrsto sigle,
  • veliko število aritmetičnih, logičnih (eniških, dvojiških, trojiških) in pozapisnih operatorjev, kot so npr.: +, -, !, *, &, ~, +=, ++, <<, ? :, ., -> ipd.,
  • v enem stavku se lahko izvede več kot ena prireditev,
  • preprost sistem podatkovnih tipov, ki obvaruje pred brezpredmetnimi operacijami,
  • slovarsko področje spremenljivk,
  • tipizacija je statična, vendar prisiljeno šibka: vsi podatki imajo tip, lahko pa se izvede implicitno pretvarjanje. Znaki se lahko na primer rabijo kot cela števila,
  • usmeritev na proceduralno programiranje z zmožnostjo programiranja v slogu strukturalnega programiranja,
  • označitvena skladnja posnema kontekst rabe. C nima rezervirane besede »define« in se namesto tega stavek, ki se začne z imenom tipa, vzame kot označitev. Ne obstaja rezervirana beseda »function«, namesto tega je funkcija naznačena z oklepajema, ki objemata seznam njenih parametrov,
  • uporabniško definirani tipi (typedef) in sestavljeni tipi,
    • naštevni tipi (enumerated types) z rezervirano besedo enum. Niso opremljeni z označbami in so prosto medsebojno spremenljivi s celimi števili,
    • zapisi ali skupki raznovrstnih podatkovnih tipov (struct), ki jih določi uporabnik, in omogočajo združevanje in upravljanje podobnih podatkovnih elementov v celoti,
    • indeksiranje polj je sekundarni zapis, definiran s pomočjo kazalčne aritmetike. Z razliko od unij, polja niso prvorazredni objekti – ni jih moč prirediti ali primerjati s pomočjo posameznih vgrajenih operatorjev. Pri rabi ali opredelitvi ne obstaja rezervirana beseda »array«. Namesto tega oglata oklepaja ([ ] nakazujeta polja skladenjsko, na primer mesec[11],
    • znakovni nizi niso posebni podatkovni tip, ampak so po navadi izvedeni kot ničelno omejena polja znakov z nadzornim ničelnim znakom '\0',[e]
  • uporaba predprocesorskega jezika, predprocesorja C, za naloge kot so določevanje makrojev, vključevanje večkratnih datotek z izvorno kodo in pogojno prevajanje,
  • nizkonivojski nepreverjeni dostop do računalniškega pomnilnika s pomočjo pretvorbe strojnih naslovov v tipske kazalce,[f]
  • parametri, ki prehajajo v funkcije po vrednosti in ne po sklicu (referenci),
  • kadar se ne rabi, se lahko vrednost vračanja funkcije prezre,
  • podprogrami, ki ne vračajo vrednosti, so posebni primer funkcij z netipskim vrnitvenim tipom void.
  • funkcije se ne morejo opredeliti znotraj slovarskega področja drugih funkcij.
  • kazalci na funkcije, ki omogočajo osnovno obliko zaprtja (closure) in izvajalnega polimorfizma,
  • osnovna oblika modularnosti: datoteke se lahko prevedejo samostojno in povežejo skupaj, z nadzorom katere funkcije in podatkovni objekti so vidni v drugih datotekah prek atributov static ali extern,
  • zelo omejena raba ukaza else (načelo KISS).
  • preprost jedrski jezik s pomembno kompleksno funkcionalnostjo, kot na primer upravljanje V/I nalog in delo z znakovnimi nizi, matematične funkcije ali delo z datotekami omogočajo knjižniški podprogrami,

C ne vsebuje nekaterih gradnikov, ki so sestavni deli novejših, sodobnejših visokonivojskih jezikov, kot na primer objektne usmerjenosti ali samodejnega čiščenja pomnilnika, tako da ima ročno upravljanje pomnilnika.

Razvoj

Zgodnji razvoj

Ken Thompson in Dennis Ritchie, tvorca programskega jezika C
18-bitni miniračunalnik DEC PDP-7A (S#115) pred restavriranjem v Oslu leta 2005. Na takšnem stroju so leta 1969 Thompson, Ritchie, Ossana, Canaday in McIlroy v zbirnem jeziku razvili operacijski sistem Unix

Izvor jezika C je tesno povezan z razvojem operacijskega sistema Unix, ki so ga izvirno razvili v zbirnem jeziku na miniračunalniku DEC PDP-7 Ritchie, Thompson, Joe Ossana, Rudd Canaday in Doug McIlroy v AT&T Bellovih laboratorijih, in vključili več zamisli svojih kolegov.[19] V začetku Thompson niti ni programiral na samem PDP-7, ampak je rabil množico makrojev za zbirni jezik GEMAP na 32-bitnem osrednjem stroju General Electric GE-635. Nato je poprocesor tvoril papirni trak, ki ga je PDP-7 lahko prebiral.[1] Kmalu je Unix s preprostim jedrom, zbirnim jezikom, preprosto lupino (tolmačem ukazov) in z nekaterimi pripomočki (kot npr. Unixovi ukazi rm, cat, cp) leta 1969 postal samozadosten, in razvoj se je lahko nadaljeval neodvisno na samem PDP-7. Douglas McIlroy je kmalu zatem tvoril prvi visokonivojski jezik sistema Unix, izvedbo prevajalnika prevajalnikov TMG Roberta M. McClurea. McIlroy in Bob Morris sta uporabila TMG za zgodnji prevajalnik jezika PL/I v operacijskem sistemu Multics. Thompson se je zaradi McIlroyjevega uspeha reproduciranja TMG odločil, da je Unix, ki verjetno tedaj še ni bil imenovan tako, potreboval lasten sistemski programski jezik.

Pisanje v zbirnem jeziku novo nastalega Unixa je bilo nerodno. Za pisanje programskih struktur se je porabilo več časa, kodo je bilo težje razhroščevati in jo razumeti.[20] Thomson je želel imeti prednosti visokonivojskega jezika vendar ne v smislu operacijskega sistema Multics, napisanega v PL/I in zbirnem jeziku. Bil je vodja neformalne skupine v AT&T, ki je začela pregledovati možnosti drugih operacijskih sistemov in višjenivojskih jezikov. Najprej je s pomočjo TMG leta 1970 neuspešno hotel uporabiti Fortran[21], nato pa je ustvaril jezik B s poenostavitvijo raziskovalnega jezika BCPL, ki ga je leta 1967 razvil Martin Richards, tako da je lahko njegov tolmač šel v 8 kB 18-bitni besedni pomnilnik računalnika PDP-7.

B se je izkazal za zelo počasnega in nezmožnega za sistemsko programiranje v samem Unixu. Tako kot BCPL je bil brez tipov. Pri novem zmogljivejšem računalniku DEC PDP-11 je bil jezik brez tipov neizvršljiv. Njegov procesor je podpiral podatkovne tipe različnih velikosti in z jezikom B tega ni bilo moč izraziti. Problem je bilo tudi izvajanje. Thompson in Ritchie sta se odločila prenesti operacijski sistem na PDP-11. Prva različica PDP-11 je imela 16 kB pomnilnika za operacijski sistem in 8 kB za uporabniške programe.[19] Tudi njegov operacijski sistem je bil napisan v zbirnem jeziku. Želela sta napisati operacijski sistem v jeziku B. Najprej je zaradi nezmožnosti rabe nekaterih prednosti računalnika PDP-11, še posebej bajtno naslovljivost, v letu 1971 nastal »novi B« (NB), ki je rešil te probleme.[22] Ta jezik se je kmalu razvil in preimenoval (leta 1972) v C. Postal je prevajalni in ne tolmačitveni jezik.

Začetni razvoj jezika C je po Ritchiejevih besedah potekal v AT&T Bellovih laboratorijih med letoma 1969 in 1973[1]. Najbolj kreativno obdobje je bilo leta 1972. Tedaj je bila večina Unixa ponovno napisana v C-ju.[23] Do leta 1973 z dodatkom podatkovnega tipa zapisov struct je C postal dovolj močan za prevod Unixovega jedra. Novi jezik je dobil ime »C«, ker so bili njegovi gradniki izvedeni iz jezika »B«, ta pa je bil po Thompsonovih besedah okleščena različica jezika BCPL.[24]

Tako je bilo Unixovo jedro prvo jedro kakšnega operacijskega sistema napisano v drugem jeziku od zbirnega. Pred tem sta bila na primer še operacijska sistema Multics (napisan v PL/I) in MCP (Master Control Program) za sistem Burroughs B5000 (napisan v ALGOLu leta 1961.) Leta 1977 sta Ritchie in Stephen Curtis Johnson dodatno spremenila jezik C za pospešitev prenosljivosti operacijskega sistema Unix. Johnsonov Portable C Compiler (PCC) je služil kot osnova za več izvedb C-ja na novih platformah.[25]

K&R C

Naslovnica izvirne prve izdaje knjige Programski jezik C (The C Programming Language) iz leta 1978

Leta 1978 sta Kernighan in Ritchie objavila prvo izdajo knjige Programski jezik C (The C Programming Language).[26] Ta knjiga, pri programerjih v C-ju znana kot »bela knjiga« (white book), oziroma »K&R«[1], je bila mnogo let neformalna specifikacija jezika. Različica jezika C, ki ga knjiga opisuje, se navadno imenuje K&R C. Druga izdaja knjige[26] pokriva kasnejši standard ANSI C.

K&R je uvedla nekaj jezikovnih gradnikov:

  • standardna V/I knjižnica
  • podatkovni tip long int
  • podatkovni tip unsigned int
  • sestavljeni prireditveni operatorji v obliki =op (kot npr. =-) so spremenjeni v obliko op= zaradi semantične dvoumnosti pri tvorjenju takšnih konstruktov kot npr. i=-10, kar je bilo tolmačeno kot i =- 10 (zmanjšaj i za vrednost 10) namesto možno predvidenega i = -10 (priredi i vrednost -10)

Tudi po objavi standarda C leta 1989, je K&R C še vedno mnogo let veljal za »najmanjši skupni imenovalec« na katerega so se programerji v C-ju omejili, kadar je bila žaželena največja možna prenosljivost, saj je bilo v rabi še vedno več starejših prevajalnikov, skrbno napisana koda v K$R C pa je bila lahko tudi veljavni standard za C.

V zgodnejših različicah C-ja je bilo treba pred opredelitvijo (definicijo) uvesti le funkcije, ki so vračale vrednosti razen tipov int. Funkcija, ki se je rabila brez predhodne označitve (deklaracije), je privzeto vračala vrednosti int, če se je njena vrednost uporabila. Na primer:

long neka_funkcija();
/* int */ druga_funkcija();

/* int */ klicna_funkcija()
{
long test1;
register /* int */ test2;

    test1 = neka_funkcija();
    if (test1 > 0)
        test2 = 0;
    else
        test2 = druga_funkcija();
    return test2;
}

Določilnike tipa int, ki so izpuščeni, v K&R C ni bilo treba navajati, kasnejši standardi pa so jih zahtevali.

Ker označitev funkcij v K&R C ni vsebovala nobenega podatka o parametrih funkcije, njihovo preverjanje ni bilo izvedeno, čeprav je nekaj prevajalnikov javljalo opozorilno sporočilo, če je bila lokalna funkcija klicana z napačnim številom parametrov, ali, če je več klicev zunanje funkcije rabilo različno število tipov parametrov. Razvili so več ločenih orodij, kot na primer Unixov pripomoček lint, ki so poleg drugih stvari lahko preverjala doslednost rabe funkcij križem v več datotekah izvorne kode.

Po objavi K&R C so k jeziku dodali več gradnikov, ki so jih podpirali prevajalniki, na primer od AT&T (še posebej PCC[27]) in od nekaterih drugih ponudnikov. Med njimi so:

Veliko število razširitev, pomanjkanje dogovora o standardni knjižnici, priljubljenost jezika in dejstvo, da tudi na operacijskem sistemu Unix prevajalniki niso dosledno izvrševali specifikacije K&R, je vodilo do potrebe za standardizacijo.

ANSI C in ISO C

Glavni članek: ANSI C.

V poznih 1970-ih in 1980-ih so izvedli različice C-ja za širok razpon osrednjih računalnikov, miniračunalnikov in mikroračunalnikov, vključno z osebnim računalnikom IBM PC, saj se je tedaj njegova priljubljenost zelo povečala.

Leta 1983 je Ameriški državni inštitut za standarde (ANSI) ustanovil odbor X3J11 za ustanovitev standardne specifikacije jezika C. X3J11 je osnoval standard za C na Unixovi izvedbi; vendar so neprenosljivi del Unixove knjižnice C predali delovni skupini 1003 IEEE, ki je postala osnova za standard POSIX leta 1983. Leta 1989 so standard C potrdili kot ANSI X3.159-1989 »Programming Language C«. Ta različica jezika se po navadi imenuje ANSI C, Standard C ali včasih C89.

Leta 1990 je standard ANSI C (z oblikovnimi spremembami) sprejela Mednarodna organizacija za standardizacijo (ISO) kot ISO/IEC 9899:1990, kar se včasih imenuje C90. Tako se izraza »C89« in »C90« nanašata na isti programski jezik.

Kakor druge nacionalne ustanove za standarde ANSI ni več razvijal standarda C neodvisno, ampak ga je odložil k mednarodnemu standardu C, ki ga vzdržuje delovna skupina ISO/IEC JTC1/SC22/WG14. Nacionalna usvojtev posodobitve mednarodenga standarda se po navadi izvede še v letu publikacije ISO.

Eden od ciljev procesa standardizacije jezika C je bilo tvorjenje supermnožice K&R C, ki bi vključevala več predhodno uvedenih neuradnih gradnikov. Standardizacijski odbor je vključil tudi več dodatnih gradnikov, kot so npr. prototipi funkcij (izposojeno od C++), kazalci void, podpora za mednarodni nabor znakov in lokalnih parametrov, ter predprocesorske izboljšave. Čeprav je bila skladnja za označitev parametrov povečana, da bi vključevala slog rabljen v C++, je bil vmesnik K&R zaradi združljivosti z obstoječo izvorno kodo še naprej dovoljen.

C89 podpirajo trenutni prevajalniki za C, večina kode v C-ju, ki je zapisana sedaj, temelji na njem. Vsak program, zapisan le v ANSI C in brez privzetkov odvisne strojne opreme, se bo izvajal pravilno na katerikoli platformi v skladu z izvedbo C-ja v mejah svojih virov. Brez takšnih previdnosti se lahko programi prevedejo le na določenih platformah ali z določenim prevajalnikom zaradi na primer rabe nestandardnih knjižnic, kot so knjižnice grafičnih uporabniških vmesnikov, ali oslonitev na računalniške ali specifične platformske atribute, kot je točna velikost podatkovnih tipov in ureditev bajtov (endianness).

V primerih, ko mora biti koda prevedljiva tako v skladu s standardom ali s prevalniki na osnovi K&R C, se lahko rabi makro __STDC__, ki razdeli kodo na dele z ANSI C in K&R, ter tako prepreči prevajalnikom na osnovi K&R C uporabo gradnikov, razpoložljivih le v ANSI C.

Po standardizacijskem procesu ANSI/ISO je specifikacija jezika C več let ostala statična. Leta 1995 so k standardu C iz leta 1990 dodali Normative Amendment 1 (ISO/IEC 9899/AMD1:1995, neformalno znan kot C95). Z njim so popravili nekaj podrobnosti in dodali obsežnejšo podporo mednarodnega nabora znakov.

C99

Glavni članek: C99.

Standard C so v poznih 1990-ih na novo popravili, kar je leta 1999 vodilo do objave standarda ISO/IEC 9899:1999, ki je v splošnem znan kot »C99«. Od tedaj so ga s tehniškimi popravki dopolnili trikrat.[28]

C99 je uvedel več novih gradnikov. Na primer znotrajvrstične funkcije (inline functions), nove podatkovne tipe (na primer long long int in complex za delo s kompleksnimi števili), polja s spremenljivo dolžino (variable-length arrays (VLA)), izboljšano podporo aritmetike s plavajočo vejico IEEE 754, podporo variarnih makrojev (variadic macros, makrojev s spremenljivo arnostjo) in podporo enovrstičnih komentarjev, ki se začnejo z dvema poševnicama //, kot v BCPL ali C++. Več teh gradnikov je kot razširitve tedaj že podpiralo nekaj prevajalnikov za C.

C 99 je večinoma nazaj združljiv s C90, vendar je na nekaterih mestih strožji. Še posebej, označitev, ki je brez določilnika tipa, implicitno privzeto ni več tipa int. Standardni makro __STDC_VERSION__ je določen z vrednostjo 199901L in nakazuje, da je na voljo podpora C99. GCC, Solaris Studio in drugi prevajalniki za C sedaj podpirajo mnogo ali pa vse nove gradnike C-ja v standardu C99. Prevajalnik za C v Microsoft Visual C++ izpolnjuje standard C89 in tiste dele C99, ki so zahtevani za združljivost z različico standarda C++11.[29]

C11

Leta 2007 so se začela dela na novi različici standarda C, ANSI C11 ali ISO/IEC 9899:2011, do objave 8. decembra 2011 neformalno imenovane »C1X«. Standardizacijski odbor je sprejel smernice za omejitev usvojitve novih gradnikov, ki jih niso preskusili z obstoječimi izvedbami.

V standardu C11 se je pojavilo več novih gradnikov jezika C in knjižnic, na primer: makroji rodovnih tipov, anonimne strukture, izboljšana podpora kodirnega standarda Unicode, atomske operacije, mnogonitnost in funkcije s preverjanjem mej. Neketeri deli obstoječe knjižnice C99 so postali izbirni, izboljšana je bila tudi združljivost s C++. Standardni makro __STDC_VERSION__ je definiran kot 201112L in tako označuje, da je na voljo podpora standardu C11.

Vdelani C

Glavni članek: vdelani C.

Programiranje z vdelanim C-jem (embedded C) zgodovinsko zahteva nestandardne razširitve k jeziku C, da se lahko podpirajo C-ju tuji gradniki, kot so npr.: aritmetika s fiksno vejico, mnogokratne različne pomnilniške vrstice in osnovne V/I operacije.

Leta 2008 je standardizacijski pododbor SC 22 objavil tehniško poročilo z razširitvijo jezika C,[30] ki se je nanašala na probleme med razširitvami jezika C za različne vdelane sisteme, in tako zagotovila splošni standard za vse ustrezne izvedbe. Vključuje več gradnikov, ki v normalnem C niso na voljo: aritmetika s fiksno vejico, prostori z imenovanimi naslovi in osnovno V/I naslavljanje strojne opreme.

Vdelani C rabi večino skladnje in semantike standardnega C-ja: funkcija main, opredelitev spremenljivk, označitev podatkovnih tipov, pogojni stavki (if, switch, case), zanke (while, for), funkcije, polja in znakovni nizi, strukture in unije, bitne operacije, makroji ipd.

Skladnja

Glavni članek: skladnja jezika C.

C ima formalno slovnico, ki jo določa standard C.[31] Z razliko od nekaterih drugih jezikov, kot je npr. FORTRAN 77, je izvorna koda C-ja proste oblike, kjer se znaki za prazni prostor lahko rabijo poljubno, koda pa ni odvisna od stolpčnih ali besedilno-vrstičnih omejitev. Meje vrstic so drugače med predprocesorsko fazo pomembne.

Komentarji

Komentarji so lahko med razmejilnima znakoma /* in */ enovrstično ali mnogovrstično, od standarda C99 naprej pa tudi za razmejilnima znakoma // enovrstično do konca vrstice. Komentarji, ki jih razmejujeta /* in */, ne smejo biti vgnezdeni. Če se zaporedje teh dveh znakov pojavi znotraj znakovnega niza ali znakovnega črkovnega simbola, se ne obravnavata kot razmejilna znaka komentarja.[26] Komentarji oblike:

/* ... */

/*
...
*/

/* ... // ... */

// ...

/*
... // ...
*/

so v redu, vgnezdeni enovrstično pa npr. ne:

/* /* ... */ ... */

ali vgnezdeni mnogovrstično:

/* 
/* ... 
*/ ... 
*/

saj drugo zaporedje /* ne velja za razmejilni znak komentarja, kot tudi ne drugo zaporedje */, ki je sedaj zunaj komentarja, in prevajalnik bi v obeh primerih javil napako.

Izrazi

Datoteke s C-jevsko izvorno kodo vsebujejo označitev (deklaracijo) in opredelitev (definicijo) funkcij. Opredelitve funkcij po vrsti vsebujejo označitve in stavke. Označitve opredeljujejo nove podatkovne tipe z rezerviranimi besedami, kot so: struct, union in enum, ali prirejajo tipe in morda rezervirajo pomnilniška mesta novim spremenljivkam, po navadi z zapisom tipa, ki mu sledi ime spremenljivke. Rezervirane besede, kot sta char in int, označujejo vgrajene tipe. Deli kode so obdani z zavitima oklepajema { in }, ki omejujeta označitveno področje ali pa delujeta kot samostojni stavek za nadzorne strukture.

C kot imperativni jezik za označitev dejanj rabi stavke. Najbolj razširjeni stavek je izrazni stavek, ki vsebuje izraz, kateremu je treba določiti vrednost, izrazu pa sledi podpičje. Zaradi še večje preglednosti se podpičje velikokrat razmakne od označitvenih/ukaznih besed z dodatnim presledkom. Na primer:

int a;                  |   int a ;
for (i=0; i<max; i++)   |   for (i = 0 ; i < max ; i++)

Kot stranski pojav določitve vrednosti se funkcije lahko kličejo in spremenljivkam se lahko priredijo nove vrednosti. Za spreminjanje normalne zaporedne izvršitve stavkov ima C več stavkov za nadzor toka, ki jih označujejo rezervirane besede. Strukturalno programiranje je podprto s pogojno ivršitvijo if(-else), z iterativnimi izvršitvami (zankami) if(-else), while in for. Stavek for ima ločene dodelitvene izraze, izraze za preverjanje in izraze za ponovno dodelitev – vsak od njih pa se lahko opusti. Izraza break in continue se lahko rabita za zapustitev najbolj notranjega zančnega stavka ali za preskočitev na njeno ponovno dodelitev. Obstaja tudi nestrukturalni stavek goto, ki preusmerja neposredno na imenovano oznako znotraj funkcije. switch izbere primer, ki se izvede na podlagi vrednosti celoštevilskega izraza.

Izrazi lahko rabijo različne vgrajene operatorje in lahko vsebujejo klice funkcij. Vrstni red po katerem se določijo vrednosti argumentom funkcij in operandom večine operatorjev ni določen. Določevanje vrednost je lahko tudi vloženo vmes. Vendar se bodo vsi stranski vplivi, (vključno s pomnilnikom do spremenljivk) pojavili pred naslednjo »zaporedno točko«. Zaporedne točke vsebujejo zaključek vsakega izraznega stavka ter vstop in vračanje iz vsakega klica funkcije. Zaporedne točke se pojavijo tudi med določevanjem vrednosti izrazov, ki vsebujejo določene operatorje (&&, ||, ?: in operator vejica). To dovoljuje visoko stopnjo optimizacije kode prevajalnika, vendar od programerjev v C zahteva večjo skrb za dosego zanesljivih rezultatov kot je potrebna pri drugih programskih jezikih.

Kernighan in Ritchie v uvodu knjige Progranski jezik C pravita: »C ima, kot drugi jeziki, svoje hibe. Nekateri od operatorjev imajo napačno prednost; nekateri deli skladnje bi lahko bili boljši.«[33] Standard C ni poskušal popraviti veliko od teh hib zaradi vpliva takšnih sprememb na že obstoječo programsko opremo.

Nabor znakov

Osnovni nabor znakov izvorne kode jezika C vsebuje:

  • neštevilske znake:
    A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z
    a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z
  • številske znake:
  • dodatnih 28 grafičnih znakov: ! " # % & ' ( ) * + , - . / : ; < = > ? [ \ ] ^ { | } ~
  • znake za prazni prostor (whitespace): presledek, vodoravni tabulator, navpični tabulator, pomik na novo stran, nova vrstica (newline)

Nova vrstica označuje konec vrstice besedila. Ni treba da odgovarja dejanskemu posameznemu znaku, čeprav je v C zaradi prikladnosti to posamezen znak.

Lahko se rabijo tudi dodatni mnogobitno zakodirani znaki v prikazu znankovnih nizov, vendar niso povsem prenosljivi. Zadnji standard za C (C11) dovoljuje mnogonacionalne znake kodirnega standarda Unicode, ki so prenosljivo lahko del besedila izvorne kode C s pomočjo kodiranj \uXXXX ali \UXXXXXXXX, kjer X označuje šestnajstiško zapisan znak. Ta možnost še ni v široki rabi.

Osnovni izvršni nabor znakov C obsega enake znake, skupaj s prikazom opozorila (alert), povratnega znaka (backspace) in pomika na začetek vrstice (carriage return). Podpora izvajalnemu času za razširjene nabore znakov se je z vsako različico standarda za C povečevala.

Rezervirane besede

Naslednje besede (keywords; reserved words) so v jeziku C rezervirane in imajo strog pomen kot posamezni znaki (tokens).[34][17] Ne smejo se na novo opredeliti ali se rabiti kot identifikatorji v drugih kontekstih:

_Alignas
_Alignof
_Atomic
auto
_Bool
break
case
char
_Complex
const

continue
default
do
double
else
enum
entry
extern
float
for

_Generic
goto
if
_Imaginary
inline
int
long
_Noreturn
register
restrict

return
short
signed
sizeof
static
_Static_assert
struct
switch
_Thread_local
typedef

union
unsigned
void
volatile
while[35]

Besede so občutljive na male ali velike črke. INT, INt, InT, Int, iNT, iNt ali inT na primer ni enako kot int. V različnih izvedbah prevajalnikov za C se lahko pojavijo tudi druge rezervirane besede, npr. ada, asm, fortran, pascal, čeprav se tam običajno nestandardne besede začnejo z enim ali dvema podčrtajema, npr. __asm, _Cdecl ipd.[35] V primerjavi z drugimi velikimi jeziki ima C majhno število rezerviranih besed. Ada jih ima na primer 62. Ena od značilnosti jezika C je, da lahko naredi veliko z relativno malo posebnimi simboli in rezerviranimi besedami.[34] Na začetku je imel C manj rezerviranih besed, na primer 29, sedaj pa jih pozna 44. Kasneje so bile dodane rezervirane besede, kot so: _Bool, _Complex, const, _Imaginary, inline, restrict, signed in volatile. Beseda entry se ni nikoli rabila in sedaj ni več rezervirana.[26]

Operatorji

Glavni članek: operatorji v C in C++.

C podpira bogat nabor operatorjev, ki so simboli znotraj izraza za določevanje potrebnih opravil med njegovim izvajanjem. C ima operatorje za:

C rabi operator =, ki je v matematiki rezerviran za izražanje enakosti, za naznanitev prireditve po zgledu predhodnih jezikov Fortrana in PL/I, vendar z razliko od ALGOLa in njegovih izpeljank. Podobnost med cejevskima operatorjema za prireditev in za primerjanje enakosti (==) so kritizirali, saj se ju lahko preprosto zamenja. V mnogih primerih mora biti vsak rabljen v kontekstu drugega brez napak prevajalnika, čeprav nekateri prevajalniki tvorijo opozorila. Pogojni izraz v if(a=b+1) je pravilen, če a ni enak nič po prireditvi.[36] Poleg tega operatorska prednost ni intuitivna, saj se operator == zvezuje tesneje kot operatorja & in | v izrazih, kot je x & 1 == 0, ki bi moral biti zapisan kot (x & 1) == 0 za pravilno določitev vrednosti.[37]

Zgradba, oblika programa in slog v C

Osnovni gradnik programa v C je funkcija.[38] Vsak program v C je zbirka ene ali več funkcij. Funkcije sestavljajo označitve spremenljivk in stavki, ali zapleteni ukazi, obkrožata pa jih zavita oklepaja ({ in }).

Zgleda programov

Program Pozdravljen, svet

Spodnji zgled izpiše znakovni niz »Pozdravljen svet!« na standardni izhod. Navadno je standardni izhod povezan z zaslonom monitorja, lahko pa je tudi datoteka ali kakšna druga strojna naprava. Program je napisan v skladu s standardom ANSI C.

#include <stdio.h>

int main(void)
{
    printf("Pozdravljen svet!\r\n");
    return 0;
}

Sledi analiza programa po vrsticah:

#include <stdio.h>

Prva vrstica v programu je predprocesorski ukaz (navodilo, direktiva) #include. Pred samim prevajanjem programa predprocesor pregleda izvorno kodo in izvrši vse predprocesorske ukaze. Ti ukazi se vedno začnejo z znakom #. Ukaz #include povzroči, da se na njegovo mesto v izvorno kodo vključi datoteka stdio.h, ki vsebuje standardne vhodno izhodne funkcije.

int main(void)

V naslednji vrstici se opredeli funkcija z imenom main. Ta funkcija ima poseben pomen v C programih. Pri začetku izvajanja programa se najprej kliče ta funkcija. Ključna beseda int na začetku vrstice pove, da funkcija main() vrne celo število, ključna beseda void pa, da funkcija ne sprejme nobenih parametrov. Funkcija main po standardu ANSI C vedno vrača vrednost, čeprav nekateri prevajalniki prevedejo kodo uspešno, četudi temu ni tako. Tudi v jeziku C++ je ta funkcija še vedno C-jevska. Funkcija main je lahko opredeljena s pomočjo naslednjih štirih oblik ob označitvi:[39][g][h][i]

int main() { /* ... */ }
int main(void) { /* ... */ }
int main(int argc, char *argv[]) { /* ... */ }
int main(int argc, char **argv) { /* ... */ }

oziroma prototipno:

int main();
int main(void);
int main(int, char *[]);
int main(int, char **);

Prvi dve opredelitvi sta enakovredni (in združljivi s C++).

{

Odprti zaviti oklepaj pomeni začetek opredelitve main funkcije.

printf("Pozdravljen svet!\r\n");

V tej vrstici se kliče funkcija printf, ki je označena v datoteki stdio.h. Pri tem klicu se funkciji printf poda en parameter v obliki znakovnega niza. Na koncu znakovnega niza je še posebni dvoznakovni niz \n, ki se prevede v znak EOL (end of line). Znak je namenjen kot ukaz izhodni napravi, da postavi trenutno lego na začetek naslednje vrstice.

return 0;

Vrstica zaključi izvajanje main funkcije in vrne celo število 0.

}

Zaprti zaviti oklepaj pomeni zaključek opredelitve funkcije main.

Minimalni program

Katera opredelitev funkcije main se uporabi v programu, je verjetno odvisno od posamezne izbire. Trenutni standard C vsebuje dva zgleda rabe main() in dva main(void), standard C++ pa rabi main(). Vrednost, ki jo main vrača (in mora biti tipa int), služi kot status prekinitve. Tega program vrne gostiteljevemu okolju.

Standard C definira vrnitveni vrednosti 0 (»nič napak« (zero errors)) in EXIT_SUCCESS, ki označujeta uspeh, ter EXIT_FAILURE za označevanje neuspešnega zagona programa. (EXIT_SUCCESS in EXIT_FAILURE sta opredeljeni v standardni zaglavni datoteki stdlib.h). Druge vrnitvene vrednosti služijo kot izvedbeni opredelitveni pomeni. V Linuxu na primer program, ki ga je prekinil ukaz signal, vrne kodo številske vrednosti signala plus 128.

Minimalen pravilen program v C vsebuje prazno funkcijo main brez parametrov:

int main(void){}

Lahko se zapiše tudi v več vrsticah:

int main(void)
{          /* začetek telesa funkcije v prvem stolpcu vrstice */
}

ali redkeje sicer v skladu z dobrim slogom:

int         /* podatkovni tip vrnjene vrednosti funkcije */
main(void)  /* ime funkcije v prvem stolpcu vrstice */
{           /* začetek telesa funkcije v prvem stolpcu vrstice */
}

Sploh pa je slaba praksa pisati neporavnano, kot npr:

int
    main
        /*
            ** 
* *   * **/ (
        void
    )
{ }

ali:

    int
   main/*
 ** * *  * 
**/(void){ }

oziroma poravnano brez reda:

int    main    /*
**     *       *
***/   (       void
)      {       }

Preveden program bo sicer deloval, izvorna koda pa je že v preprostem zgledu nepregledna. Seveda je treba rezervirane besede, imena spremenljivk in funkcij pisati brez presledkov.

Okrogla oklepaja (), ki sledita imenu funkcije, morata biti vključena, saj na ta način C razlikuje funkcije od navadnih spremenljivk. Načeloma pri funkcijah za imenom funkcije in odprtim oklepajem ni presledka, npr. main(void) in ne main (void), z razliko od sizeof (), ki dejansko strogo ni funkcija, in je skladenjska rezervirana beseda za enočleni operator.[40] sizeof je lahko podobno kot return brez okroglih oklepajev. Pri return je to celo zaželeno, razen če je dvoumno.

Ker nista navedena return ali exit, funkcija main ob izhodu vrne 0.[41] To je poseben primer predstavljen v standardu C99, ki velja le za funkcijo main. Če se zahteva še ta navedba, ima minimalni program obliko:

int main(void) { return 0; }

Funkcija main bo za uspešno delovanje programa po navadi klicala druge funkcije. Ni treba, da je na vrhu programa, tako da se program v C ne začne v prvi vrstici, ampak tam kjer je navedena funkcija main.[38] Funkcije main ni možno klicati ali jo zagnati s kakšno drugo funkcijo v programu. Kliče jo lahko le operacijski sistem in na ta način se zažene program v C. Funkcija main ni nikoli statična, in, če je navedena kot static int main(), bo prevajalnik običajno javil napako.

Nekatere izvedbe niso izvedljive, po navadi zaradi tega, ker niso mišljene za rabo z operacijskim sistemom. Takšne izvedbe se v standardu C imenujejo prostostoječe (free-standing). V prostostoječi izvedbi ni podrobnega opisa kako naj obravnava zagon programa. V programu še posebej ni treba opredeliti funkcije main.

Druge funkcije se lahko imenujejo poljubno v skladu s skladnjo jezika. Lahko jih napiše programer sam ali pa se rabijo obstoječe iz knjižnic. Vmesniki za knjižniške funkcije so običajno navedeni z vključitvijo zaglavnih datotek s preprocesorsko direktivo #include, objekti knjižnice pa se povežejo v končno izvršno sliko. Določene knjižniške funkcije, kot sta na primer printf ali scanf, so definirane s standardom C, in se imenujejo standardne knjižniške funkcije.

Funkcija lahko vrne vrednost klicatelju - po navadi drugi funkciji C-ja, ali gostiteljevemu okolju za funkcijo main. Zgoraj omenjena funkcija printf vrne koliko znakov je bilo izpisano, vendar se ta vrednost običajno prezre.

Podatkovni tipi

C ima statični šibki sistem tipov, ki je deloma podoben potomcem ALGOLa, kot je npr. paskal, vendar C sam ni potomec Algola.[42] V C obstajajo vgrajeni tipi za cela števila različnih velikosti, tako predznačena in nepredznačena, števila s plavajočo vejico (npr. racionalna števila), znake in naštevne tipe (enum). C99 je z rezervirano besedo _Bool dodal Booleov podatkovni tip (Booleova spremenljivka). Obstajajo tudi izpeljani tipi, kot so: polja (tabele, arrays), kazalci, zapisi (struct) in nenaznačene unije (union).

C se velikokrat rabi v programiranju nizkonivojskih sistemov, kjer morda ni potrebe za sistemom tipov. Prevajalnik poskuša zagotoviti pravilnost tipov večine izrazov, vendar lahko programer zaobide preverbe na več načinov, ali s pomočjo opustitve tipov (type cast), kjer ekscplicitno pretvori vrednost iz enega tipa v drugega, ali s pomočjo kazalcev ali unij, kjer se osnovni biti podatkovnega objekta na novo tolmačijo na kakšen drug način.

Za nekatere je označitvena skladnja v C neintuitivna, še posebej kazalci na funkcije. (Richiejeva zamisel je bila, da se določilniki označijo v kontekstu njihove rabe: »označitev zrcali rabo.«)[26]

C-jevske običajne aritmetične pretvorbe dovoljujejo tvorjenje učinkovite kode, vendar lahko včasih pride do nepričakovanih rezultatov. Primerjava predznačenih in nepredznačenih celih števil enale širine na primer zahteva pretvorbo predznačene vrednosti v nepredznačeno. To lahko povzroči nepričakovane rezultate, če je predznačena vrednost negativna.

Osnovni tipi

V jeziku C je več osnovnih podatkovnih tipov. Večina od njih se tvori iz enega od štirih osnovnih aritmetičnih določilnikov tipov v C (char, int, float in double), ter štirih izbirnih določilnikov (signed, unsigned, short in long). Vsi razpoložljivi osnovni aritmetični tipi so navedeni v razpredelnici:

podatkovni tip
in sopomenke
pojasnilo mejne vrednosti
v limits.h
formatno določilo
char najmanjša naslovljiva enota stroja, ki lahko vsebuje osnovni nabor znakov. Njen tip je celoštevilski. Dejanski tip je lahko predznačen ali nepredznačen, kar je odvisno od izvedbe. Vsebuje CHAR_BIT bitov in je njegov obseg [−128, +127]. CHAR_MIN, CHAR_MAX %c
signed char enaka velikost kot char, vendar je zagotovo predznačena in je njegov obseg [−128, +127]. SCHAR_MIN, SCHAR_MAX %c (ali %hhi za numerični vnos)
unsigned char enaka velikost kot char, vendar je zagotovo nepredznačena. V dvojiškem zapisu je predstavljen brez zapolnjevalnih bitov, tako je njegov obseg točno [0, 2CHAR_BIT−1],[43] običajno [0, +255] UCHAR_MAX %c (ali %hhu za numerični vnos)
short
short int
signed short
signed short int
predznačeni celoštevilski tip short. Njegov obseg je vsaj [−32768, +32767],[44] in zato je njegova velikost vsaj 16 bitov. SHRT_MIN, SHRT_MAX %hi
unsigned short
unsigned short int
podobno kot short, vendar nepredznačeno, in je njegov obseg vsaj [0, +65535]. USHRT_MAX %hu
int
signed
signed int
osnovni predznačeni celoštevilski tip. Njegov obseg je vsaj [−32768, +32767],[44] in zato je njegova velikost vsaj 16 bitov. INT_MIN, INT_MAX %i ali %d
unsigned
unsigned int
podobno kot int, vendar nepredznačeno, in je njegov obseg vsaj [0, +65535]. UINT_MAX %u
long
long int
signed long
signed long int
predznačeni celoštevilski tip long. Njegov obseg je vsaj [−2147483648, +2147483647],[44] in zato je njegova velikost vsaj 32 bitov. LONG_MIN, LONG_MAX %li ali %ld
unsigned long
unsigned long int
podobno kot long, vendar nepredznačeno, in je njegov obseg vsaj [0, +4294967295]. ULONG_MAX %lu
long long
long long int
signed long long
signed long long int
predznačeni celoštevilski tip long long. Njegov obseg je vsaj [−9223372036854775808, +9223372036854775807],[44] in zato je njegova velikost vsaj 64 bitov. Uveden s standardom C99. LLONG_MIN, LLONG_MAX %lli ali %lld
unsigned long long
unsigned long long int
podobno kot long long, vendar nepredznačeno, in je njegov obseg vsaj [0, +18446744073709551615]. Uveden s standardom C99. ULLONG_MAX %llu
float tip za števila s plavajočo vejico in enojno točnostjo. Dejanske značilnosti niso navedene (razen spodnjih mej), vendar je na večini sistemov to dvojiški format števila s plavajočo vejico in enojno točnostjo IEEE 754. Ta format zahteva izbirni Annex F »IEC 60559 floating-point arithmetic.« FLT_MIN, FLT_MAX %f (samodejno razglašen na double v funkciji printf())
double tip za števila s plavajočo vejico in dvojno točnostjo. Dejanske značinosti niso navedene (razen spodnjih mej), vendar je na večini sistemov to dvojiški format števila s plavajočo vejico in dvojno točnostjo IEEE 754. Ta format zahteva izbirni Annex F »IEC 60559 floating-point arithmetic.« DBL_MIN, DBL_MAX %f (%lf za funkcijo scanf())
long double tip za števila s plavajočo vejico in razširjeno točnostjo. Dejanske značilnosti niso navedene. Z razliko od tipov float in double je lahko 80-bitni format s plavajočo vejico, »double-double«, ki ni v skladu z IEEE ali dvojiški format števila s plavajočo vejico in štirikratno točnostjo IEEE 754, če je format s povišano točnostjo zagotovljen, drugače je enako kot double. Za podrobnosti glej članek o long double. LDBL_MIN, LDBL_MAX %Lf

Dejanska velikost celoštevilskih tipov se v izvedbah razlikuje. Standar zahteva le velikostne povezave med podatkovnimi tipi in najmanšimi vrednostmi za vsak podatkovni tip:

Zahteve za povezave so, da long long ni manjši od long, ki ni manjši od int, ta pa ne manjši od short. Ker je velikost char vedno najmanjši podprti podatkovni tip, vsi drugi podatkovni tipi ne morejo biti manjši.

Najmanjša velikost za char je 8 bitov, najmanjši velikosti za short in int sta 16 bitov, za long 32 bitov in za long long mora vsebovati vsaj 64 bitov.

Tip int mora biti celoštevilski tip, za katerega je ciljni procesor najbolj učinkovit. To omogoča veliko prilagodljivost, saj so lahko na primer vsi tipi 64-bitni. Vendar je priljubljeno več različnih shem celoštevilskih širin (podatkovnih modelov). To je zato ker podatkovni model definira kako različni programi med seboj komunicirajo, enotni podatkovni model se rabi znotraj uporabniškega vmesnika danega operacijskega sistema.[45]

Treba je omeniti, da je v praksi velikost tipa char po navadi 8 bitov, tipa short pa 16 bitov (kakor tudi njihova nepredznačena dvojnika). To velja za platforme pogoste v 1990-ih, kot so: SunOS 4 Unix, Microsoft MS-DOS, sodobni Linux in Microchip MCC18 za vdelane 8-bitne mikrokontrolerje PIC. POSIX zahteva, da je velikost char točno 8 bitov.

Tudi dejanska velikost in obnašanje tipov s plavajočo vejico se razlikuje v izvedbah. Edino zagotovilo je, da long double ni manjši od double, ki ni manjši od float. Če ju strojna oprema podpira, se po navadi rabita 32-bitna in 64-bitna dvojiška formata s plavajočo vejico IEEE 754.

Kazalci

C podpira rabo kazalcev, vrsto reference, ki zapisuje naslov ali lego objekta ali funkcije v pomnilniku. Kazalci se lahko dereferencirajo za dostop podatkov, ki so shranjeni na naslovu na katere kažejo, ali kličejo funkcije na katere kažejo. S kazalci se lahko upravlja s pomočjo prirejanja ali kazalčne aritmetike. Predstavitev vrednosti kazalca pri zagonu je običajno surov pomnilniški naslov (mogoče povečan z izravnavo znotraj besedilnega polja), vendar ker kazalčni tip vsebuje tip objekta na katerega kaže, se lahko izrazi, ki vključujejo kazalce preverijo glede na tip že med prevajanjem. Kazalčna aritmetika se samodejno skalira z velikostjo podatkovnega tipa na katero se kaže. Kazalci se v C rabijo za več namenov. Z besedilnimi znakovnimi nizi se običajno upravlja s pomočjo kazalcev v polja znakov. Dinamičja dodelitev pomnilnika se izvaja s kazalci. Veliko podatkovnih tipov, kot so na primer drevesa, je velikokrat izvedeno kot dinamično dodeljeni objekti struct, ki so med seboj povezani s kazalci. Kazalci na funkcije so uporabni za prenašanje funkcij kot argumenti na funkcije višjega reda, kot na primer qsort ali bsearch), ali kot povratni klic (callback), ki ga izvedejo obdelovalniki dogodkov (event handlers).[41]

Vrednost ničelnega kazalca (null pointer value) eksplicitno kaže na nobeno veljavno mesto v pomnilniku. Dereferenciranje vrednosti ničelnega kazalca je nedoločeno, kar velikokrat povzroča segmentacijsko odpoved (segmentation fault). Vrednosti ničelnih kazalcev so uporabne pri nakazovanju posebnih primerov, kot so brez »naslednjega« kazalca v končnem vozlišču povezanega seznama, ali kot naznanitev napake iz funkcij, ki vračajo kazalce. V ustreznih kontekstih izvorne kode, ko je prirejanje kazalčne spremenljivke, se lahko konstanta ničelnega kazalca zapiše kot 0, z ali brez eksplicitne opustitve na tip kazalca, ali kot makro NULL, ki je opredeljen v več standardnih zaglavnih datotekah. V pogojnih zvezah imajo vrednosti ničelnih kazalcev vrednost napačno, vse druge vrednosti kazalcev pa vrednost pravilno.

Prazni kazalci (void *) kažejo na objekte nedoločenega tipa, in se lahko zaradi tega uporabijo kot »generični« podatkovni kazalci. Ker velikost in tip nakazanih objektov ni znana, se prazni kazalci ne morejo dereferencirati, in tudi kazalčna aritmetika nad njimi ni dovoljena, čeprav se lahko enostavno (in v mnogih zvezah so) pretvorjeni v in iz poljubnega tipa objektnega kazalca.[41]

Neprevidna raba kazalcev je potencialno nevarna. Ker so njihov tip ne preverja, lahko kazalčna spremenljivka kaže na poljubno mesto v pomnilniku, kar lahko povzroči nezaželene učinke. Čeprav pravilno rabljeni kazalci kažejo na varna mesta, lahko kažejo na nevarna mesta, če se zanje rabi nepravilna kazalčna aritmetika . Objekti na katera kažejo se lahko ponovno dodelijo in uporabijo (obviseli kazalci) – lahko se uporabijo brez, da bi se jim dodelila vrednost (divji kazalci), ali pa se jim neposredno lahko dodeli nevarno vrednost s pomočjo opustitve, unije ali prek drugega pokvarjenega kazalca. V splošnem C dopušča upravljanje in pretvarjanje med tipi kazalcev, čeprav običajno prevajalniki preskrbijo možnosti za različne nivoje preverjanja. Nekateri drugi programski jeziki te probleme rešujejo z bolj omejevalnimi tipi referenc.

Glej tudi

Opombe

  1. »Thompson je na kratko leta 1972 poskusil tvoriti sistem v zgodnji različici C-ja pred strukturami, vendar je prenehal.«[1]
  2. »Shema sestavljanja tipov, ki jih je privzel C, dolguje veliko jeziku Algol 68, čeprav se morda ni pojavil v obliki, ki bi jo potrdili privrženci Algola[1]
  3. Če se pozna programski jezik C, se pozna ukaz for. Ukaz for v jeziku Perl je skladenjsko enakovreden ukazu for v C-ju.
  4. Brez kazalcev bi C izgledal skoraj enako kot PHP.
  5. Izvedli so več poskusov, da bi bilo v C postopanje z znakovnimi nizi manj nagnjeno k napakam. Ena strategija je dodajanje varnejših in uporabnejših funkcij, kot sta strdup in strlcpy, in izogibanje nevarnim funkcijam, kot je npr. gets. Druga je dodajanje objektno usmerjene ovojnice okrog C-jevskih nizov, tako da so možna le varna klicanja.
  6. Z razliko od C-ja imata npr. Fortran in BASIC omejeni model, ki ne vsebuje kazalcev. V paskalu so kazalci dinamični objekti, sam jezik pa ne dovoljuje kazalčne aritmetike.[18]
  7. Standard ISO C (razdelek 5.1.2.2.1) zahteva veljavnost obeh oblik funkcije main, brez parametrov: int main() oziroma: int main(void), ali z dvema parametroma: int main(int argc, char *argv[]), kar je izjema le za to funkcijo.
  8. Če se navede funkcija main samo s prvim parametrom:
    int main(int argc) { /* ... */ }
    

    bo prevajalnik javil opozorilo, če pa se navede samo z drugim parametrom:

    int main(char *argv[]) { /* ... */ }
    

    bo javil napako, ker mora sicer funkcija main biti brez parametrov ali imeti strogo dva parametra, prvi parameter pa mora biti tipa int.

  9. V nekaterih operacijskih sistemih, še posebej v starejših različicah Unixa, ima lahko funkcija main tri parametre v obliki:
    int main(int argc, char *argv[], char *envp[]) { /* ... */ }
    

    kjer je tretji parameter kazalec na vektor predvsem imen spremenljivk okolja. Tretji parameter envp v funkciji main pa ni v skladu s standardom POSIX in se podatki o obstoječih spremenljivkah okolja pridobivajo z drugimi funkcijami, na primer getenv. Prevajalnik gcc za Linux na primer to možnost podpira.

Sklici

  1. 1,0 1,1 1,2 1,3 1,4 1,5 Ritchie (1993).
  2. 2,0 2,1 »Verilog HDL (and C)« (PDF). The Research School of Computer Science at the Australian National University. 3. junij 2010. Pridobljeno 19. avgusta 2013. 1980s: ; Verilog prvič predstavljen ; na Verilog je vplival programski jezik C
  3. Stewart (2000a).
  4. Giannini; Code Fighter, Inc.; Univerza Columbia (2004), str. 164.
  5. 5,0 5,1 Lawlis (1997).
  6. »Programming Language Popularity« (v angleščini). 2009. Pridobljeno 16. januarja 2009.
  7. »TIOBE Programming Community Index« (v angleščini). 2009. Pridobljeno 6. maja 2009.
  8. »More Control Structures« (v angleščini).
  9. »Hands-On Ethical Hacking and Network Defense« (v angleščini).
  10. »C Language Tutorial« (v angleščini).
  11. Stroustrup (1993).
  12. »Write Objective-C Code« (v angleščini). apple.com. 23. april 2013. Pridobljeno 22. decembra 2013.
  13. Dawkins (2006).
  14. Lee (2013).
  15. »How EiffelStudio Compiles«. docs.eiffel.com (v angleščini). Pridobljeno 2. februarja 2015.
  16. »Extending Python with C or C++«. docs.python.org (v angleščini). Pridobljeno 2. februarja 2015.
  17. 17,0 17,1 »WG14 N1570 Committee Draft — April 12, 2011« (PDF) (v angleščini). Pridobljeno 13. oktobra 2014.
  18. Johnson; Kernighan (1983), str. 52.
  19. 19,0 19,1 Stewart (2000b).
  20. Van der Linden (1994).
  21. Ritchie (1979).
  22. »History of C«. cppreference.com (v angleščini). 2014-08-19. Pridobljeno 2014-11-0. {{navedi splet}}: Preveri datumske vrednosti v: |accessdate= (pomoč)
  23. Stallings (2012), str. 91.
  24. »A Brief History of C« (v angleščini).
  25. Johnson; Ritchie (1978).
  26. 26,0 26,1 26,2 26,3 26,4 Kernighan; Ritchie (1988).
  27. Stroustrup (2002).
  28. »JTC1/SC22/WG14 – C«. Domača stran (v angleščini). ISO/IEC. Pridobljeno 2. junija 2011.
  29. Binstock (2011).
  30. »TR 18037: Embedded C« (PDF) (v angleščini). ISO / IEC. Pridobljeno 26. julija 2011.
  31. Harbison; Steele (2002).
  32. Kernighan; Ritchie (1978).
  33. Stran 3 izvirne K&R[32]
  34. 34,0 34,1 Kelley; Pohl (1984), str. 61.
  35. 35,0 35,1 »C Language Reference« (PDF). openwatcom.org (v angleščini). Pridobljeno 31. decembra 2010. {{navedi splet}}: Zunanja povezava v |work= (pomoč)
  36. »10 Common Programming Mistakes in C++« (v angleščini). Cs.ucr.edu. Pridobljeno 26. junija 2009.
  37. Schultz (2004), str. 20.
  38. 38,0 38,1 »The form of a C program«. The GNU C Programming Tutorial (v angleščini). Pridobljeno 10. oktobra 2014.
  39. »WG14 N1256 Committee Draft — September 7, 2007: 5.1.2.2.1 Program startup« (PDF) (v angleščini). Pridobljeno 13. oktobra 2014.
  40. Larson (1996b).
  41. 41,0 41,1 41,2 Klemens (2014).
  42. Feuer; Gehani (1982).
  43. ISO/IEC 9899:1999 specification, TC3 (PDF) (v angleščini). str. 37, § 6.2.6.1 Representations of types — General.
  44. 44,0 44,1 44,2 44,3 ISO/IEC 9899:1999 specification, TC3 (PDF). str. 22, § 5.2.4.2.1 Sizes of integer types <limits.h>.
  45. »64-Bit Programming Models: Why LP64?« (v angleščini). The Open Group. 1997. Pridobljeno 9. novembra 2011.

Viri

Zunanje povezave

Spletni prevajalniki

 
url
barvanje
skladnje
različni
urejevalniki
preverjanje
prevoda
zagon
kode
podprti
jeziki
izhod v zbirnem
jeziku
 
prevajalnik(i)
opombe
codepad.org Da Da Ne Da C, C++, ... Ne (angleško)
comeaucomputing.com C, C++ [mrtva povezava]
compilr.com [mrtva povezava]
delorie.com [mrtva povezava]
godbolt.org Da Ne Da Ne C, C++ Da gcc, clang (angleško)
ideone.com Da Ne Da Da C, C++ Ne gcc, clang (angleško)
melpon.org Da Da Da C, C++, C#, ... Ne gcc, clang (angleško)
rextester.com Da Da Da C, C++, C#, ... Ne gcc, clang, vs C (angleško)
stacked-crooked.com Da Ne Da Da C, C++ Ne gcc, g++ (angleško)