Inafasiriwa moja kwa moja kutoka kwa Wikipedia ya Kiingereza na Tafsiri ya Google

C (lugha ya programu)

C ( / s / , kama katika barua c ) ni lugha ya jumla ya programu , muhimu ya programu ya programu , kuunga mkono mipangilio ya muundo , upeo wa kutofautiana na upinduzi , wakati mfumo wa aina ya static huzuia shughuli nyingi zisizotarajiwa. Kwa kubuni, C hutoa mipangilio ya ramani kwa ufanisi kwa maelekezo ya mashine ya kawaida, na kwa hiyo imepata matumizi ya kudumu katika programu ambazo zilikuwa zimehifadhiwa katika lugha ya kanisa , ikiwa ni pamoja na mifumo ya uendeshaji , pamoja na programu mbalimbali za programu za kompyuta kutoka kwa wajumbe wa juu kwenye mifumo iliyoingia .

C
Nakala katika barua nyeupe za kijani serif juu ya background nyeupe na kubwa sana mwanga bluu sans-serif barua C.
Lugha ya C Programming [1] (mara nyingi hujulikana kama "K & R"), kitabu cha seminal C
Paradigm Imperative ( utaratibu ), imefungwa
Iliyoundwa na Dennis Ritchie
Msanidi programu Dennis Ritchie & Bell Labs (waumbaji); ANSI X3J11 ( ANSI C ); ISO / IEC JTC1 / SC22 / WG14 (ISO C)
Kwanza ilionekana 1972 ; Miaka 45 iliyopita ( 1972 ) [2]
Kuwezeshwa imara
C11 / Desemba 2011 ; Miaka 5 iliyopita ( 2011-12 )
Kuandika nidhamu Imara , dhaifu , inayoonekana , imejulikana
OS Msalaba wa msalaba
Upanuzi wa faili .c , .h
Utekelezaji mkubwa
K & R, GCC , Clang , Intel C , Microsoft Visual C ++ , Pelles C , Watcom C
Inaondoa
Kimbunga , C Unifanana C , Split-C , Cilk , C *
Inasababishwa na
B ( BCPL , CPL ), ALGOL 68 , [3] Bunge , PL / I , FORTRAN
Imeathiriwa
Wengi : AMPL , AWK , Csh , C ++ , C - , C # , Lengo-C , BitC , D , Go , Java , JavaScript , Julia , Limbo , LPC , Perl , PHP , Pike , Processing , Python , Rust , Mbegu7 , Vala , Verilog (HDL) [4]

C awali ilianzishwa na Dennis Ritchie kati ya 1969 na 1973 katika Bell Labs , [5] na kutumika tena kutekeleza mfumo wa uendeshaji wa Unix . [6] Imekuwa ni mojawapo ya lugha za programu za kutumia sana wakati wote, [7] [8] na washirika wa C kutoka kwa wauzaji mbalimbali wanaopatikana kwa wengi wa usanifu wa kompyuta na mifumo ya uendeshaji. C imesimamiwa na Taasisi ya Taifa ya Viwango vya Marekani (ANSI) tangu 1989 (angalia ANSI C ) na hatimaye na Shirika la Kimataifa la Kudhibiti (ISO).

C ni lugha muhimu ya kiutaratibu . Iliundwa ili kuandaliwa kwa kutumia compiler ya moja kwa moja, kutoa usafi wa kiwango cha chini kwenye kumbukumbu, ili kutoa lugha inayojenga ramani kwa ufanisi kwa maelekezo ya mashine, na kuhitaji usaidizi mdogo wa wakati wa kukimbia . Licha ya uwezo wake wa kiwango cha chini, lugha iliundwa ili kuhamasisha programu ya msalaba-jukwaa . Viwango sera na portably imeandikwa C mpango inaweza ulioandaliwa kwa aina nyingi sana za majukwaa ya kompyuta na mifumo ya uendeshaji na mabadiliko chache chanzo kanuni zake. Lugha imekuwa inapatikana kwenye mipangilio mingi sana ya majukwaa, kutoka kwa wasimamizi wadogo wa ndani walioingia kwa wajumbe wa supercomputers .

Yaliyomo

Maelezo ya jumla

Kama lugha nyingi zinazofaa katika jadi za ALGOL , C ina vifaa vya programu iliyopangwa na inaruhusu upeo wa kutofautiana na upinduzi, wakati mfumo wa aina ya static huzuia shughuli nyingi zisizotarajiwa. Katika C, kanuni zote zinazoweza kutekelezwa zinazomo ndani ya miradi, ambayo huitwa "kazi" (ingawa si kwa maana kali ya programu za kazi ). Vigezo vya kazi mara zote hupitishwa na thamani. Pass-by-reference ni sawa katika C kwa kufafanua thamani ya pointer . Nakala ya chanzo cha chanzo ni fomu ya bure , kwa kutumia semicoloni kama kituo cha kusitisha taarifa na braces curly kwa vitengo vya kikundi vya vitambulisho .

Lugha C pia inaonyesha sifa zifuatazo:

  • Kuna idadi ndogo, ya kudumu ya maneno, ikiwa ni pamoja na seti kamili ya mtiririko wa primitives kudhibiti : for , if/else , while , switch , na do/while . Majina yaliyofafanuliwa na mtumiaji haijulikani na maneno muhimu kwa aina yoyote ya sigil .
  • Kuna idadi kubwa ya waendeshaji wa hesabu na mantiki, kama vile + , += , ++ , & , ~ , nk.
  • Zaidi ya kazi inaweza kuwa walifanya katika taarifa moja.
  • Maadili ya kurudi ya kazi yanaweza kupuuzwa wakati hauhitajiki.
  • Kuchapa ni static , lakini imesimamiwa dhaifu : data zote zina aina, lakini mabadiliko ya wazi yanaweza kufanywa.
  • Syntax ya tamko inajaribu muktadha wa matumizi. C haina neno muhimu "kufafanua"; badala, taarifa inayotoka kwa jina la aina inachukuliwa kama tamko. Hakuna neno muhimu la "kazi"; badala, kazi inaonyeshwa kwa mahusiano ya orodha ya hoja.
  • Mtumiaji-defined ( typedef ) na aina kiwanja ni iwezekanavyo.
    • Aina zisizo za jumla za data ( struct ) zinawezesha vipengele vya data vinavyohusiana na kupatikana na kupewa kama kitengo.
    • Array kuwekwa ni nukuu ya sekondari, inavyoelezwa katika suala la pointer arithmetic. Tofauti na miundo, vituo sio vitu vya kwanza; hawawezi kupewa au kulinganishwa kwa kutumia watumiaji wa kujengwa moja. Hakuna "neno" la msingi, kwa matumizi au ufafanuzi; Badala yake, mabano ya mraba yanaonyesha vipande syntactically, kwa mfano month[11] .
    • Aina enum neno muhimu la enum . Hawatambulishwa, na ni kwa uhuru interconvertible na integers.
    • Strings si data tofauti aina, lakini ni conventionally kutekelezwa kama null-terminated arrays ya wahusika.
  • Upatikanaji wa ngazi ya chini ya kumbukumbu ya kompyuta inawezekana kwa kugeuza anwani za mashine kwa safu zilizowekwa .
  • Utaratibu (subroutines si kurudi maadili) ni kesi maalum ya kazi, na untyped aina ya kurudi void .
  • Kazi haiwezi kuelezwa ndani ya upeo wa kazi ya kazi nyingine.
  • Kazi na data kuyatumia kibali dharula kukimbia wakati polymorphism .
  • Kabla ya processor hufanya jumla ufafanuzi, chanzo kanuni faili kuingizwa, na masharti mkusanyiko .
  • Kuna aina ya msingi ya utaratibu : faili zinaweza kuundwa tofauti na kuunganishwa pamoja, na kudhibiti juu ya kazi gani na vitu vya data vinavyoonekana kwa faili zingine kupitia sifa za static na za extern .
  • Kazi tata kama vile I / O , uendeshaji wa kamba , na kazi za hisabati huwekwa mara kwa mara kwenye utaratibu wa maktaba .

Ingawa C haijumuishi vipengele vingine vilivyopatikana katika lugha zingine, kama vile mwelekeo wa kitu au ukusanyaji wa takataka , vipengele vile vinaweza kutekelezwa au kusambazwa katika C, mara kwa mara kwa njia ya maktaba ya nje (kwa mfano, mkusanyaji wa taka ya Boehm au mfumo wa GLib Object ) .

Uhusiano na lugha zingine

