Programski jezik C: Razlika med redakcijama
m m+/dp |
m+/dp |
||
Vrstica 1: | Vrstica 1: | ||
{{ |
{{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" |
| 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)| |
* 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)| |
* [[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 |
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><<=</code>, <code>>>=</code> |
|||
* [[bitna operacija|bitna logika]]: <code>~</code>, <code>&</code>, <code>|</code>, <code>^</code> |
|||
* [[bitni pomik]]: <code><<</code>, <code>>></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, +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, +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, +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, +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, 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= |
| <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, 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, +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, +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, +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= |
* {{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 [[ |
* [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" |
|||
! <br />url |
|||
! barvanje<br />skladnje |
|||
! različni<br />urejevalniki |
|||
! preverjanje<br />prevoda |
|||
! zagon<br />kode |
|||
! podprti<br />jeziki |
|||
! izhod v zbirnem<br /> jeziku |
|||
! <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
![]() | |
Paradigma | imperativna (proceduralna), strukturalna |
---|---|
Začetna izdaja | 1972[a] |
Oblikoval | Dennis Ritchie |
Razvijalec | Dennis Ritchie & AT&T Bellovi laboratoriji (tvorci); ANSI X3J11 (ANSI C); ISO/IEC JTC1/SC22/WG14 (ISO C) |
Stabilna izdaja | C11 (2011-12-08) |
Tipizacija | statična, šibka, manifestna, imenska |
Večje implementacije | GCC, Clang, Intel C, MSVC, Pelles C, Watcom C/C++ |
Dialekti | Cyclone, Unified Parallel C, Split-C, Cilk, C* |
Vplivi | B (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] |
OS | mnogoplatformsko |
Običajna končnica datoteke | .c, .h, a.out |
Spletna stran | https://www.iso.org/standard/74528.html in https://www.open-std.org/jtc1/sc22/wg14/ |
![]() |
![](http://upload.wikimedia.org/wikipedia/commons/thumb/1/12/Gedit_hello_world.png/250px-Gedit_hello_world.png)
Prográmski jêzik C ali kar C (izgovorjava [cé] ali po izvirniku [sí], /ˈsiː/) 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
indo/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 primermesec[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]
- naštevni tipi (enumerated types) z rezervirano besedo
- 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
aliextern
, - 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
![](http://upload.wikimedia.org/wikipedia/commons/thumb/1/1b/Ken_Thompson_and_Dennis_Ritchie--1973.jpg/220px-Ken_Thompson_and_Dennis_Ritchie--1973.jpg)
![](http://upload.wikimedia.org/wikipedia/commons/thumb/5/52/Pdp7-oslo-2005.jpeg/220px-Pdp7-oslo-2005.jpeg)
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
![](http://upload.wikimedia.org/wikipedia/commons/thumb/0/0e/The_C_Programming_Language%2C_First_Edition_Cover.svg/171px-The_C_Programming_Language%2C_First_Edition_Cover.svg.png)
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 koti =- 10
(zmanjšaj i za vrednost 10) namesto možno predvidenegai = -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:
- funkcije
void
(funkcije, ki ne vračajo vrednosti) - funkcije, ki vračajo podatkovne tipe
struct
aliunion
(namesto kazalcev) - prireditev za podatkovne tipe
struct
- naštevni tipi (enumerated types)
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
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
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
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
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:
- 26 velikih in 26 majhnih angleških latiničnih črk iz standardnega nabora ASCII:
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
- podčrtaj:
_
- številske znake:
- 10 desetiških števk:
0
1
2
3
4
5
6
7
8
9
- 10 desetiških števk:
- 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:
|
|
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
C podpira bogat nabor operatorjev, ki so simboli znotraj izraza za določevanje potrebnih opravil med njegovim izvajanjem. C ima operatorje za:
- aritmetika:
+
,-
,*
,/
,%
- prireditev:
=
- povečana prireditev:
+=
,-=
,*=
,/=
,%=
,&=
,|=
,^=
,<<=
,>>=
- bitna logika:
~
,&
,|
,^
- bitni pomik:
<<
,>>
- Booleova logika:
!
,&&
,||
- pogojna določitev vrednosti:
? :
- primerjanje enakosti:
==
,!=
- klicanje funkcij:
( )
- povečanje in zmanjšanje:
++
,--
- izbira elementa:
.
,->
- velikost objekta:
sizeof
- relacije urejenosti:
<
,<=
,>
,>=
- referenca in dereferenca:
&
,*
,[ ]
- vrstni red:
,
- združevanje podizrazov:
( )
- pretvorba tipov:
(typename)
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
- ↑ »Thompson je na kratko leta 1972 poskusil tvoriti sistem v zgodnji različici C-ja pred strukturami, vendar je prenehal.«[1]
- ↑ »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]
- ↑ Če se pozna programski jezik C, se pozna ukaz for. Ukaz for v jeziku Perl je skladenjsko enakovreden ukazu for v C-ju.
- ↑ Brez kazalcev bi C izgledal skoraj enako kot PHP.
- ↑ 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
instrlcpy
, 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. - ↑ 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]
- ↑ 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. - ↑ Č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 tipaint
. - ↑ 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 primergetenv
. Prevajalnikgcc
za Linux na primer to možnost podpira.
Sklici
- ↑ 1,0 1,1 1,2 1,3 1,4 1,5 Ritchie (1993).
- ↑ 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
- ↑ Stewart (2000a).
- ↑ Giannini; Code Fighter, Inc.; Univerza Columbia (2004), str. 164.
- ↑ 5,0 5,1 Lawlis (1997).
- ↑ »Programming Language Popularity« (v angleščini). 2009. Pridobljeno 16. januarja 2009.
- ↑ »TIOBE Programming Community Index« (v angleščini). 2009. Pridobljeno 6. maja 2009.
- ↑ »More Control Structures« (v angleščini).
- ↑ »Hands-On Ethical Hacking and Network Defense« (v angleščini).
- ↑ »C Language Tutorial« (v angleščini).
- ↑ Stroustrup (1993).
- ↑ »Write Objective-C Code« (v angleščini). apple.com. 23. april 2013. Pridobljeno 22. decembra 2013.
- ↑ Dawkins (2006).
- ↑ Lee (2013).
- ↑ »How EiffelStudio Compiles«. docs.eiffel.com (v angleščini). Pridobljeno 2. februarja 2015.
- ↑ »Extending Python with C or C++«. docs.python.org (v angleščini). Pridobljeno 2. februarja 2015.
- ↑ 17,0 17,1 »WG14 N1570 Committee Draft — April 12, 2011« (PDF) (v angleščini). Pridobljeno 13. oktobra 2014.
- ↑ Johnson; Kernighan (1983), str. 52.
- ↑ 19,0 19,1 Stewart (2000b).
- ↑ Van der Linden (1994).
- ↑ Ritchie (1979).
- ↑ »History of C«. cppreference.com (v angleščini). 2014-08-19. Pridobljeno 2014-11-0.
{{navedi splet}}
: Preveri datumske vrednosti v:|accessdate=
(pomoč) - ↑ Stallings (2012), str. 91.
- ↑ »A Brief History of C« (v angleščini).
- ↑ Johnson; Ritchie (1978).
- ↑ 26,0 26,1 26,2 26,3 26,4 Kernighan; Ritchie (1988).
- ↑ Stroustrup (2002).
- ↑ »JTC1/SC22/WG14 – C«. Domača stran (v angleščini). ISO/IEC. Pridobljeno 2. junija 2011.
- ↑ Binstock (2011).
- ↑ »TR 18037: Embedded C« (PDF) (v angleščini). ISO / IEC. Pridobljeno 26. julija 2011.
- ↑ Harbison; Steele (2002).
- ↑ Kernighan; Ritchie (1978).
- ↑ Stran 3 izvirne K&R[32]
- ↑ 34,0 34,1 Kelley; Pohl (1984), str. 61.
- ↑ 35,0 35,1 »C Language Reference« (PDF). openwatcom.org (v angleščini). Pridobljeno 31. decembra 2010.
{{navedi splet}}
: Zunanja povezava v
(pomoč)|work=
- ↑ »10 Common Programming Mistakes in C++« (v angleščini). Cs.ucr.edu. Pridobljeno 26. junija 2009.
- ↑ Schultz (2004), str. 20.
- ↑ 38,0 38,1 »The form of a C program«. The GNU C Programming Tutorial (v angleščini). Pridobljeno 10. oktobra 2014.
- ↑ »WG14 N1256 Committee Draft — September 7, 2007: 5.1.2.2.1 Program startup« (PDF) (v angleščini). Pridobljeno 13. oktobra 2014.
- ↑ Larson (1996b).
- ↑ 41,0 41,1 41,2 Klemens (2014).
- ↑ Feuer; Gehani (1982).
- ↑ ISO/IEC 9899:1999 specification, TC3 (PDF) (v angleščini). str. 37, § 6.2.6.1 Representations of types — General.
- ↑ 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>
. - ↑ »64-Bit Programming Models: Why LP64?« (v angleščini). The Open Group. 1997. Pridobljeno 9. novembra 2011.
Viri
- Ashley, Michael (2004), »PHYS2020 - Computational Physics, based on the C programming language«, School of Physics, Univerza Novega Južnega Walesa (UNSW) (v angleščini), pridobljeno 8. oktobra 2014
{{citation}}
: Neveljaven|ref=harv
(pomoč) - Banahan, Mike; Brady, Declan; Doran, Mark (1991), The C Book (2. izd.), Addison-Wesley
{{citation}}
: Neveljaven|ref=harv
(pomoč) - Binstock, Andrew (12. oktober 2011), »Interview with Herb Sutter«, Dr. Dobb's (v angleščini), pridobljeno 7. septembra 2013
{{citation}}
: Neveljaven|ref=harv
(pomoč) - British Standard Institute, The C Standard, John Wiley & Sons, ISBN 0-470-84573-2 Uradni standard ISO (C99) v knjižni obliki.
- Dawkins, Kyle (1. januar 2006), Examining Objective-C (v angleščini), pridobljeno 13. oktobra 2014,
Objective-C je objektno usmerjena stroga supermnožica C
{{citation}}
: Neveljaven|ref=harv
(pomoč) - Feuer, Alan R. (1998), The C Puzzle Book (1. izd.), Addison-Wesley, ISBN 978-0-201-60461-0
{{citation}}
: Neveljaven|ref=harv
(pomoč) - Feuer, Alan R.; Gehani, Narain H. (1982-03), »Comparison of the Programming Languages C and Pascal«, ACM Computing Surveys, 14 (1): 73–92, doi:10.1145/356869.356872
{{citation}}
: Neveljaven|ref=harv
(pomoč); Preveri datumske vrednosti v:|date=
(pomoč); Prezrt neznani parameter|subscription=
(predlagano je|url-access=
) (pomoč) - Giannini, Mario; Code Fighter, Inc.; Univerza Columbia (2004). »C/C++«. V Hossein, Bidgoli (ur.). The Internet encyclopedia. Zv. 1. John Wiley and Sons. ISBN 0-471-22201-1. Pridobljeno 16. decembra 2012.
{{navedi enciklopedijo}}
: Neveljaven|ref=harv
(pomoč) - Harbison, Samuel P.; Steele, Guy Lewis (1994), C: A Reference Manual (5. izd.), Englewood Cliffs, New Jersey: Prentice Hall, COBISS 1868566, ISBN 0-13-326224-3
{{citation}}
: Neveljaven|ref=harv
(pomoč) - Harbison, Samuel P.; Steele, Guy Lewis (2002), C: A Reference Manual (5. izd.), Englewood Cliffs, New Jersey: Prentice Hall, COBISS 3299924, ISBN 0-13-089592-X
{{citation}}
: Neveljaven|ref=harv
(pomoč) Ta knjiga je odlična kot definitivni referenčni priročnik, ter za tiste, ki delajo na prevajalniku za C in procesorjih. Vsebuje skladnjo BNF za C. - Johnson, Stephen Curtis; Ritchie, Dennis M. (1978), »Portability of C Programs and the UNIX System« (PDF), Bell System Tech. J., 57 (6): 2021–2048, doi:10.1002/j.1538-7305.1978.tb02141.x, pridobljeno 16. decembra 2012
{{citation}}
: Neveljaven|ref=harv
(pomoč) - Johnson, Stephen Curtis; Kernighan, Brian Wilson (1983-08), »The C language and Models for Systems Programming«, Byte, 8 (8): 48–60
{{citation}}
: Neveljaven|ref=harv
(pomoč); Preveri datumske vrednosti v:|date=
(pomoč) - Jones, Derek M., The New C Standard: A Cultural and Economic Commentary (PDF), Addison-Wesley, ISBN 0-201-70917-1
{{citation}}
: Neveljaven|ref=harv
(pomoč) - Juvan, Martin; Zaveršnik, Matjaž (2000), Vaje iz programiranja: C, C++ in Mathematica, Ljubljana: Študentska založba, COBISS 109207552, ISBN 961-6356-29-1
{{citation}}
: Neveljaven|ref=harv
(pomoč) - Kelley, Al; Pohl, Ira (1984), A Book on C: Programming in C (4. izd.), Menlo Park, Kalifornija: Benjamin/Cummings Publishing Company, Inc., COBISS 871463, ISBN 0-201-18399-4
{{citation}}
: Neveljaven|ref=harv
(pomoč) - Kernighan, Brian Wilson; Ritchie, Dennis (1978), The C Programming Language (1. izd.), Prentice Hall, ISBN 0-13-110163-3
{{citation}}
: Neveljaven|ref=harv
(pomoč) Znana tudi kot K&R — izvirna knjiga o C-ju. Pred standardom ANSI C. - Kernighan, Brian Wilson; Ritchie, Dennis (1988), The C Programming Language (2. izd.), Prentice Hall, ISBN 0-13-110362-8
{{citation}}
: Neveljaven|ref=harv
(pomoč) ANSI C. - King, Kim N. (2008-04), C Programming: A Modern Approach (2. izd.), W. W. Norton & Company, COBISS 1940037, ISBN 978-0-393-97950-3
{{citation}}
: Neveljaven|ref=harv
(pomoč); Preveri datumske vrednosti v:|date=
(pomoč) - Klemens, Ben (2014), 21st Century C (2. izd.), O'Reilly Media, ISBN 1-4919-0389-9
{{citation}}
: Neveljaven|ref=harv
(pomoč) - Kochan, Stephen G. (2014), Programming in C, Upper Saddle River [etc.]: Addison-Wesley, COBISS 10745940, ISBN 0-321-77641-0
{{citation}}
: Neveljaven|ref=harv
(pomoč) - Koenig, Andrew (1989), C Traps and Pitfalls, Reading, Mass.: Addison-Wesley, COBISS 2987248, ISBN 0-201-17928-8, OCLC 18014955
{{citation}}
: Neveljaven|ref=harv
(pomoč) - Larson, Jim (1996a-09-13), High and Low-Level C (v angleščini), pridobljeno 2014-10-17
{{citation}}
: Neveljaven|ref=harv
(pomoč); Preveri datumske vrednosti v:|date=
(pomoč) - Larson, Jim (1996b-12-31), Standards and Style for Coding in ANSI C (v angleščini), pridobljeno 2014-10-29
{{citation}}
: Neveljaven|ref=harv
(pomoč); Preveri datumske vrednosti v:|date=
(pomoč) - Lawlis, Patricia K. (1997-08), »Guidelines for Choosing a Computer Language: Support for the Visionary Organization«, c.j. kemp systems, inc. (v angleščini), Ada Information Clearinghouse, pridobljeno 2006-07-18
{{citation}}
: Neveljaven|ref=harv
(pomoč); Preveri datumske vrednosti v:|date=
(pomoč) - Lazić, Ranko (1991), Programski jezik C kroz primere (2. izd.), Beograd: Tehnička knjiga, COBISS 2088972, ISBN 86-325-0285-9
{{citation}}
: Neveljaven|ref=harv
(pomoč) - Lee, Keith (2013), Pro Objective-C, Apres, ISBN 1-4302-5050-X
{{citation}}
: Neveljaven|ref=harv
(pomoč) - Marshall, A. Dave (1999), »Programming in C, UNIX System Calls and Subroutines using C«, Univerza v Cardiffu (v angleščini), pridobljeno 17. oktobra 2014
{{citation}}
: Neveljaven|ref=harv
(pomoč) - Oualline, Steve (1997), Practical C Programming (3. izd.), O'Reilly Media, COBISS 820587, ISBN 1-56592-306-5
{{citation}}
: Neveljaven|ref=harv
(pomoč) - Pike, Rob (1989), Notes on Programming in C (v angleščini), pridobljeno 17. oktobra 2014
{{citation}}
: Neveljaven|ref=harv
(pomoč) - Plauger, Phillip James; Brodie, Jim (1989), Standard C, Microsoft, COBISS 1958951, ISBN 1-55615-158-6
{{citation}}
: Neveljaven|ref=harv
(pomoč) - Plauger, Phillip James (1991), The Standard C Library, Prentice Hall, COBISS 365693, ISBN 0-13-838012-0
{{citation}}
: Neveljaven|ref=harv
(pomoč) - Ritchie, Dennis (1974), »C Reference Manual« (PDF), Bellovi laboratoriji
{{citation}}
: Neveljaven|ref=harv
(pomoč) - Ritchie, Dennis (1979). The Evolution of the Unix Time-sharing System. Language Design and Programming Methodology conference.
{{navedi conference}}
: Neveljaven|ref=harv
(pomoč) - Ritchie, Dennis (1993-03), »The Development of the C Language«, The second ACM SIGPLAN History of Programming Languages Conference (HOPL-II), ACM, 28 (3): 201–208, doi:10.1145/154766.155580, ISBN 0-89791-570-4
{{citation}}
: Neveljaven|ref=harv
(pomoč); Preveri datumske vrednosti v:|date=
(pomoč) - Sawtell, Chris (1994), C Lesson (v angleščini), pridobljeno 17. oktobra 2014
{{citation}}
: Neveljaven|ref=harv
(pomoč) - Scheffler, Thomas (2013), How to Think Like a Computer Scientist - 'C-Version'
{{citation}}
: Neveljaven|ref=harv
(pomoč) Predelava knjige Downey, Allen B., How to Think Like a Computer Scientist - C++-Version - Schildt, Herbert (1987), Artificial intelligence using C, Berkeley: Osborne/McGraw-Hill, COBISS 773, ISBN 0-07-881255-0
{{citation}}
: Neveljaven|ref=harv
(pomoč) - Schildt, Herbert (1988), Advanced C (2. izd.), Berkeley: Osborne/McGraw-Hill, COBISS 17012736, ISBN 0-07-881348-4
{{citation}}
: Neveljaven|ref=harv
(pomoč) - Schildt, Herbert (2000), C : The Complete Reference (4. izd.), Berkeley: Osborne/McGraw-Hill, COBISS 25067781, ISBN 0-07-212124-6
{{citation}}
: Neveljaven|ref=harv
(pomoč) - Schultz, Thomas W. (2004), C and the 8051 (3. izd.), Otsego, MI: PageFree Publishing Inc., ISBN 1-58961-237-X, pridobljeno 10. februarja 2012
{{citation}}
: Neveljaven|ref=harv
(pomoč) - Sedgewick, Robert (2009), Algorithms in C, Addison-Wesley, COBISS 23760935, ISBN 0-201-31452-5
{{citation}}
: Neveljaven|ref=harv
(pomoč) (deli 1-4) - Sedgewick, Robert (2009), Algorithms in C, Addison-Wesley, COBISS 23760679, ISBN 0-201-31663-3
{{citation}}
: Neveljaven|ref=harv
(pomoč) (del 5) - Stallings, William (2012), Operating Systems: Internals and Design Principles (7. izd.), Pearson Education, Inc., COBISS 15525910, ISBN 0-273-75150-6
{{citation}}
: Neveljaven|ref=harv
(pomoč) - Stewart, William (2000a-01-07), »History of the C Programming Language«, Living Internet (v angleščini), pridobljeno 2006-10-31
{{citation}}
: Neveljaven|ref=harv
(pomoč); Preveri datumske vrednosti v:|date=
(pomoč) - Stewart, William (2000b-01-07), »Unix History«, Living Internet (v angleščini), pridobljeno 2015-09-21
{{citation}}
: Neveljaven|ref=harv
(pomoč); Preveri datumske vrednosti v:|date=
(pomoč) - Stöcker, Horst (2006), Matematični priročnik z osnovami računalništva, Ljubljana: Tehniška založba Slovenije, COBISS 229576192, ISBN 86-365-0587-9
{{citation}}
: Neveljaven|ref=harv
(pomoč) - Stroustrup, Bjarne (1993), A History of C++: 1979−1991 (PDF) (v angleščini), pridobljeno 9. junija 2011
{{citation}}
: Neveljaven|ref=harv
(pomoč) - Stroustrup, Bjarne (2002). Sibling rivalry: C and C++ (PDF) (poročilo). AT&T Labs.
{{navedi report}}
: Neveljaven|ref=harv
(pomoč) - Summit, Steve (1995), »C Programming Notes«, Univerza Washingtona (v angleščini), pridobljeno 17. oktobra 2014
{{citation}}
: Neveljaven|ref=harv
(pomoč) - Summit, Steve (1995), C Programming FAQs: Frequently Asked Questions, Addison-Wesley, COBISS 38837505, ISBN 0-201-84519-9
{{citation}}
: Neveljaven|ref=harv
(pomoč) - Thompson, Kenneth, A New C Compiler (PDF), Murray Hill, New Jersey: AT&T Bellovi laboratoriji
{{citation}}
: Neveljaven|ref=harv
(pomoč) - Van der Linden, Peter (1994), Expert C Programming: Deep C Secrets, Prentice Hall Professional, COBISS 7454041, ISBN 0-13-177429-8
{{citation}}
: Neveljaven|ref=harv
(pomoč) - Vujičić, Vladan (1990), Uvod u C jezik (3. izd.), Vinča: Institut za nuklearne nauke" Boris Kidrič", COBISS 1652748, ISBN 86-80055-04-2
{{citation}}
: Neveljaven|ref=harv
(pomoč) - Životić, Zoran (1990), »Moja škola C-a«, Računari, Mala PC biblioteka (65)
{{citation}}
: Neveljaven|ref=harv
(pomoč)
Zunanje povezave
- Stran o programskem jeziku C na eŠtudentu [mrtva povezava]
- http://www.educa.fmf.uni-lj.si/izodel/sola/2001/di/Rupar/izobrazevanje/tutorc/index.html
- Burden, Peter, Programming in C (angleško)
- C na Dictionary of Programming Languages (angleško)
- Programming in C (zbirka dokumentov na Lysator) (angleško)
- Spletišče wiki IRC-kanala ##C na Freenode (angleško)
- Category/Library/C na FSF (angleško)
- ISO/IEC JTC1/SC22/WG14 - C (angleško)
- Free Online C / C++ Tutorials and Documentation (angleško)
- C reference na cppreference.com (angleško)
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 | 3× | Da | Da | C, C++, C#, ... | Ne | gcc, clang | (angleško) |
rextester.com | Da | 3× | 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) |