Lugha nyingi baadaye alikopa moja kwa moja au pasipo moja kwa moja kutoka kwa C, ikiwa ni pamoja na C ++ , D , Go , Kutu , Java , JavaScript , Limbo , LPC , C # , Lengo-C , Perl , PHP , Python , Swift , Verilog (vifaa maelezo lugha), [ 4] na shell ya Unix ya C. Lugha hizi kuwa inayotolewa wengi wao miundo kudhibiti na makala mengine ya msingi kutoka C. Wengi wao (na Python kuwa ubaguzi makubwa zaidi) pia ni sana syntactically sawa na C kwa ujumla, na wao huwa na kuchanganya kumtambua kujieleza na taarifa ya sentensi za C na mifumo ya aina ya msingi, mifano ya data, na semanti ambayo inaweza kuwa tofauti sana.

Historia

Maendeleo ya mapema

Ken Thompson (kushoto) na Dennis Ritchie (haki, mwanzilishi wa lugha C ya programu)

Asili ya C imefungwa karibu na maendeleo ya mfumo wa uendeshaji wa Unix , uliyotekelezwa awali katika lugha ya kanisa kwenye PDP-7 na Dennis Ritchie na Ken Thompson, kuingiza mawazo kadhaa kutoka kwa wenzake. Hatimaye, waliamua kuendesha mfumo wa uendeshaji kwa PDP-11 . Toleo la awali la PDP-11 la Unix ilitengenezwa katika lugha ya kanisa. Waendelezaji walikuwa wakizingatia upya mfumo huo kwa kutumia lugha ya B , tafsiri ya BCPL iliyo rahisi . [9] Hata hivyo B Ukosefu wa kuchukua faida ya baadhi ya vipengele PDP-11 wa, hasa Byte addressability ulisababisha C. jina la C alichaguliwa tu kama ya baada B. [10]

Uendelezaji wa C ulianza mwaka wa 1972 kwenye mfumo wa Unix PDP-11 [11] na kwanza ulionekana katika Version 2 Unix . [12] Lugha haikuanzishwa kwa uwazi, lakini hivi karibuni ilifanyika kwenye majukwaa tofauti pia: compiler ya Honeywell 6000 iliandikwa mwaka wa kwanza wa historia ya C, wakati bandari ya IBM System / 370 ifuatiwa hivi karibuni. [1] [11]

Pia mwaka wa 1972, sehemu kubwa ya Unix iliandikwa tena katika C. [13] By 1973, pamoja na kuongezea aina za struct , lugha ya C ilikuwa imetosha sana kwamba wengi wa kernel Unix ilikuwa sasa katika C.

Unix ilikuwa moja ya kernels mfumo wa uendeshaji wa kwanza kutekelezwa katika lugha nyingine isipokuwa kusanyiko . Matukio ya awali ni pamoja na mfumo wa Multics ambao uliandikwa katika PL / I ), na Mpango wa Kudhibiti Mwalimu (MCP) kwa Burroughs B5000 iliyoandikwa ALGOL mwaka wa 1961. Katika mwaka wa 1977, Ritchie na Stephen C. Johnson walifanya mabadiliko zaidi kwa lugha ili kuwezesha portability ya mfumo wa uendeshaji wa Unix. Johnson's Portable C Compiler aliwahi kuwa msingi wa utekelezaji kadhaa wa C kwenye majukwaa mapya. [11]

K & R C

Kifuniko cha kitabu, lugha ya C Programming , toleo la kwanza na Brian Kernighan na Dennis Ritchie

Mwaka wa 1978, Brian Kernighan na Dennis Ritchie walichapisha toleo la kwanza la Lugha ya C Programming . [1] Kitabu hiki, anayejulikana katika C programmers kama "K & R", aliwahi kwa miaka mingi kama rasmi vipimo ya lugha. Toleo la C ambalo linaelezea linajulikana kama K & R C. Toleo la pili la kitabu [14] linahusu kiwango cha baadaye cha ANSI C , kilichoelezwa hapo chini.

K & R ilianzisha vipengele vya lugha kadhaa:

  • Maktaba ya I / O ya kawaida
  • Aina ya data ya long int
  • aina ya data ya unsigned int
  • Wafanyakazi wa kazi ya fomu = op (kama vile =- ) walibadilishwa kuwa fomu op = (yaani, -= ) ili kuondoa uelewa wa semantic uliojengwa na ujenzi kama vile i=-10 , ambayo ilibadilishwa kama i =- 10 (mapunguzo i kwa 10) badala ya labda lengo i = -10 (basi i kuwa -10).

Hata baada ya kuchapishwa kwa kiwango cha ANSI cha 1989, kwa miaka mingi K & R C bado ilikuwa inachukuliwa kuwa " dini ya kawaida zaidi " ambayo C programmers ilizuia wenyewe wakati upeo mkubwa ulipendekezwa, kwa kuwa washiriki wengi wa zamani walikuwa bado wanatumiwa, na kwa sababu K & R iliyoandikwa kwa uangalifu Msimbo wa C inaweza kuwa wa kawaida wa Standard C pia.

Katika matoleo mapema ya C, kazi tu ambazo kurudi aina nyingine isipokuwa int zinapaswa kutangazwa ikiwa zinatumiwa kabla ya ufafanuzi wa kazi; kazi kutumika bila tamko la awali walikuwa kudhani kurudi aina int .

Kwa mfano:

muda some_function ();
/ * int * / nyingine_function ();

/ * int * / call_function ()
{
    mtihani wa muda mrefu1 ;
    rejesha / * int * / test2 ;

    Jaribio la 1 = some_function ();
    ikiwa ( mtihani1 > 0 )
          mtihani2 = 0 ;
    mwingine
          test2 = nyingine_function ();
    kurudi mtihani2 ;
}

int aina ambazo hufafanuliwa zinaweza kufutwa kwenye K & R C, lakini huhitajika katika viwango vya baadaye.

Kwa kuwa utangazaji wa kazi ya K & R haukujumuisha taarifa yoyote kuhusu hoja za kazi, ufuatiliaji wa aina ya parameter haukufanyika, ingawa washirika wengine watawasilisha ujumbe wa onyo ikiwa kazi ya ndani iliitwa na nambari mbaya ya hoja, au ikiwa wito nyingi kwenye kazi ya nje kutumika idadi tofauti au aina ya hoja. Vifaa tofauti kama vile huduma ya kitambaa cha Unix zilianzishwa kuwa (kati ya vitu vingine) inaweza kuangalia uwiano wa matumizi ya kazi kwenye mafaili mengi ya chanzo.

Katika miaka ifuatayo kuchapishwa kwa K & R C, vipengele kadhaa viliongezwa kwa lugha, na kuungwa mkono na washirika kutoka AT & T (hasa PCC [15] ) na wauzaji wengine. Hizi ni pamoja na:

  • kazi void (yaani, kazi isiyo na thamani ya kurudi)
  • kazi zinazorejesha aina ya struct au union (badala ya kufuta)
  • kazi kwa aina ya data ya struct
  • aina zilizohesabiwa

Idadi kubwa ya upanuzi na ukosefu wa makubaliano kwenye maktaba ya kawaida , pamoja na umaarufu wa lugha na ukweli kwamba hata hata wanachama wa Unix kutekeleza kikamilifu vipimo vya K & R, wakiongozwa na umuhimu wa usawa.

ANSI C na ISO C

Katika mwishoni mwa miaka ya 1970 na 1980, matoleo ya C yalitekelezwa kwa ajili ya kompyuta mbalimbali za kompyuta , minicomputers , na microcomputers , ikiwa ni pamoja na IBM PC , kama umaarufu wake ulianza kuongezeka kwa kiasi kikubwa.

Mwaka wa 1983, Taasisi ya Taifa ya Viwango vya Marekani (ANSI) iliunda kamati, X3J11, kuanzisha vipimo vya C. X3J11 kulingana na kiwango cha C juu ya utekelezaji wa Unix; hata hivyo, sehemu isiyo ya kuambukizwa ya maktaba ya Unix C ilipeleka kwa kundi la kazi la IEEE 1003 kuwa msingi wa kiwango cha 1988 cha POSIX . Mnamo 1989, kiwango cha C kilikubaliwa kama ANSI X3.159-1989 "Programming Language C". Toleo hili la lugha hujulikana kama ANSI C , Standard C, au wakati mwingine C89.

Mnamo mwaka wa 1990, kiwango cha ANSI C (na mabadiliko ya muundo) kilipitishwa na Shirika la Kimataifa la Kudhibiti (ISO) kama ISO / IEC 9899: 1990, ambayo wakati mwingine huitwa C90. Kwa hiyo, maneno "C89" na "C90" yanataja lugha sawa ya programu.

ANSI, kama miili mingine ya viwango vya taifa, haiendelei kiwango cha C kwa kujitegemea, lakini inaruhusu kiwango cha kimataifa cha C, kinachosimamiwa na kikundi cha kazi ISO / IEC JTC1 / SC22 / WG14. Kupitishwa kwa hali ya kimataifa kwa kiwango cha kimataifa kawaida hutokea ndani ya mwaka wa ISO kuchapishwa.

Moja ya malengo ya mchakato wa kusimamisha C ilikuwa kuzalisha kifaa cha juu cha K & R C, kuingizwa na vipengele vingi vilivyotanguliwa. Kamati ya viwango pia ilijumuisha vipengele kadhaa vya ziada kama vile prototypes kazi (zilizokopwa kutoka kwa C ++), maelezo ya void , msaada wa seti za tabia za kimataifa na maeneo ya ndani , na nyongeza za preprocessor. Ijapokuwa syntax ya matangazo ya parameter iliongezeka kwa kuingiza mtindo uliotumika kwenye C ++, interface ya K & R iliendelea kuruhusiwa, kwa utangamano na msimbo wa chanzo uliopo.

C89 inasaidiwa na washirika wa sasa wa C, na msimbo wa C zaidi ulioandikwa leo unategemea. Mpango wowote ulioandikwa tu katika Standard C na bila mawazo yoyote ya tegemezi ya vifaa itaendeshwa kwa usahihi kwenye jukwaa lolote na utekelezaji wa kufanana na C, ndani ya mipaka ya rasilimali zake. Bila ya tahadhari hizo, mipango inaweza kukusanya tu kwenye jukwaa fulani au kwa compiler fulani, kwa mfano, kwa matumizi ya maktaba yasiyo ya kawaida, kama maktaba ya GUI , au kwa kutegemeana na sifa za kondomu au za jukwaa kama vile kama ukubwa halisi wa aina za data na endiness ya byte.

Katika hali ambazo kificho inapaswa kuwa inapatikana kwa viwango vya kawaida au __STDC__ K & R C, __STDC__ yanaweza kutumiwa kugawanya msimbo katika sehemu za Standard na K & R ili kuzuia matumizi kwenye kifaa cha K & R C-msingi kilichopatikana tu katika Standard C.

Baada ya mchakato wa muundo wa ANSI / ISO, maelezo ya lugha ya C yalibakia kuwa imara kwa miaka kadhaa. Mwaka 1995, Marekebisho ya kawaida ya 1 hadi kiwango cha 1990 C (ISO / IEC 9899 / AMD1: 1995, inayojulikana rasmi kama C95) ilichapishwa, ili kurekebisha maelezo fulani na kuongeza msaada zaidi kwa seti za tabia za kimataifa. [ citation inahitajika ]

C99

Kiwango cha C kilirekebishwa zaidi mwishoni mwa miaka ya 1990, na kusababisha uandishi wa ISO / IEC 9899: 1999 mwaka 1999, ambao hujulikana kama " C99 ". Imekuwa imefanywa marekebisho mara tatu na Ufundi Corrigenda. [16]

C99 ilianzisha vipengele kadhaa vipya, ikiwa ni pamoja na kazi za ndani , aina kadhaa za data (ikiwa ni pamoja na long long int na aina complex ya kuwakilisha namba tata ), safu-urefu urefu na wanachama safu rahisi , msaada bora kwa uhakika IEEE 754 , msaada kwa macros mbalimbali (macros ya usawa wa kutofautiana), na usaidizi wa maoni ya mstari mmoja mwanzo na // , kama katika BCPL au C ++. Mengi haya yalikuwa tayari kutekelezwa kama upanuzi katika washiriki kadhaa wa C.

C99 ni sehemu ya nyuma inayoambatana na C90, lakini ni kali kwa njia zingine; hasa, tamko lisilo na specifier ya aina tena int kikamilifu. __STDC_VERSION__ kiwango kikubwa inaelezwa kwa thamani ya 199901L ili kuonyesha kwamba msaada wa C99 unapatikana. GCC , Solaris Studio , na washirika wengine wa C sasa wanaunga mkono vitu vingi au vipengele vyote vya C99. C compiler katika Microsoft Visual C ++ , hata hivyo, hutumia kiwango cha C89 na sehemu hizo za C99 zinazohitajika kwa utangamano na C ++ 11 . [17]

C11

Mnamo 2007, kazi ilianza kwenye marekebisho mengine ya kiwango cha C, kinachojulikana kiitwacho "C1X" mpaka kuchapishwa rasmi rasmi mwaka 2011-12-08. Kamati ya viwango vya C ilipitisha miongozo ya kupunguza kupitishwa kwa vipengele vipya ambavyo hazijajaribiwa na utekelezaji uliopo.

Kiwango cha C11 kinaongeza sifa mpya kwa C na maktaba, ikiwa ni pamoja na macros aina ya generic, miundo isiyojulikana, kuboresha usaidizi wa Unicode, shughuli za atomiki, kazi nyingi za kufuta, na mipaka iliyotibiwa. Pia hufanya baadhi ya sehemu za maktaba zilizopo C99 hiari, na inaboresha utangamano na C + +. Kiwango cha kawaida __STDC_VERSION__ kinafafanuliwa kama 201112L ili kuonyesha kuwa msaada wa C11 unapatikana.

Imefungwa C

Kwa kihistoria, programu iliyoingizwa C inahitaji upanuzi usio na kipimo kwenye lugha ya C ili kuunga mkono vipengele vya kigeni kama hesabu ya uhakika, mabenki mbalimbali ya kumbukumbu, na shughuli za msingi za I / O.

Mnamo mwaka 2008, Kamati ya Viwango vya C ilichapisha ripoti ya kiufundi kupanua lugha C [18] kushughulikia masuala haya kwa kutoa kiwango cha kawaida kwa utekelezaji wote wa kuzingatia. Inajumuisha idadi ya vipengee ambavyo hazipatikani kwenye kawaida ya C, kama vile hesabu ya uhakika ya uhakika , nafasi za anwani zilizoitwa, na anwani ya msingi ya vifaa vya I / O.

Syntax

C ina sarufi rasmi iliyowekwa na kiwango cha C. [19] Mwisho wa mstari sio muhimu kwa C; hata hivyo, mipaka ya mstari ina umuhimu wakati wa awamu ya awali. Maoni yanaweza kuonekana ama kati ya watangazaji /* na */ , au (tangu C99) zifuatazo // mpaka mwisho wa mstari. Maoni yaliyotolewa na /* na */ sio kiota, na utaratibu huu wa wahusika haukutafsiriwa kama watangazaji wa maoni ikiwa huonekana ndani ya kamba au tabia halisi. [20]

F files chanzo vyenye utangazaji na kazi ufafanuzi. Ufafanuzi wa kazi, kwa upande wake, una vyeti na taarifa . Maagizo yanaweza kufafanua aina mpya kwa kutumia maneno kama vile struct , union , na enum , au hawawajui aina na kuhifadhi hifadhi kwa vigezo vipya, kwa kawaida kwa kuandika aina iliyofuatwa na jina la variable. Maneno kama vile char na int bayana aina zilizojengwa. Sehemu za kificho zimefungwa katika braces ( { na } , wakati mwingine huitwa "mabaki ya curly") ili kupunguza upeo wa maazimio na kufanya kama kauli moja kwa miundo ya kudhibiti.

Kama lugha muhimu, C hutumia maelezo ya kutaja vitendo. Maneno ya kawaida ni tamko la kujieleza , linalojumuisha maneno ya kutathmini, ikifuatiwa na semicoloni; kama athari ya upande wa tathmini, kazi zinaweza kuitwa na vigezo zinaweza kupewa maadili mapya. Kurekebisha ufanisi wa kawaida wa utekelezaji wa kauli, C hutoa taarifa kadhaa za kudhibiti udhibiti unaotambuliwa na maneno muhimu yaliyohifadhiwa. Programu Structured ni mkono na if (- else ) masharti ya utekelezaji na kwa do - while , while , na for iterative utekelezaji (looping). for taarifa yake ina initialization tofauti, kujaribu, na reinitialization maneno, yoyote au yote ambayo inaweza kuachwa. break na continue inaweza kutumika kuondoka taarifa ya ndani enclosing kitanzi au kuruka kwa reinitialization yake. Pia kuna taarifa isiyo ya muundo ya goto ambayo hufanya matawi moja kwa moja kwa studio iliyochaguliwa ndani ya kazi. switch huchagua case inayotakiwa kutekelezwa kulingana na thamani ya kujieleza kwa jumla.

Maneno yanaweza kutumia aina mbalimbali za watoaji wa kujengwa na inaweza kuwa na simu za kazi. Mpangilio ambao hoja za kazi na kazi kwa waendeshaji wengi zinatathminiwa hazijulikani. Tathmini inaweza hata kuingizwa. Hata hivyo, athari zote (ikiwa ni pamoja na uhifadhi kwa vigezo) zitatokea kabla ya " hatua ya mlolongo " ijayo; Vipengele vya mlolongo ni pamoja na mwisho wa kila taarifa ya kujieleza, na kuingia na kurudi kutoka kwa kila simu ya kazi. Vipengele vya mlolongo pia hutokea wakati wa tathmini ya maneno yaliyo na waendeshaji fulani ( && , || , ?: Na operator wa comma ). Hii inaruhusu kiwango kikubwa cha uboreshaji wa kifaa chochote kwa compiler, lakini inahitaji wachunguzi wa C kuchukua huduma zaidi kupata matokeo ya kuaminika kuliko inahitajika kwa lugha nyingine za programu.

Kernighan na Ritchie wanasema katika Utangulizi wa Lugha ya C Programming : "C, kama lugha nyingine yoyote, ina vikwazo vyake. Baadhi ya waendeshaji wana utangulizi usiofaa, baadhi ya sehemu za syntax inaweza kuwa bora." [21] Msingi wa C haukujaribu kurekebisha vikwazo vingi hivi, kwa sababu ya mabadiliko ya mabadiliko hayo kwenye programu zilizopo tayari.

Tabia imewekwa

Kuweka kwa msingi wa tabia ya C inajumuisha wahusika wafuatayo:

  • Barua za chini na za majina ya ISO ya msingi ya alfabeti ya Kilatini: a - z A - Z
  • Idadi ya maadili: 0 - 9
  • Graphic wahusika: ! " # % & ' ( ) * + , - . / : ; < = > ? [ \ ] ^ _ { | } ~
  • Wahusika wa Whitespace : nafasi , tab ya usawa , tab ya wima , kulisha fomu , mpya

Newline inaonyesha mwisho wa mstari wa maandiko; haipaswi kufanana na tabia halisi, ingawa kwa urahisi C huchukua kama moja.

Ziada mbalimbali byte encoded wahusika inaweza kutumika katika literals kamba, lakini si kabisa portable . Kiwango cha karibuni cha C ( C11 ) inaruhusu wahusika wengi wa kitaifa wa Unicode kuwa imeingizwa portably ndani ya maandishi ya chanzo kwa kutumia \uXXXX au \UXXXXXXXX encoding (ambapo X inaashiria tabia ya hexadecimal), ingawa kipengele hiki \UXXXXXXXX kutekelezwa.

Uwekaji wa tabia ya msingi ya C una wahusika sawa, pamoja na uwakilishi wa alerts , backspace , na kurudi gari . Usaidizi wa wakati wa kukimbia kwa seti za kupanua tabia umeongezeka na kila marekebisho ya kiwango cha C.

Maneno yaliyohifadhiwa

C89 ina maneno 32 yaliyohifadhiwa, pia yanajulikana kama maneno muhimu, ambayo ni maneno ambayo hayawezi kutumiwa kwa madhumuni yoyote isipokuwa yale ambayo hayafafanuliwa:

C99 imehifadhiwa zaidi ya maneno tano:

C11 imehifadhi maneno saba zaidi: [22]

Maneno mengi ya hivi karibuni yaliyohifadhiwa yanaanza na mkazo unaofuata unafuatiwa na barua kuu, kwa sababu vitambulisho vya fomu hiyo zilihifadhiwa awali na kiwango cha C cha matumizi tu kwa utekelezaji. Tangu kanuni iliyopo ya chanzo cha programu haipaswi kuwa kutumia vitambulisho hivi, haiwezi kuathiriwa wakati utekelezaji wa C ulianza kuunga mkono vidonge hivi kwenye lugha ya programu. Baadhi ya vichwa vya kawaida hufafanua vifunguzo vyema zaidi vya vitambulisho vilivyothibitishwa. Lugha hapo awali ilikuwa na neno lililohifadhiwa inayoitwa entry , lakini hii ilikuwa mara kwa mara kutekelezwa, na sasa imeondolewa kama neno lililohifadhiwa. [23]

Waendeshaji

C inasaidia seti nyingi za waendeshaji , ambazo ni alama zinazotumiwa ndani ya kujieleza ili kutaja utaratibu uliofanywa wakati wa kutathmini maneno hayo. C ina waendeshaji kwa:

  • hesabu : + , - , * , / , %
  • kazi : =
  • kazi iliyoongezeka : += , -= , *= , /= , %= , &= , |= , ^= , <<= , >>=
  • mantiki kidogo : ~ , & , | , ^
  • mabadiliko mabaya : << , >>
  • bulin mantiki : ! , && , ||
  • Tathmini ya masharti ? :
  • Upimaji wa usawa: == !=
  • kazi za wito : ( )
  • kuongezeka na kupunguzwa : ++ , --
  • mwanachama uteuzi : . , ->
  • ukubwa wa kitu: sizeof
  • amri mahusiano : < , <= , > , >=
  • rejea na upungufu : & , * , [ ]
  • mpangilio: ,
  • kikundi cha kutokuwa na maoni : ( )
  • uongofu wa aina : ( typename )

C inatumia operator = (kutumika katika hisabati kuelezea usawa) kuonyesha mgawo, kufuatia historia ya Fortran na PL / I , lakini tofauti na ALGOL na derivatives yake. C hutumia operator == kupima kwa usawa. Ufanana kati ya waendeshaji wawili (kazi na usawa) inaweza kusababisha matumizi ya ajali ya moja badala ya mwingine, na mara nyingi, kosa haina kuzalisha ujumbe wa kosa (ingawa wahusika wengine kuzalisha onyo). Kwa mfano, usemi masharti if(a==b+1) inaweza kimakosa kuandikwa kama if(a=b+1) , ambayo itakuwa tathmini kama kweli ikiwa ni zero baada zoezi. a [24]

Utangulizi wa waendeshaji wa C sio wakati wote. Kwa mfano, operator == amefunga zaidi kukazwa kuliko (inafanywa kabla) waendeshaji & (bitwise AND) na | (bitwise OR) katika maneno kama vile x & 1 == 0 , ambayo yanapaswa kuandikwa kama (x & 1) == 0 ikiwa ni nia ya coder. [25]

&quot;Hello, ulimwengu&quot; mfano

Mfano wa " hello, ulimwengu " ulioonekana katika toleo la kwanza la K & R , umekuwa mfano wa programu ya utangulizi katika vitabu vya programu nyingi, bila kujali lugha ya programu. Mpango huu unapanga "hello, dunia" kwa pato la kawaida , ambayo kawaida ni terminal au kuonyesha screen.

Toleo la awali lilikuwa: [26]

kuu ()
{
    printf ( "hello, dunia \ n " );
}

Mpango wa "hello, dunia" inayofanana na kiwango ni: [a]

#jumuisha <stdio.h>

int kuu ( haipo )
{
    printf ( "hello, dunia \ n " );
}

Mstari wa kwanza wa mpango una maagizo ya awali , yaliyoonyeshwa na #include . Hii inasababisha compiler kuchukua nafasi ya mstari huo na maandiko yote ya kichwa cha kawaida cha stdio.h , ambacho kina maagizo ya kazi ya kawaida ya pembejeo na matokeo kama vile printf . Mabango ya pembe yaliyozunguka stdio.h yanaonyesha kwamba stdio.h iko kwa mkakati wa utafutaji ambao unapendelea vichwa vinavyotolewa na compiler kwenye vichwa vingine vina jina sawa, kinyume na quotes mbili ambazo kwa kawaida hujumuisha faili za kichwa au za mradi maalum.

Mstari unaofuata unaonyesha kuwa kazi inayoitwa main inaelezwa. Kazi main inatumika kusudi maalum katika mipango ya C; mazingira ya wakati wa kukimbia huita kazi main kuanzisha utekelezaji wa mpango. Kielelezo cha aina ya int kinaonyesha kwamba thamani ambayo inarudi kwa mtayarishaji (katika kesi hii mazingira ya wakati wa kukimbia) kama matokeo ya kutathmini kazi main , ni integer. Jina la msingi void kama orodha ya parameter inaonyesha kwamba kazi hii haifai hoja. [b]

Ufungashaji wa ufunuo huonyesha mwanzo wa ufafanuzi wa kazi main .

Simu ya pili ya simu (inaruhusu utekelezaji kwa) kazi inayoitwa printf , ambayo katika kesi hii inatolewa kwenye maktaba ya mfumo. Katika simu hii, kazi ya printf inapitishwa (zinazotolewa) na hoja moja, anwani ya tabia ya kwanza katika kamba halisi "hello, world\n" . Kamba halisi ni safu isiyojulikana na vitu vya aina ya char , kuanzisha moja kwa moja na compiler yenye tabia ya mwisho ya 0 ili alama mwisho wa safu ( printf inahitaji kujua hii). \n ni mlolongo wa kutoroka kwamba C hutafsiriwa na tabia mpya , ambayo kwenye pato inaashiria mwisho wa mstari wa sasa. Thamani ya kurudi ya kazi ya printf ni ya aina ya int , lakini inatupwa kimya kwa sababu haijautumiwa. (Mpangilio wa makini zaidi unaweza kupima thamani ya kurudi ili kuamua ikiwa kazi ya printf haifanikiwa.) Semicoloni ; inachia taarifa.

Ufungaji wa curly kufunga unaonyesha mwisho wa msimbo wa kazi main . Kwa mujibu wa vipimo vya C99 na vipya, kazi main , tofauti na kazi nyingine yoyote, itarudi kwa thamani kabisa ya 0 ili kufikia } ambayo inakamilisha kazi. (Ilikuwa ni return 0; wazi return 0; taarifa ilihitajika.) Hii inafasiriwa na mfumo wa wakati wa kukimbia kama msimbo wa kuondoka unaoonyesha utekelezaji wa mafanikio. [27]

Aina za data

Mfumo wa aina ya C ni wa static na dhaifu typed , ambayo inafanya kuwa sawa na mfumo wa aina ya ALGOL kizazi kama Pascal . [28] Kuna aina zilizojengwa kwa integers za ukubwa mbalimbali, namba zote zilizosainiwa na zisizosajiliwa, zinazozunguka , na aina zilizotajwa ( enum ). Namba kamili ya aina char ni mara nyingi hutumika kwa ajili ya herufi za baiti moja. C99 imeongeza datatype ya boolean . Kuna pia aina zilizopatikana ikiwa ni pamoja na orodha , maelekezo , kumbukumbu ( struct ), na vyama vya ushirika visivyotiwa ( union ).

C mara nyingi hutumiwa katika programu za mifumo ya chini ambapo inakimbia kutoka kwa mfumo wa aina inaweza kuwa muhimu. Mwandishi anajaribu kuhakikisha usahihi wa aina ya maneno mengi, lakini mtayarishaji anaweza kupindua hundi kwa njia mbalimbali, ama kwa kutumia aina iliyotolewa ili kubadilisha kwa usahihi thamani kutoka kwa aina moja hadi nyingine, au kwa kutumia vipindi au vyama vya ushirika ili kurejesha tena vipengele vya msingi ya kitu cha data kwa namna nyingine.

Wengine hupata taarifa ya C ya syntax ya unintuitive, hasa kwa kueleza kazi . (Dhana ya Ritchie ilikuwa kutangaza utambulisho katika hali zinazofanana na matumizi yao: " tamko linaonyesha matumizi ".) [29]

Kubadilishana kwa kawaida ya hesabu ya C huruhusu msimbo wa ufanisi wa kuzalishwa, lakini wakati mwingine hutoa matokeo yasiyotarajiwa. Kwa mfano, kulinganisha kwa integers zilizosainiwa na zisizosajiliwa za upana sawa zinahitaji uongofu wa thamani iliyosainiwa usiyotumwa. Hii inaweza kuzalisha matokeo yasiyotarajiwa ikiwa thamani ya saini ni hasi.

Ufafanuzi

C inasaidia matumizi ya vipimo , aina ya rejea inayoandika anwani au eneo la kitu au kazi katika kumbukumbu. Kuelezea kunaweza kufutwa kufikia data iliyohifadhiwa kwenye anwani iliyoelezwa, au kuomba kielelezo-kufanya kazi. Kuelezea kunaweza kutumiwa kwa kutumia kazi au mashairi ya mashairi . Uwakilishi wa muda wa kukimbia kwa thamani ya pointer ni anwani ya kumbukumbu ya ghafi (labda imeongezeka kwa shamba la ndani ya neno), lakini kwa kuwa aina ya pointer inajumuisha aina ya kitu kilichoelekezwa, maneno yanayojumuisha yanaweza kuwa aina ya kuchunguza wakati wa kukusanya. Nadharia ya pointer ni moja kwa moja iliyowekwa na ukubwa wa alama-ya data ya aina. Kuelezea hutumiwa kwa madhumuni mengi katika C. Makondano ya maandishi hutumiwa kwa kawaida kwa kutumia vifungo katika orodha ya wahusika. Ugawaji wa kumbukumbu ya nguvu hufanyika kwa kutumia vipimo. Data aina nyingi, kama vile miti , ni kawaida kutekelezwa kama dynamically zilizotengwa struct vitu kuunganishwa pamoja kwa kutumia kuyatumia. Kuelezea kwa kazi ni muhimu kwa kupitisha kazi kama hoja za kazi za juu (kama vile qsort au bsearch ) au kama kupiga simu kuingizwa na watoaji wa tukio. [27]

Thamani ya pointer isiyo na uhakika inaonyesha wazi mahali halali. Dereferencing null null pointer thamani ni wazi, mara nyingi kusababisha kosa sehemu . Vipimo vya pointer visivyofaa ni muhimu kwa kuonyesha matukio maalum kama vile pointer "inayofuata" katika node ya mwisho ya orodha iliyounganishwa , au kama dalili ya kosa kutoka kwa kazi za kurejea. Katika hali sahihi katika msimbo wa chanzo, kama vile kugawa variable ya pointer, mara kwa mara pointer ya kawaida inaweza kuandikwa kama 0 , na bila ya kutumwa wazi kwa aina ya pointer, au kama macro NULL ilivyofafanuliwa na kichwa kadhaa. Katika mazingira ya masharti, maadili ya pointer ya nambari hayatathmini kwa uongo, wakati maadili yote ya pointer yanatathmini kwa kweli.

Kueleza kwa sauti ( void * ) inaelezea vitu vya aina isiyojulikana, na hivyo inaweza kutumika kama maelezo ya "generic" data. Kwa kuwa ukubwa na aina ya alama-ya kupinga haijulikani, maelezo ya wazi hayawezi kufutwa, wala haijasifu hesabu juu yao, ingawa inaweza kwa urahisi (na katika mazingira mengi ni wazi) yamebadilishwa na kutoka pointer yoyote ya kitu aina. [27]

Matumizi yasiyofaa ya maelekezo yanaweza kuwa hatari. Kwa sababu kwa kawaida hawajafunguliwa, variable ya pointer inaweza kufanywa ili kuelezea eneo lolote ambalo linaweza kusababisha athari zisizofaa. Ingawa vipimo vilivyotumiwa vyema vinaelezea mahali salama, zinaweza kufanywa ili kuelezea maeneo yasiyo salama kwa kutumia hesabu ya pointer isiyo sahihi; vitu ambavyo vinaelezea vinaweza kuendelea kutumika baada ya kuondokana na ( pointers dangling ); zinaweza kutumiwa bila kuanzishwa ( maelekezo ya mwitu ); au wanaweza kuwa na thamani ya salama kwa kutumia kutupwa, muungano, au kwa njia nyingine ya pointer. Kwa ujumla, C ni vibali kwa kuruhusu uharibifu na uongofu kati ya aina za pointer, ingawa kukusanya kawaida hutoa chaguzi kwa viwango mbalimbali vya kuchunguza. Lugha nyingine za programu zinaweza kushughulikia matatizo haya kwa kutumia aina zaidi za kumbukumbu za kuzuia.

Mipango

Array aina katika C ni jadi ya kudumu, static ukubwa maalum wakati kukusanya. (Zaidi ya hivi karibuni C99 kiwango pia inaruhusu mfumo wa arrays variable-urefu.) Hata hivyo, pia kuna uwezekano wa kutenga block ya kumbukumbu (ukubwa holela) kwa kukimbia muda, kwa kutumia kiwango maktaba ya malloc kazi, na kama kutibu safu. Uunganishaji wa safu na maelekezo ya C unamaanisha kwamba vitu vinavyotajwa na vitu hivi vinavyotengwa kwa nguvu vinaweza kutofautiana.

Kwa kuwa arrays ni daima kupatikana (katika athari) kupitia kuyatumia, safu wanapata ni kawaida si checked dhidi ya msingi safu kabisa, ingawa baadhi compilers inaweza kutoa mipaka ya kuangalia kama chaguo. [30] Array imefungwa ukiukwaji inawezekana na badala ya kawaida katika kanuni isiyoandikwa bila maandishi, na inaweza kusababisha athari mbalimbali, ikiwa ni pamoja na upatikanaji wa kumbukumbu haramu, rushwa ya data, overloads , na muda wa kukimbia. Ikiwa ukiangalia mipaka unapotakiwa, lazima ufanyike kwa mikono.

C haina utoaji maalum wa kutangaza vipengele mbalimbali , lakini hutegemea upya ndani ya mfumo wa aina ili kutangaza orodha za vitu, ambazo hufanyika kwa ufanisi kitu kimoja. Maadili ya index ya kusababisha "safu mbalimbali" inaweza kufikiriwa kama kuongezeka kwa utaratibu wa mstari .

Vipengele vingi vinavyotumiwa hutumiwa kwa kawaida katika nambari za algorithms (hasa kutokana na algebra linalotumika) kuhifadhi matrizi. Mfumo wa C array unafaa kwa kazi hii. Hata hivyo, kwa kuwa vifungo vinapitishwa tu kama maelekezo, mipaka ya safu lazima inajulikana maadili fasta au kwa wazi wazi kwa subroutine yoyote ambayo inahitaji yao, na miundo dynamically ukubwa wa arrays haiwezi kupatikana kwa kutumia indexing mara mbili. (A workaround kwa hii ni kutenga safu na "mstari vector" ya ziada ya maelekezo kwenye nguzo.)

C99 ilianzisha "safu za urefu wa urefu" ambazo huzungumzia baadhi, lakini sio yote, ya masuala ya kawaida ya C.

Uingiliano wa safu ya pointer

Ufafanuzi wa maandishi x[i] (ambapo x inaonyesha pointer) ni sukari ya syntactic kwa *(x+i) . [31] Kuchukua faida ya maarifa ya compiler ya aina ya pointer, anwani ambayo x + i inaonyesha siyo anwani ya msingi (inaelezewa na x ) imeongezeka kwa i , lakini inaelezewa kuwa anwani ya msingi iliyoongezeka na i imeongezeka kwa ukubwa wa kipengele ambacho x inaonyesha. Kwa hiyo, x[i] inaonyesha kipengele cha i+1 cha safu.

Zaidi ya hayo, katika hali nyingi za kueleza (ubaguzi unaojulikana ni kama operesheni ya sizeof ), jina la safu ni moja kwa moja kubadilishwa kwa pointer kwenye kipengele cha kwanza cha safu. Hii inamaanisha kuwa safu haipatikani kamwe kama inajulikana kama hoja kwa kazi, lakini sio tu anwani ya kipengele chake cha kwanza kinapitishwa. Kwa hiyo, ingawa kazi huita C hutumia semanti ya kupitisha na thamani , vifungo vinaweza kupitishwa na kutafakari .

Ukubwa wa kipengele inaweza kuamua na kutumia operator sizeof yoyote kipengele dereferenced ya x , kama katika n = sizeof *x au n = sizeof x[0] , na idadi ya vipengele katika kutangaza safu A inaweza kuamua kama sizeof A / sizeof A[0] . Mwisho hutumika tu kwa majina ya safu: vigezo vilivyotangaza kwa nyaraka ( int A[20] ). Kwa sababu ya semantics ya C, haiwezekani kuamua ukubwa mzima wa vitu kwa njia ya kuondokana na vitu au vitu vinavyotokana na ugawaji wa nguvu ( malloc ); kanuni kama vile sizeof arr / sizeof arr[0] (ambako arr inaashiria pointer) haitatumika tangu mkusanyiko anafikiri ukubwa wa pointer yenyewe inauzwa. [32] [33] Kwa kuwa jina la safu ya jina la sizeof kuwa pointer, hazionyeshe uwazi huo. Hata hivyo, arrays iliyoundwa na mgao nguvu ni kupatikana kwa kuyatumia badala ya kweli safu vigezo, hivyo wanakabiliwa na huo sizeof masuala kama kuyatumia mkusanyiko.

Kwa hiyo, licha ya kutofautiana kwa dhahiri kati ya vigezo vya safu na pointer, bado kuna tofauti inayofanyika kati yao. Ingawa jina la safu ni, katika mazingira mengi ya kuelezea, yamebadilika kuwa pointer (kwa kipengele chake cha kwanza), pointer hii haijimiliki hifadhi yoyote; jina la safu si thamani ya l , na anwani yake ni mara kwa mara, tofauti na kutofautiana kwa pointer. Kwa hiyo, ni aina gani "inaonyesha" haiwezi kubadilishwa, na haiwezekani kugawa anwani mpya kwa jina la safu. Maudhui yaliyomo yanaweza kunakiliwa, hata hivyo, kwa kutumia kazi ya memcpy , au kwa kupata vipengele vya kibinafsi.

Usimamizi wa Kumbukumbu

Moja ya kazi muhimu zaidi ya lugha ya programu ni kutoa vifaa vya kusimamia kumbukumbu na vitu vilivyohifadhiwa katika kumbukumbu. C hutoa njia tatu tofauti za kutenga kumbukumbu kwa vitu: [27]

  • Ugawaji wa kumbukumbu ya kimya : nafasi ya kitu hutolewa katika binary wakati wa kukusanya; vitu hivi vina kiwango (au maisha) wakati binary ambayo inao inaingizwa kwenye kumbukumbu.
  • Ugawaji wa kumbukumbu moja kwa moja : vitu vya muda vinaweza kuhifadhiwa kwenye stack , na nafasi hii imefungua moja kwa moja na kurejeshwa baada ya kuzuia ambayo imetangazwa imetoka.
  • Ugawaji wa kumbukumbu ya nguvu : vitalu vya kumbukumbu ya ukubwa wa kiholela vinaweza kuombwa wakati wa kukimbia kwa kutumia kazi za maktaba kama vile malloc kutoka eneo la kumbukumbu inayoitwa chungu ; vitalu hizi zinaendelea mpaka hatimaye waliokimbia kutumika tena kwa kupiga maktaba kazi realloc au free

Mbinu hizi tatu ni sahihi katika hali tofauti na zina biashara mbalimbali. Kwa mfano, ugawaji wa kumbukumbu ya tuli ina ugawaji mdogo wa ugawaji, ugawaji wa moja kwa moja unaweza kuhusisha zaidi ya juu, na ugawaji wa kumbukumbu ya nguvu unaweza uwezekano wa kuwa na uingizaji mkubwa wa ugawaji na ugawaji. Aina ya kudumu ya vitu vya tuli ni muhimu kwa kudumisha habari za hali katika wito za kazi, ugawaji wa moja kwa moja ni rahisi kutumia lakini nafasi ya kawaida ni kawaida sana na ya muda mfupi zaidi kuliko kumbukumbu au tukio la kumbukumbu, na ugawaji wa kumbukumbu unaowezesha huwezesha ugawaji rahisi wa vitu ukubwa unajulikana tu wakati wa kukimbia. Mipango ya C wengi hutumia matumizi mawili ya yote matatu.

Iwapo inawezekana, mgao wa moja kwa moja au uliowekwa kwa kawaida ni rahisi kwa sababu kuhifadhi ni kusimamiwa na compiler, kumkomboa programmer ya chore uwezekano wa kupoteza kwa manually kutenga na kutolewa kuhifadhi. Hata hivyo, miundo mingi ya data inaweza kubadilika kwa ukubwa wakati wa kukimbia, na tangu mgawanyo wa tuli (na ugawaji wa moja kwa moja kabla ya C99) lazima uwe na ukubwa wa kudumu wakati wa kukusanya, kuna hali nyingi ambazo ugawaji wa nguvu ni muhimu. [27] Kabla ya kiwango cha C99, safu za ukubwa tofauti zilikuwa mfano wa kawaida wa hili. (Angalia makala juu ya malloc kwa mfano wa vitu vinavyotengwa kwa nguvu.) Tofauti na mgao wa moja kwa moja, ambayo inaweza kushindwa wakati wa kukimbia na matokeo yasiyothibitiwa, kazi za ugawaji wa nguvu zinarudi dalili (kwa namna ya thamani ya pointer null) wakati hifadhi inayohitajika haiwezi kutengwa. (Ugawaji wa static ambao ni mkubwa sana kwa kawaida hugunduliwa na kiungo au mzigo , kabla ya mpango huo hauwezi kuanza kutekelezwa.)

Isipokuwa ifafanuliwa vinginevyo, vitu vya tuli vina vyenye zero au null pointer juu ya kuanzisha programu. Vitu vinavyotengwa kwa moja kwa moja na kwa nguvu vinatanguliwa tu ikiwa thamani ya awali imeelezwa wazi; vinginevyo wao huwa na maadili yasiyo ya kawaida (kwa kawaida, muundo wowote kidogo hutokea kuwapo katika hifadhi , ambayo inaweza hata kuwakilisha thamani ya aina ya aina hiyo). Ikiwa mpango unajaribu kufikia thamani isiyoinishwa, matokeo hayajafanywa. Washiriki wengi wa kisasa wanajaribu kuchunguza na kuonya juu ya tatizo hili, lakini vipaji vyote vya uongo na vikwazo vya uwongo vinaweza kutokea.

Suala jingine ni kwamba mgawanyo wa kumbukumbu ya chungu unapaswa kuingiliana na matumizi yake halisi katika mpango wowote ili uweze kutumika tena iwezekanavyo. Kwa mfano, ikiwa pointer pekee kwa ugawaji wa kumbukumbu ya chungu hutoka kwa upeo au ina thamani yake imewekwa kabla ya free() inaitwa, basi kumbukumbu hiyo haiwezi kupatikana kwa ajili ya kurejesha tena na kimsingi imepotea kwa programu, jambo linalojulikana kama kumbukumbu ya kumbukumbu . Kinyume chake, inawezekana kwa kumbukumbu kuachiliwa lakini itaendelea kutajwa, na kusababisha matokeo yasiyotabirika. Kwa kawaida, dalili zitaonekana katika sehemu ya programu iliyoondolewa mbali na hitilafu halisi, na hivyo iwe vigumu kufuatilia tatizo. (Masuala hayo yamependezwa kwa lugha na ukusanyaji wa takataka moja kwa moja .)

Maktaba

Lugha C ya programu hutumia maktaba kama njia ya msingi ya ugani. Katika C, maktaba ni seti ya kazi zilizomo ndani ya faili moja "ya kumbukumbu". Kila maktaba ina faili ya kichwa , ambayo ina prototypes ya kazi zilizomo ndani ya maktaba ambazo zinaweza kutumiwa na programu, na matangazo ya aina maalum za data na ishara za jumla zilizotumiwa na kazi hizi. Ili programu ya kutumia maktaba, ni lazima ijumuishe faili ya kichwa cha maktaba, na maktaba lazima ihusishwe na programu, ambayo mara nyingi inahitaji bendera za kukusanya (kwa mfano, -lm , shorthand kwa "kiungo maktaba ya math") . [27]

Maktaba ya kawaida ya C ni maktaba ya kiwango cha C , ambayo huelezwa na viwango vya ISO na ANSI C na inakuja na utekelezaji wa kila C (utekelezaji unaozingatia mazingira mdogo kama vile mifumo iliyoingia inaweza kutoa tu sehemu ndogo ya maktaba ya kawaida). Maktaba hii inasaidia mchango wa pembejeo na pato, ugawaji wa kumbukumbu, hisabati, masharti ya tabia, na maadili ya wakati. Nyaraka kadhaa tofauti za kawaida (kwa mfano, stdio.h ) zinafafanua interfaces kwa hizi na vifaa vingine vya maktaba.

Kazi nyingine ya kawaida ya kazi za maktaba ya C ni wale kutumika kwa maombi maalum kwa ajili ya mifumo Unix na Unix-kama , hasa kazi ambayo hutoa interface kwa kernel . Kazi hizi ni za kina katika viwango mbalimbali kama POSIX na UNIX Single Specification .

Kwa kuwa mipango mingi imeandikwa katika C, kuna maktaba mengine mengi yanayopatikana. Maktaba mara nyingi huandikwa kwa C kwa sababu wajumbe wa C huzalisha kifaa chenye ufanisi; wasanidi programu kisha kuunda interfaces kwenye maktaba ili kwamba routines inaweza kutumika kutoka lugha ya juu ngazi kama Java , Perl , na Python . [27]

Vifaa vya lugha

Vipengee vingi vimeundwa ili kusaidia wasimamizi wa C kupata na kurekebisha kauli na tabia isiyojulikana au kwa maneno yasiyofaa, kwa ukali zaidi kuliko ile iliyotolewa na compiler. Chombo lint ilikuwa ya kwanza kama hiyo, na kusababisha wengine wengi.

Kuangalia kanuni za chanzo na uhakiki wa chanzo ni manufaa kwa lugha yoyote, na kwa C nyingi zana hizo zipo, kama Lint . Mazoezi ya kawaida ni kutumia Lint kuchunguza msimbo unaojibika wakati programu imeandikwa kwanza. Mara tu mpango unapokwisha Lint, basi hutengenezwa kwa kutumia C compiler. Pia, washiriki wengi wanaweza kuonya kwa hiari kuhusu ujenzi wa kisayansi ambao halali kuwa makosa. MISRA C ni seti ya wamiliki wa miongozo ili kuepuka kanuni hiyo isiyojibika , iliyoandaliwa kwa mifumo iliyoingia. [34]

Pia kuna makusanyo, maktaba, na mfumo wa mfumo wa uendeshaji wa vitendo ambavyo sio sehemu ya C, kama vile mipaka ya kuchunguza mipangilio, kupatikana kwa kufurika kwa buffer , kupangilia , kufuatilia kumbukumbu ya nguvu , na kukusanya takataka moja kwa moja .

Vyombo kama vile Utakaso au Valgrind na kuunganisha na maktaba yaliyo na matoleo maalum ya kazi za ugawaji wa kumbukumbu zinaweza kusaidia kugundua makosa ya kukimbia wakati wa matumizi ya kumbukumbu.

Matumizi

Grafu ya index ya TIOBE kuanzia 2002 hadi 2015, inayoonyesha kulinganisha kwa umaarufu wa lugha mbalimbali za programu [35]

C hutumiwa sana kwa ajili ya programu ya mfumo katika utekelezaji wa mifumo ya uendeshaji na matumizi ya mfumo wa ndani , [36] kwa sababu code C, wakati imeandikwa kwa portability, inaweza kutumika kwa madhumuni mengi, lakini wakati inahitajika, kanuni maalum ya mfumo inaweza kutumika kufikia vifaa maalum anwani na kufanya aina ya punning kufanana na mahitaji ya interface ya nje ya nje, na mahitaji ya wakati wa kukimbia chini ya rasilimali za mfumo.

C inaweza pia kutumika kwa ajili ya programu za tovuti kutumia CGI kama "lango" la habari kati ya maombi ya Mtandao, seva, na kivinjari. [37] C mara nyingi huchaguliwa juu ya lugha zilizotafsiriwa kwa sababu ya upatikanaji wake wa kasi, utulivu na karibu-upatikanaji. [38]

Matokeo moja ya upatikanaji wa upatikanaji wa C na ufanisi ni kwamba washirika , maktaba na wakalimani wa lugha nyingine za programu hutekelezwa mara nyingi C. C. utekelezaji wa kumbukumbu za Python , Perl na PHP , kwa mfano, zote zinaandikwa C.

Kwa kuwa safu ya ufuatiliaji ni nyembamba na upepo ni wa chini, C inawawezesha waandaaji kuunda utekelezaji wa ufanisi wa miundo na miundo ya data, muhimu kwa mipango ya kuzingatia makali. Kwa mfano, Maktaba ya Hesabu ya GNU Multiple Precision , Maktaba ya Sayansi ya GNU , Mathematica , na MATLAB imeandikwa kikamilifu au sehemu katika C.

C wakati mwingine hutumiwa kama lugha ya kati kwa utekelezaji wa lugha zingine. Njia hii inaweza kutumika kwa portability au urahisi; kwa kutumia C kama lugha ya kati, jenereta za ziada za mashine sio lazima. C ina vipengele vingine, kama vile maagizo ya nambari ya mstari wa mstari na vitu vya hiari vichafu mwishoni mwa orodha za mwanzilishi, ambazo zinasaidia kukusanya kanuni. Hata hivyo, baadhi ya mapungufu ya C imesababisha maendeleo ya lugha nyingine za C-msingi hasa iliyoundwa kwa ajili ya matumizi kama lugha za kati, kama C - .

C imetumika pia sana kutekeleza programu za mtumiaji wa mwisho . Hata hivyo, maombi kama hayo yanaweza pia kuandikwa katika lugha mpya na za juu.

Lugha zinazohusiana

C imefanya moja kwa moja na kwa moja kwa moja lugha nyingi baadaye kama vile C # , D , Go , Java , JavaScript , Limbo , LPC , Perl , PHP , Python , na shell ya Unix ya C. [39] Ushawishi zaidi kuenea imekuwa syntactical, kila wa lugha zilizotajwa kuchanganya kauli na (zaidi au chini ya kutambulika) kujieleza syntax ya C na mifumo ya aina, mifano data na / au miundo mikubwa mpango huo tofauti na wale wa C , wakati mwingine kwa kiasi kikubwa.

Watafsiri kadhaa wa C au karibu-C huwepo, ikiwa ni pamoja na Ch na CINT , ambayo inaweza pia kutumika kwa scripting.

Wakati lugha zilizolengwa na vitu zimekuwa maarufu, C + + na Taratibu-C zilikuwa na upanuzi tofauti wa C ambao ulitoa uwezo unaoelekezwa na kitu. Lugha zote mbili zilianzishwa awali kama washirika wa chanzo-to-source ; Nambari ya chanzo ilitafsiriwa kwenye C, halafu ikaandaliwa na compiler ya C. [40]

Lugha ya C ++ ilipangwa na Bjarne Stroustrup kama mbinu ya kutoa utendaji unaoelekezwa na kitu na syntax kama C. [41] C + + inaongeza nguvu kubwa za kuchapa, kupima, na zana zingine zinazofaa katika programu zinazoelekezwa na kitu, na inaruhusu programu za generic kupitia templates. Karibu superset ya C, C ++ sasa inasaidia wengi C, na isipokuwa chache .

Lengo-C lilikuwa safu ya "nyembamba" juu ya C, na inabakia superset ya C ambayo inaruhusu programu zinazoelekezwa kwa kutumia fomu ya kuandika ya nguvu ya mseto. Lengo-C hupata syntax yake kutoka kwa C na Smalltalk : syntax ambayo inahusisha maandamano, maneno, utendaji kazi, na simu za kazi zinamilikiwa kutoka kwa C, wakati syntax kwa vipengele vyenye vitu vimechukuliwa kutoka kwa Smalltalk.

Mbali na C ++ na Lengo-C , Ch , Cilk na Unified Parallel C ni karibu supersets ya C.

Angalia pia

  • Kulinganisha Pascal na C
  • Kulinganisha lugha za programu
  • Mshindano wa Kanuni ya Kimataifa ya Msimbo wa C
  • Orodha ya lugha za msingi za programu za C
  • Orodha ya washiriki wa C

Vidokezo

  1. ^ The original example code will compile on most modern compilers that are not in strict standard compliance mode, but it does not fully conform to the requirements of either C89 or C99. In fact, C99 requires that a diagnostic message be produced.
  2. ^ The main function actually has two arguments, int argc and char *argv[] , respectively, which can be used to handle command line arguments . The ISO C standard (section 5.1.2.2.1) requires both forms of main to be supported, which is special treatment not afforded to any other function.

Marejeleo

  1. ^ a b c d e Kernighan, Brian W. ; Ritchie, Dennis M. (February 1978). The C Programming Language (1st ed.). Englewood Cliffs, NJ : Prentice Hall . ISBN 0-13-110163-3 . Regarded by many to be the authoritative reference on C.
  2. ^ Ritchie (1993) : "Thompson had made a brief attempt to produce a system coded in an early version of C—before structures—in 1972, but gave up the effort."
  3. ^ Ritchie (1993) : "The scheme of type composition adopted by C owes considerable debt to Algol 68, although it did not, perhaps, emerge in a form that Algol's adherents would approve of."
  4. ^ a b "Verilog HDL (and C)" (PDF) . The Research School of Computer Science at the Australian National University. 2010-06-03 . Retrieved 2013-08-19 . 1980s: ; Verilog first introduced ; Verilog inspired by the C programming language
  5. ^ Ritchie (1993)
  6. ^ Lawlis, Patricia K. (August 1997). "Guidelines for Choosing a Computer Language: Support for the Visionary Organization" . Ada Information Clearinghouse . Retrieved 18 July 2006 .
  7. ^ "Programming Language Popularity" . 2009. Archived from the original on 13 December 2007 . Retrieved 16 January 2009 .
  8. ^ "TIOBE Programming Community Index" . 2009 . Retrieved 6 May 2009 .
  9. ^ Ritchie, Dennis M. (March 1993). "The Development of the C Language" . ACM SIGPLAN Notices . 28 (3): 201–208. doi : 10.1145/155360.155580 .
  10. ^ Ulf Bilting & Jan Skansholm "Vägen till C" (Swedish) meaning "The Road to C", third edition, Studentlitteratur , year 2000, page 3. ISBN 91-44-01468-6 .
  11. ^ a b c Johnson, S. C. ; Ritchie, D. M. (1978). "Portability of C Programs and the UNIX System" . Bell System Tech. J . 57 (6): 2021–2048. doi : 10.1002/j.1538-7305.1978.tb02141.x . Retrieved 16 December 2012 . (Note: this reference is an OCR scan of the original, and contains an OCR glitch rendering "IBM 370" as "IBM 310".)
  12. ^ McIlroy, M. D. (1987). A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 (PDF) (Technical report). CSTR. Bell Labs. p. 10. 139.
  13. ^ Stallings, William. "Operating Systems: Internals and Design Principles" 5th ed, page 91. Pearson Education, Inc. 2005.
  14. ^ a b Kernighan, Brian W. ; Ritchie, Dennis M. (March 1988). The C Programming Language (2nd ed.). Englewood Cliffs, NJ : Prentice Hall . ISBN 0-13-110362-8 .
  15. ^ Stroustrup, Bjarne (2002). Sibling rivalry: C and C++ (PDF) (Report). AT&T Labs.
  16. ^ "JTC1/SC22/WG14 – C" . Home page . ISO/IEC . Retrieved 2 June 2011 .
  17. ^ Andrew Binstock (October 12, 2011). "Interview with Herb Sutter" . Dr. Dobbs . Retrieved September 7, 2013 .
  18. ^ "TR 18037: Embedded C" (PDF) . ISO / IEC . Retrieved 26 July 2011 .
  19. ^ Harbison, Samuel P.; Steele, Guy L. (2002). C: A Reference Manual (5th ed.). Englewood Cliffs, NJ : Prentice Hall . ISBN 0-13-089592-X . Contains a BNF grammar for C.
  20. ^ Kernighan, Brian W. ; Ritchie, Dennis M. (1996). The C Programming Language (2nd ed.). Prentice Hall . p. 192. ISBN 7 302 02412 X .
  21. ^ Page 3 of the original K&R [1]
  22. ^ ISO/IEC 9899:201x (ISO C11) Committee Draft
  23. ^ Kernighan, Brian W. ; Ritchie, Dennis M. (1996). The C Programming Language (2nd ed.). Prentice Hall . pp. 192, 259. ISBN 7 302 02412 X .
  24. ^ "10 Common Programming Mistakes in C++" . Cs.ucr.edu . Retrieved 26 June 2009 .
  25. ^ Schultz, Thomas (2004). C and the 8051 (3rd ed.). Otsego, MI: PageFree Publishing Inc. p. 20. ISBN 1-58961-237-X . Retrieved 10 February 2012 .
  26. ^ Page 6 of the original K&R [1]
  27. ^ a b c d e f g Klemens, Ben (2013). 21st Century C . O'Reilly Media . ISBN 1-4493-2714-1 .
  28. ^ Feuer, Alan R.; Gehani, Narain H. (March 1982). "Comparison of the Programming Languages C and Pascal". ACM Computing Surveys . 14 (1): 73–92. doi : 10.1145/356869.356872 . (Subscription required ( help )) .
  29. ^ Page 122 of K&R2 [14]
  30. ^ For example, gcc provides _FORTIFY_SOURCE. "Security Features: Compile Time Buffer Checks (FORTIFY_SOURCE)" . fedoraproject.org . Retrieved 2012-08-05 .
  31. ^ Raymond, Eric S. (11 October 1996). The New Hacker's Dictionary (3rd ed.). MIT Press. p. 432. ISBN 978-0-262-68092-9 . Retrieved 5 August 2012 .
  32. ^ Summit, Steve. "comp.lang.c Frequently Asked Questions 6.23" . Retrieved March 6, 2013 .
  33. ^ Summit, Steve. "comp.lang.c Frequently Asked Questions 7.28" . Retrieved March 6, 2013 .
  34. ^ "Man Page for lint (freebsd Section 1)" . unix.com . 2001-05-24 . Retrieved 2014-07-15 .
  35. ^ McMillan, Robert (2013-08-01). "Is Java Losing Its Mojo?" . Wired .
  36. ^ Chip., Weems, (2014). Programming and problem solving with C++ : brief, sixth edition . Jones & Bartlett Learning. ISBN 1449694284 . OCLC 894992484 .
  37. ^ Dr. Dobb's Sourcebook . U.S.A.: Miller Freeman, Inc. November–December 1995.
  38. ^ "Using C for CGI Programming" . linuxjournal.com. 1 March 2005 . Retrieved 4 January 2010 .
  39. ^ Gerard),, O'Regan, Gerard (Cornelius. Pillars of computing : a compendium of select, pivotal technology firms . ISBN 3319214640 . OCLC 922324121 .
  40. ^ Lawrence., Rauchwerger, (2004). Languages and compilers for parallel computing : 16th international workshop, LCPC 2003, College Station, TX, USA, October 2-4, 2003 : revised papers . Springer. ISBN 3540246444 . OCLC 57965544 .
  41. ^ Stroustrup, Bjarne (1993). "A History of C++: 1979−1991" (PDF) . Retrieved 9 June 2011 .

Vyanzo

Kusoma zaidi

  • Banahan, M.; Brady, D.; Doran, M. (1991). The C Book (2nd ed.). Addison-Wesley .
  • King, K. N. (April 2008). C Programming: A Modern Approach (2nd ed.). Norton . ISBN 978-0-393-97950-3 .
  • Thompson, Ken . "A New C Compiler" (PDF) . Murray Hill, New Jersey: AT&T Bell Laboratories.
  • Feuer, Alan R. (1998). The C Puzzle Book (1st, revised printing ed.). Addison-Wesley . ISBN 978-0-201-60461-0 .

Viungo vya nje