ii nabora simvolov. Nekotorye negraficheskie simvoly, odinochnaya kavychka ' i obratnaya kosaya cherta \ mogut byt' predstavleny v sootvetst- vii so sleduyushchej tablicej uslovnyh posledovatel'nostej: novaya stroka NL/LF/ \N gorizontal'naya tabulyaciya HT \T simvol vozvrata na odnu poziciyu BS \B vozvrat karetki CR \R perehod na novuyu stranicu FF \F obratnaya kosaya cherta \ \\ odinochnaya kavychka ' \' kombinaciya bitov DDD \DDD Uslovnaya posledovatel'nost' \DDD sostoit iz obratnoj ko- soj cherty, za kotoroj sleduyut 1,2 ili 3 vosmerichnyh cifry, kotorye rassmativayutsya kak zadayushchie znachenie zhelaemogo sim- vola. Special'nym sluchaem etoj konstrukcii yavlyaetsya posledo- vatel'nost' \0 (za nulem ne sleduet cifra), kotoraya oprede- lyaet simvol NUL. esli sleduyushchij za obratnoj kosoj chertoj simvol ne sovpadaet s odnim iz ukazannyh, to obratnaya kosaya cherta ignoriruetsya. 10.4.4. Plavayushchie konstanty Plavayushchaya konstanta sostoit iz celoj chasti, desyatichnoj tochki, drobnoj chasti, bukvy E (malen'kaya) ili E (bol'shaya) i celoj eksponenty s neobyazatel'nym znakom. Kak celaya, tak i drobnaya chast' yavlyayutsya posledovatel'nost'yu cifr. Libo celaya, libo drobnaya chast' (no ne obe) mozhet otsutstvovat'; libo de- syatichnaya tochka, libo e (malen'kaya) i eksponenta (no ne to i drugoe odnovremenno) mozhet otsutstvovat'. Kazhdaya plavayushchaya konstanta schitaetsya imeyushchej dvojnuyu tochnost'. 10.5. Stroki Stroka - eto posledovatel'nost' simvolov, zaklyuchennaya v dvojnye kavychki, kak, napriimer,"...". Stroka imeet tip "massiv massivov" i klass pamyati STATIC (sm. Punkt 4 nizhe). Stroka inicializirovana ukazannymi v nej simvolami. Vse stroki, dazhe identichno zapisannye, schitayutsya razlichnymi. Kompilyator pomeshchaet v konec kazhdoj stroki nulevoj bajt \0, s tem chtoby prosmatrivayushchaya stroku programma mogla opredelit' ee konec. Pered stoyashchim vnutri stroki simvolom dvojnoj ka- vychki " dolzhen byt' postavlen simvol obratnoj kosoj cherty \; krome togo, mogut ispol'zovat'sya te zhe usloviya posledova- tel'nosti, chto i v simvol'nyh konstantah. I poslednee, ob- ratnaya kosaya cherta \, za kotoroj neposredstvenno sleduet simvol novoj stroki, ignoriruetsya. 10.6. Harakteristiki apparatnyh sredstv Sleduyushchaya nizhe tablica summiruet nekotorye svojstva ap- paratnogo oborudovaniya, kotorye menyayutsya ot mashiny k mashine. Hotya oni i vliyayut na perenosimost' programm, na praktike oni predstavlyayut malen'kuyu problemu, chem eto mozhet kazat'sya za- ranee. Tablica 1 ------------------------------------------------------- DEC PDP-11 HONEYWELL IBM 370 INTERDATA 8/32 ASCII ASCII EBCDIC ASCII CHAR 8 BITS 9 BITS 8 BITS 8 BITS INT 16 36 32 32 SHORT 16 36 16 16 LONG 32 36 32 32 FLOAT 32 36 32 32 DOUBLE 64 72 64 64 RANGE -38/+38 -38/+38 -76/+76 -76/+76 -------------------------------------------------------- 11. Sintaksicheskaya notaciya V ispol'zuemoj v etom rukovodstve sintaksicheskoj notacii sintaksicheskie kategorii vydelyayutsya kursivom (prim. perev.: v nastoyashchee vremya sinteksicheskie kategorii vmesto kursivom vydelyayutsya podcherkivaniem), a liternye slova i simvoly - zhirnym shriftom. Al'ternativnye kategorii perechislyayutsya na otdel'nyh strochkah. Neobyazatel'nyj simvol, terminal'nyj ili neterminal'nyj, ukazyvaetsya indeksom "neob", tak chto \( vyrazhenie --------- neob \) ukazyvaet na neobyazatel'noe vyrazhenie, zaklyuchennoe v figur- nyh skobkah. Sintaksis summiruetsya v punkte 18. 12. CHto v imeni tebe moem? YAzyk "C" osnovyvaet interpretaciyu identifikatora na dvuh priznakah identifikatora: ego klasse pamyati i ego tipe. Klass pamyati opredelyaet mesto i vremya hraneniya pamyati, svya- zannoj s identifikatorom; tip opredelyaet smysl velichin, na- hodyashchihsya v pamyati, opredelennoj pod identifikatorom. Imeyutsya chetyre klassa pamyati: avtomaticheskaya, statiches- kaya, vneshnyaya i registrovaya. Avtomaticheskie peremennye yavlya- yutsya lokal'nymi dlya kazhdogo vyzova bloka i ischezayut pri vy- hode iz etogo bloka. Staticheskie peremennye yavlyayutsya lokal'- nymi, no sohranyayut svoi znacheniya dlya sleduyushchego vhoda v blok dazhe posle togo, kak upravlenie peredaetsya za predely bloka. Vneshnie peremennye sushchestvuyut i sohranyayut svoi znacheniya v techenie vypolneniya vsej programmy i mogut ispol'zovat'sya dlya svyazi mezhdu funkciyami, v tom chisle i mezhdu nezavisimo skom- pilirovannymi funkciyami. Registrovye peremennye hranyatsya (eli eto vozmozhno) v bystryh registrah mashiny; podobno avto- maticheskim peremennym oni yavlyayutsya lokal'nymi dlya kazhdogo bloka i ischezayut pri vyhode iz etogo bloka. V yazyke "C" predusmotreno neskol'ko osnovnyh tipov ob容ktov: ob容kty, napisannye kak simvoly (CHAR), dostatochno veli- ki, chtoby hranit' lyuboj chlen iz sootvetstvuyushchego dannoj rea- lizacii vnutrennego nabora simvolov, i esli dejstvitel'nyj simvol iz etogo nabora simvolov hranitsya v simvol'noj pere- mennoj, to ee znachenie ekvivalentno celomu kodu etogo simvo- la. V simvol'nyh peremennyh mozhno hranit' i drugie velichiny, no realizaciya budet mashinno-zavisimoj. Mozhno ispol'zovat' do treh razmerov celyh, opisyvaemyh kak SHORT INT, INT i LONG INT. Dlinnye celye zanimayut ne men'she pamyati, chem korotkie, no v konkretnoj realizacii mo- zhet okazat'sya, chto libo korotkie celye, libo dlinnye celye, libo te i drugie budut ekvivalentny prostym celym. "Prostye" celye imeyut estestvennyj razmer, predusmatrivaemyj arhiitek- turoj ispol'zuemoj mashiny; drugie razmery vvodyatsya dlya udvo- letvoreniya special'nyh potrebnostej. Celye bez znaka, opisyvaemye kak UNSIGNED, podchinyayutsya zakonam arifmetiki po modulyu 2**N, gde N - chislo bitov v ih predstavlenii. (Na PDP-11 dlinnye velichiny bez znaka ne pre- dusmotreny). Plavayushchie odinarnoj tochnosti (FLOAT) i plavayushchie dvojnoj tochnosti (DOUBLE) v nekotoryh realizaciyah mogut byt' sinoni- mami. Poskol'ku ob容kty upomyanutyh vyshe tipov mogut byt' ra- zumno interpretirovany kak chisla, eti tipy budut nazyvat'sya arifmeticheskimi. tipy CHAR i INT vseh razmerov sovmestno bu- dut nazyvat'sya celochislennymi. Tipy FLOAT i DOUBLE sovmestno budut nazyvat'sya plavayushchimi tipami. Krome osnovnyh arifmeticheskih tipov sushchestvuet konceptu- al'no beskonechnyj klass proizvodnyh tipov, kotorye obrazuyut- sya iz osnovnyh tipov sleduyushchim obrazom: massivy ob容ktov bol'shinstva tipov; funkcii, kotorye vozvrashchayut ob容kty zadannogo tipa; ukazateli na ob容kty dannogo tipa; struktury, soderzhashchie posledovatel'nost' ob容ktov razlichnyh tipov; ob容dineniya, sposobnye soderzhat' odin iz neskol'kih ob容ktov razlichnyh tipov. Voobshche govorya, eti metody postroeniya ob容ktov mogut pri- menyat'sya rekursivno. 13. Ob容kty i L-znacheniya Ob容kt yavlyaetsya dostupnym obrabotke uchastkom pamyati; L-znachenie - eto vyrazhenie, ssylayushcheesya na ob容kt. Ochevidnym primerom vyrazheniya L-znacheniya yavlyaetsya identifikator. Sushches- tvuyut operacii, rezul'tatom kotoryh yavlyayutsya L-znacheniya; es- li, naprimer, E - vyrazhenie ukazannogo tipa, to *E yavlyaetsya vyrazheniem L-znacheniya, ssylayushchimsya na ob容kt E. Nazvanie "L-znachenie" proishodit ot vyrazheniya prisvaivaniya E1=E2, v kotorom levaya chast' dolzhna byt' vyrazheniem L-znacheniya. Pri posleduyushchem obsuzhdenii kazhdoj operacii budet ukazyvat'sya, ozhidaet li ona operandov L-znacheniya i vydaet li ona L-znache- nie. 14. Preobrazovaniya Ryad operacij mozhet v zavisimosti ot svoih operandov vy- zyvat' preobrazovanie znachenie operanda iz odnogo tipa v drugoj. V etom razdele ob座asnyayutsya rezul'taty, kotorye sle- duet ozhidat' ot takih preobrazovanij. V p. 14.6 Podvodyatsya itogi preobrazovanij, trebuemye bol'shinstvom obychnyh opera- cij; eti svedeniya dopolnyayutsya neobhodimym obrazom pri obsuzh- denii kazhdoj operacii. 14.1. Simvoly i celye Simvol ili korotkoe celoe mozhno ispol'zovat' vsyudu, gde mozhno ispol'zovat' celoe. Vo vseh sluchayah znachenie preobra- zuetsya k celomu. Preobrazovanie bolee korotkogo celogo k bo- lee dlinnomu vsegda soprovozhdaetsya znakovym rasshireniem; ce- lye yavlyayutsya velichinami so znakom. Osushchestvlyaetsya ili net znakovoe rasshirenie dlya simvolov, zavisit ot ispol'zuemoj mashiny, no garantiruetsya, chto chlen standartnogo nabora sim- volov neotricatelen. iz vseh mashin, rassmatrivaemyh v etom rukovodstve, tol'ko PDP-11 osushchestvlyaet znakovoe rasshirenie. oblast' znachenij simvol'nyh peremennyh na PDP-11 menyaetsya ot -128 do 127; simvoly iz nabora ASC11 imeyut polozhitel'nye znacheniya. Simvol'naya konstanta, zadannaya s pomoshch'yu vos'me- richnoj uslovnoj posledovatel'nosti, podvergaetsya znakovomu rasshireniyu i mozhet okazat'sya otricatel'noj; naprimer, '\377' imeet znachenie -1. Kogda bolee dlinnoe celoe preobrazuetsya v bolee korotkoe ili v CHAR, ono obrezaetsya sleva; lishnie bity prosto otbra- syvayutsya. 14.2. Tipy FLOAT i DOUBLE Vsya plavayushchaya arifmetika v "C" vypolnyaetsya s dvojnoj tochnost'yu kazhdyj raz, kogda ob容kt tipa FLOAT poyavlyaetsya v vyrazhenii, on udlinyaetsya do DOUBLE posredstvom dobavleniya nulej v ego drobnuyu chast'. kogda ob容kt tipa DOUBLE dolzhen byt' preobrazovan k tipu FLOAT, naprimer, pri prisvaivanii, pered usecheniem DOUBLE okruglyaetsya do dliny FLOAT. 14.3. Plavayushchie i celochislennye velichiny Preobrazovanie plavayushchih znachenij k celochislennomu tipu imeet tendenciyu byt' do nekotoroj stepeni mashinno-zavisimym; v chastnosti napravlenie usecheniya otricatel'nyh chisel menyaet- sya ot mashine k mashine. Rezul'tat ne opredelen, esli znachenie ne pomeshchaetsya v predostavlyaemoe prostranstvo. Preobrazovanie celochislennyh znachenij v plavayushchie vypol- nyaetsya bez oslozhnenij. Mozhet proizojti nekotoraya poterya toch- nosti, esli dlya rezul'tata ne soderzhitsya dostatochnogo koli- chestva bitov. 14.4. Ukazateli i celye Celoe ili dlinnoe celoe mozhet byt' pribavleno k ukazate- lyu ili vychteno iz nego; v etom sluchae pervaya velichina preob- razuetsya tak, kak ukazyvaetsya v razdele opisaniya operacii slozheniya. Dva ukazatelya na ob容kty odinakovogo tipa mogut byt' vychteny; v etom sluchae rezul'tat preobrazuetsya k celomu, kak ukazyvaetsya v razdele opisaniya operacii vychitaniya. 14.5. Celoe bez znaka Vsyakij raz, kogda celoe bez znaka ob容dinyaetsya s prostym celym, prostoe celoe preobrazuetsya v celoe bez znaka i re- zul'tat okazyvaetsya celym bez znaka. Znacheniem yavlyaetsya nai- men'shee celoe bez znaka, sootvetstvuyushchee celomu so znakom (po modulyu 2**razmer slova). V dvoichnom dopolnitel'nom pred- stavlenii eto preobrazovanie yavlyaetsya chisto umozritel'nym i ne izmenyaet fakticheskuyu kombinaciyu bitov. Kogda celoe bez znaka preobrazuetsya k tipu LONG, znache- nie rezul'tata sovpadaet so znacheniem celogo bez znaka. Ta- kim obrazom, eto preobrazovanie svoditsya k dobavleniyu nulej sleva. 14.6. Arifmeticheskie preobrazovaniya Podavlyayushchee bol'shinstvo operacij vyzyvaet preobrazovanie i opredelyaet tipy rezul'tata analogichnym obrazom. Privodimaya nizhe shema v dal'nejshem budet nazyvat'sya "obychnymi arifmeti- cheskimi preobrazovaniyami". Snachala lyubye operandy tipa CHAR ili SHORT preobrazuyutsya v INT, a lyubye operandy tipa FLOAT preobrazuyutsya v DOUBLE. Zatem, esli kakoj-libo operand imeet tip DOUBLE, to drugoj preobrazuetsya k tipu DOUBLE, i eto budet tipom rezul'tata. V protivnom sluchae, esli kakoj-libo operand imeet tip LONG, to drugoj operand preobrazuetsya k tipu LONG, i eto i budet tipom rezul'tata. V protivnom sluchae, esli kakoj-libo operand imeet tip UNSIGNED, to drugoj operand preobrazuetsya k tipu UNSIGNED, i eto budet tipom rezul'tata. V protivnom sluchae oba operanda budut imet' tip INT, i eto budet tipom rezul'tata. 15. Vyrazheniya Starshinstvo operacij v vyrazheniyah sovpadaet s poryadkom sledovaniya osnovnyh podrazdelov nastoyashchego razdela, nachinaya s samogo vysokogo urovnya starshinstva. Tak, naprimer, vyrazhe- niyami, ukazyvaemymi v kachestve operandov operacii + (p.15.4), YAvlyayutsya vyrazheniya, opredelennye v p.p.15.1-15.3. Vnutri kazhdogo podrazdela operacii imeet odinakovoe starshin- stvo. V kazhdom podrazdele dlya opisyvaemyh tam operacij uka- zyvaetsya ih associativnost' sleva ili sprava. Starshinstvo i associativnost' vseh operacij v vyrazheniyah rezyumiruyutsya v grammaticheskoj svodke v p.18. V protivnom sluchae poryadok vychislenij vyrazhenij ne opre- delen. V chastnosti, kompilyator schitaet sebya v prave vychis- lyat' podvyrazheniya v tom poryadke, kotoryj on nahodit naibolee effektivnym, dazhe esli eti podvyrazheniya privodyat k pobochnym effektam. Poryadok, v kotorom proishodyat pobochnye effekty, ne specificiruetsya. Vyrazheniya, vklyuchayushchie kommutativnye i asso- ciativnye operacii ( *,+,&,!,^ ), mogut byt' pereuporyadocheny proizvol'nym obrazom dazhe pri nalichii kruglyh skobok; chtoby vynudit' opredelennyj poryadok vychislenij, v etom sluchae ne- obhodimo ispol'zovat' yavnye promezhutochnye peremennye. Pri vychislenii vyrazhenij obrabotka perepolneniya i pro- verka pri delenii yavlyayutsya mashinno-zavisimymi. Vse sushchestvu- yushchie realizacii yazyka "C" ignoriruyut perepolnenie celyh; ob- rabotka situacij pri delenii na 0 i pri vseh osobyh sluchayah s plavayushchimi chislami menyaetsya ot mashiny k mashine i obychno vypolnyaetsya s pomoshch'yu bibliotechnoj funkcii. 15.1. Pervichnye vyrazheniya Pervichnye vyrazheniya, vklyuchayushchie ., ->, indeksaciyu i ob- rashcheniya k funkciyam, gruppiruyutsya sleva napravo. Pervichnoe vyrazhenie: identifikator konstanta stroka (vyrazhenie) pervichnoe-vyrazhenie [vyrazhenie] pervichnoe-vyrazhenie (spisok-vyrazhenij neo pervichnoe-L-znachenie . Identifikator pervichnoe-vyrazhenie -> identifikator spisok-vyrazhenij: vyrazhenie spisok-vyrazhenij, vyrazhenie Identifikator yavlyaetsya pervichnym vyrazheniem pri uslovii, chto on opisan podhodyashchim obrazom, kak eto obsuzhdaetsya nizhe. tip identifikatora opredelyaetsya ego opisaniem. Esli, odnako, ti- pom identifikatora yavlyaetsya "massiv ...", to znacheniem vyra- zheniya, sostoyashchego iz etogo identifikatora , yavlyaetsya ukaza- tel' na pervyj ob容kt v etom massive, a tipom vyrazheniya bu- det "ukazatel' na ...". Bolee togo, identifikator massiva ne yavlyaetsya vyrazheniem L-znacheniya. podobnym obrazom identifika- tor, kotoryj opisan kak "funkciya, vozvrashchayushchaya ...", za isk- lyucheniem togo sluchaya, kogda on ispol'zuetsya v pozicii imeni funkcii pri obrashchenii, preobrazuetsya v "ukazatel' na funk- ciyu, kotoraya vozvrashchaet ...". Konstanta yavlyaetsya pervichnym vyrazheniem. V zavisimosti ot ee formy tipom konstanty mozhet byt' INT, LONG ili DOUBLE. Stroka yavlyaetsya pervichnym vyrazheniem. Ishodnym ee tipom yavlyaetsya "massiv simvolov"; no sleduya tem zhe samym pravilam, kotorye privedeny vyshe dlya identifikatorov, on modificiruet- sya v "ukazatel' na simvoly", i rezul'tatom yavlyaetsya ukaza- tel' na pervyj simvol stroki. (imeetsya isklyuchenie v nekoto- ryh inicializatorah; sm. P. 16.6.) Vyrazhenie v kruglyh skobkah yavlyaetsya pervichnym vyrazheni- em, tip i znachenie kotorogo identichny tipu i znacheniyu etogo vyrazheniya bez skobok. Nalichie kruglyh skobok ne vliyaet na to, yavlyaetsya li vyrazhenie L-znacheniem ili net. Pervichnoe vyrazhenie, za kotorym sleduet vyrazhenie v kvadratnyh skobkah, yavlyaetsya pervichnym vyrazheniem. Intuitiv- no yasno, chto eto vyrazhenie s indeksom. Obychno pervichnoe vy- razhenie imeet tip "ukazatel' na ...", indeksnoe vyrazhenie imeet tip INT, a tipom rezul'tata yavlyaetsya "...". Vyrazhenie E1[E2] po opredeleniyu identichno vyrazheniyu * ((E1) + (E2)). Vse, chto neobhodimo dlya ponimaniya etoj zapisi, soderzhitsya v etom razdele; voprosy, svyazannye s ponyatiem identifikatorov i operacij * i + rassmatrivayutsya v p.p. 15.1, 15.2 I 15.4 sootvetstvenno; vyvody summiruyutsya nizhe v p. 22.3. Obrashchenie k funkcii yavlyaetsya pervichnym vyrazheniem, za kotorym sleduet zaklyuchennyj v kruglye skobki vozmozhno pustoj spisok vyrazhenij, razdelennyh zapyatymi, kotorye i predstav- lyayut soboj fakticheskie argumenty funkcii. Pervichnoe vyrazhe- nie dolzhno byt' tipa "funkciya, vozvrashchayushchaya ...", a rezul'- tat obrashcheniya k funkcii imeet tip "...". Kak ukazyvaetsya ni- zhe, ranee ne vstrechavshchijsya identifikator, za kotorym nepos- redstvenno sleduet levaya kruglaya skobka, schitaetsya opisannym po kontekstu, kak predstavlyayushchij funkciyu, vozvrashchayushchuyu ce- loe; sledovatel'no chashche vsego vstrechayushchijsya sluchaj funkcii, vozvrashchayushchej celoe znachenie, ne nuzhdaetsya v opisanii. Pered obrashcheniem lyubye fakticheskie argumenty tipa FLOAT preobrazuyutsya k tipu DOUBLE, lyubye argumenty tipa CHAR ili SHORT preobrazuyutsya k tipu INT, i, kak obychno, imena massi- vov preobrazuyutsya v ukazateli. Nikakie drugie preobrazovaniya ne vypolnyayutsya avtomaticheski; v chastnosti, ne sravnivaet ti- py fakticheskih argumentov s tipami formal'nyh argumentov. Esli preobrazovanie neobhodimo, ispol'zujte yavnyj perevod tipa (CAST); sm. P.p. 15.2, 16.7. Pri podgotovke k vyzovu funkcii delaetsya kopiya kazhdogo fakticheskogo parametra; takim obrazom, vse peredachi argumen- tov v yazyke "C" osushchestvlyayutsya strogo po znacheniyu. funkciya mozhet izmenyat' znacheniya svoih formal'nyh parametrov, no eti izmeneniya ne vliyayut na znacheniya fakticheskih parametrov. S drugoj strony imeetsya vozmozhnost' peredavat' ukazatel' pri takom uslovii, chto funkciya mozhet izmenyat' znachenie ob容kta, na kotoryj etot ukazatel' ukazyvaet. Poryadok vychisleniya ar- gumentov v yazyke ne opredelen; obratite vnimanie na to, chto razlichnye kompilyatory vychislyayut po raznomu. Dopuskayutsya rekursivnye obrashcheniya k lyuboj funkcii. Pervichnoe vyrazhenie, za kotorym sleduet tochka i identi- fikator, yavlyaetsya vyrazheniem. Pervoe vyrazhenie dolzhno byt' L-znacheniem, imenuyushchim strukturu ili ob容dinenie, a identi- fikator dolzhen byt' imenem chlena struktury ili ob容dineniya. Rezul'tatom yavlyaetsya L-znachenie, ssylayushcheesya na poimenovan- nyj chlen struktury ili ob容dineniya. Pervichnoe vyrazhenie, za kotorym sleduet strelka (sostav- lennaya iz znakov - i >) i identifikator, yavlyaetsya vyrazheni- em. pervoe vyrazhenie dolzhno byt' ukazatelem na strukturu ili ob容dinenie, a identifikator dolzhen imenovat' chlen etoj struktury ili ob容dineniya. Rezul'tatom yavlyaetsya L-znachenie, ssylayushcheesya na poimenovannyj chlen struktury ili ob容dineniya, na kotoryj ukazyvaet ukazatel'noe vyrazhenie. Sledovatel'no, vyrazhenie E1->MOS yavlyaetsya tem zhe samym, chto i vyrazhenie (*E1).MOS. Struktury i ob容dineniya rassmat- rivayutsya v p. 16.5. Privedennye zdes' pravila ispol'zovaniya struktur i ob容dinenij ne navyazyvayutsya strogo, dlya togo chto- by imet' vozmozhnost' obojti mehanizm tipov. Sm. P. 22.1. 15.2. Unarnye operacii Vyrazhenie s unarnymi operaciyami gruppiruetsya spravo na- levo. Unarnoe-vyrazhenie: * vyrazhenie & L-znachenie - vyrazhenie ! Vyrazhenie \^ vyrazhenie ++ L-znachenie -- L-znachenie L-znachenie ++ L-znachenie -- (imya-tipa) vyrazhenie SIZEOF vyrazhenie SIZEOF imya-tipa Unarnaya operaciya * oznachaet kosvennuyu adresaciyu: vyrazhe- nie dolzhno byt' ukazatelem, a rezul'tatom yavlyaetsya L-znache- nie, ssylayushcheesya na tot ob容kt, na kotoryj ukazyvaet vyrazhe- nie. Esli tipom vyrazheniya yavlyaetsya "ukazatel' na...", to ti- pom rezul'tata budet "...". Rezul'tatom unarnoj operacii & yavlyaetsya ukazatel' na ob容kt, k kotoromu ssylaetsya L-znachenie. Esli L-znachenie imeet tip "...", to tipom rezul'tata budet "ukazatel' na ...". Rezul'tatom unarnoj operacii - (minus) yavlyaetsya ee ope- rand, vzyatyj s protivopolozhnym znakom. Dlya velichiny tipa UNSIGNED rezul'tat poluchaetsya vychitaniem ee znacheniya iz 2**N (dva v stepeni N), gde N-chislo bitov v INT. Unarnoj operacii + (plyus) ne sushchestvuet. Rezul'tatom operacii logicheskogo otricaniya ! YAvlyaetsya 1, esli znachenie ee operanda ravno 0, i 0, esli znachenie ee operanda otlichno ot nulya. Rezul'tat imeet tip INT. |ta ope- raciya primenima k lyubomu arifmeticheskomu tipu ili ukazate- lyam. Operaciya \^ daet obratnyj kod, ili dopolnenie do edini- cy, svoego operanda. Vypolnyayutsya obychnye arifmeticheskie pre- obrazovaniya. Operand dolzhen byt' celochislennogo tipa. Ob容kt, na kotoryj ssylaetsya operand L-znacheniya prefiks- noj operacii ++, uvelichivaetsya. znacheniem yavlyaetsya novoe znachenie operanda, no eto ne L-znachenie. Vyrazhenie ++h ekvi- valentno h+=1. Informaciyu o preobrazovaniyah smotri v razbore operacii slozheniya (p. 15.4) i operacii prisvaivaniya (p. 15.14). Prefiksnaya operaciya -- analogichna prefiksnoj operacii ++, no privodit k umen'sheniyu svoego operanda L-znacheniya. Pri primenenii postfiksnoj operacii ++ k L-znacheniyu re- zul'tatom yavlyaetsya znachenie ob容kta, na kotoryj ssylaetsya L-znachenie. Posle togo, kak rezul'tat prinyat k svedeniyu, ob容kt uvelichivaetsya tochno takim zhe obrazom, kak i v sluchae prefiksnoj operacii ++. Rezul'tat imeet tot zhe tip, chto i vyrazhenie L-znacheniya. Pri primenenii postfiksnoj operacii -- k L-znacheniyu re- zul'tatom yavlyaetsya znachenie ob容kta, na kotoryj ssylaetsya L-znachenie. Posle togo, kak rezul'tat prinyat k svedeniyu, ob容kt umen'shaetsya tochno takim zhe obrazom, kak i v sluchae prefiksnoj operacii --. Rezul'tat imeet tot zhe tip, chto i vyrazhenie L-znacheniya. Zaklyuchennoe v kruglye skobki imya tipa dannyh,stoyashchee pe- red vyrazheniem , vyzyvaet preobrazovanie znacheniya etogo vy- razheniya k ukazannomu tipu. |ta konstrukciya nazyvaetsya pere- vod (CAST). Imena tipov opisyvayutsya v p. 16.7. Operaciya SIZEOF vydaet razmer svoego operanda v bajtah. (Ponyatie bajt v yazyke ne opredeleno, razve tol'ko kak znache- nie operacii SIZEOF. Odnako vo vseh sushchestvuyushchih realizaciyah bajtom yavlyaetsya prostranstvo, neobhodimoe dlya hraneniya ob容kta tipa CHAR). Pri primenenii k massivu rezul'tatom yav- lyaetsya polnoe chislo bajtov v massive. Razmer opredelyaetsya iz opisanij ob容ktov v vyrazhenii. |to vyrazhenie semanticheski yavlyaetsya celoj konstantoj i mozhet byt' ispol'zovano v lyubom meste, gde trebuetsya konstanta. Osnovnoe primenenie eta ope- raciya nahodit pri svyazyah s procedurami, podobnym raspredeli- telyam pamyati, i v sistemah vvoda- vyvoda. Operaciya SIZEOF mozhet byt' takzhe primenena i k zaklyuchen- nomu v kruglye skobki imeni tipa. V etom sluchae ona vydaet razmer v bajtah ob容kta ukazannogo tipa. Konstrukciya SIZEOF (tip) rassmatrivaetsya kak celoe, tak chto vyrazhenie SIZEOF (tip) - 2 ekvivalentno vyrazheniyu (SIZEOF (tip)9 - 2. 15.3. Mul'tiplikativnye operacii Mul'tiplikativnye operacii *, /, i % gruppiruyutsya sleva napravo. Vypolnyayutsya obychnye arifmeticheskie preobrazovaniya. Mul'tiplikativnoe-vyrazhenie: vyrazhenie * vyrazhenie vyrazhenie / vyrazhenie vyrazhenie % vyrazhenie Binarnaya operaciya * oznachaet umnozhenie. Operaciya * asso- ciativna, i vyrazheniya s neskol'kimi umnozheniyami na odnom i tom zhe urovne mogut byt' peregruppirovany kompilyatorom. Binarnaya operaciya / oznachaet delenie. Pri delenii polo- zhitel'nyh celyh osushchestvlyaetsya usechenie po napravleniyu k nu- lyu, no esli odin iz operandov otricatelen, to forma usecheniya zavisit ot ispol'zuemoj mashiny. Na vseh mashinah, ohvatyvae- myh nastoyashchim rukovodstvom, ostatok imeet tot zhe znak , chto i delimoe. Vsegda spravedlivo, chto (A/B)*B+A%B ravno A (esli B ne ravno 0). Binarnaya operaciya % vydaet ostatok ot deleniya pervogo vyrazheniya na vtoroe. Vypolnyayutsya obychnye arifmeticheskie pre- obrazovaniya. Operandy ne dolzhny byt' tipa FLOAT. 15.4. Additivnye operacii Additivnye operacii + i - gruppiruyutsya sleva napravo. vypolnyayutsya obychnye arifmeticheskie preobrazovaniya. Dlya kazh- doj operacii imeyutsya nekotorye dopolnitel'nye vozmozhnosti, svyazannye s tipami operandov. Additivnoe-vyrazhenie: vyrazhenie + vyrazhenie vyrazhenie - vyrazhenie Rezul'tatom operacii + yavlyaetsya summa operandov. Mozhno skla- dyvat' ukazatel' na ob容kt v massive i znachenie lyubogo celo- chislennogo tipa. vo vseh sluchayah poslednee preobrazuetsya v adresnoe smeshchenie posredstvom umnozheniya ego na dlinu ob容k- ta, na kotoryj ukazyvaet etot ukazatel'. Rezul'tatom yavlyaet- sya ukazatel' togo zhe samogo tipa, chto i ishodnyj ukazatel', kotoryj ukazyvaet na drugoj ob容kt v tom zhe massive, smeshchen- nyj sootvetstvuyushchim obrazom otnositel'no pervonachal'nogo ob容kta. Takim obrazom, esli P yavlyaetsya ukazatelem ob容kta v massive, to vyrazhenie P+1 yavlyaetsya ukazatelem na sleduyushchij ob容kt v etom massive. Nikakie drugie kombinacii tipov dlya ukazatelej ne razre- shayutsya. Operaciya + associativna, i vyrazhenie s neskol'kimi slo- zheniyami na tom zhe samom urovne mogut byt' pereuporyadocheny kompilyatorom. Rezul'tatom operacii - yavlyaetsya raznost' operandov. Vy- polnyayutsya obychnye arifmeticheskie preobrazovaniya. Krome togo, iz ukazatelya mozhet byt' vychteno znachenie lyubogo celochislen- nogo tipa, prichem, provodyatsya te zhe samye preobrazovaniya, chto i pri operacii slozheniya. Esli vychitayutsya dva ukazatelya na ob容kty odinakovogo ti- pa, to rezul'tat preobrazuetsya (deleniem na dlinu ob容kta) k tipu INT, predstavlyaya soboj chislo ob容ktov, razdelyayushchih uka- zyvaemye ob容kty. Esli eti ukazateli ne na ob容kty iz odnogo i togo zhe massiva, to takoe preobrazovanie, voobshche govorya, dast neozhidannye rezul'taty, potomu chto dazhe ukazateli na ob容kty odinakovogo tipa ne obyazany otlichat'sya na velichinu, kratnuyu dline ob容kta. 15.5. Operacii sdviga Operacii sdviga << i >> gruppiruyutsya sleva napravo. Dlya obeih operacij provodyatsya obychnye arifmeticheskie preobrazo- vaniya ih operandov, kazhdyj iz kotoryh dolzhen byt' celochis- lennogo tipa. Zatem pravyj operand preobrazuetsya k tipu INT; rezul'tat imeet tip levogo operanda. Rezul'tat ne opredelen, esli pravyj operand otricatelen ili bol'she ili raven, chem dlina ob容kta v bitah. Vyrazhenie-sdviga: vyrazhenie << vyrazhenie vyrazhenie >> vyrazhenie Znacheniem vyrazheniya E1<<E2 yavlyaetsya E1 (interpretiruemoe kak kombinaciya bitov), sdvinutoe vlevo na E2 bitov; osvobozhdayu- shchiesya bity zapolnyayutsya nulem. znacheniem vyrazheniya E1>>E2 yav- lyaetsya E1, sdvinutoe vpravo na E2 bitovyh pozicij. Esli E1 imeet tip UNSIGNE, to sdvig vpravo garantirovanno budet lo- gicheskim (zapolnenie nulem); v protivnom sluchae sdvig mozhet byt' (i tak i est' na PDP-11) arifmeticheskim (osvobozhdayushchie- sya bity zapolnyayutsya kopiej znakovogo bita). 15.6. Operacii otnosheniya Operacii otnosheniya gruppiruyutsya sleva napravo, no etot fakt ne ochen' polezen; vyrazhenie A<B<C ne oznachaet togo, chto ono kazalos' by dolzhno oznachat'. Vyrazhenie-otnosheniya: vyrazhenie < vyrazhenie vyrazhenie > vyrazhenie vyrazhenie <= vyrazhenie vyrazhenie >= vyrazhenie Operacii < (men'she), > (bol'she), <= (men'she ili ravno) i >= (bol'she ili ravno) vse dayut 0, esli ukazannoe otnoshenie lozh- no, i 1, esli ono istinno. Rezul'tat imeet tip ITN. Vypolnya- yutsya obychnye arifmeticheskie preobrazovaniya. Mogut sravni- vat'sya dva ukazatelya; rezul'tat zavisit ot otnositel'nogo raspolozheniya ukazyvaemyh ob容ktov v adresnom prostranstve. Sravnenie ukazatelej perenosimo tol'ko v tom sluchae, esli ukazateli ukazyvayut na ob容kty iz odnogo i togo zhe massiva. 15.7. Operacii ravenstva Vyrazhenie-ravenstva: vyrazhenie == vyrazhenie vyrazhenie != vyrazhenie Operacii == (ravno) i != (ne ravno) v tochnosti analogichny operaciyam otnosheniya, za isklyucheniem togo, chto oni imeyut bo- lee nizkij uroven' starshinstva. (Poetomu znachenie vyrazheniya A<B==C<D ravno 1 vsyakij raz, kogda vyrazhenie A<B i C<D imeyut odinakovoe znachenie istinnosti). Ukazatel' mozhno sravnivat' s celym, no rezul'tat budet mashinno- nezavisimym tol'ko v tom sluchae, esli celym yavlyaet- sya konstanta 0. Garantiruetsya, chto ukazatel', kotoromu pris- voeno znachenie 0, ne ukazyvaet ni na kakoj ob容kt i na samom dele okazyvaetsya ravnym 0; obshcheprinyato schitat' takoj ukaza- tel' nulem. 15.8. Pobitovaya operaciya 'i' Vyrazhenie-i: vyrazhenie & vyrazhenie Operaciya & yavlyaetsya associativnoj, i vklyuchayushchie & vyrazheniya mogut byt' pereuporyadocheny. Vypolnyayutsya obychnye arifmetiches- kie preobrazovaniya; rezul'tatom yavlyaetsya pobitovaya funkciya 'i' operandov. |ta operaciya primenima tol'ko k operandam ce- lochislennogo tipa. 15.9. Pobitovaya operaciya isklyuchayushchego 'ili' Vyrazhenie-isklyuchayushchego-ili: vyrazhenie ^ vyrazhenie Operaciya ^ yavlyaetsya associativnoj, i vklyuchayushchie ^ vyrazheniya mogut byt' pereuporyadocheny. vypolnyayutsya obychnye arifmetiches- kie preobrazovaniya; rezul'tatom yavlyaetsya pobitovaya funkciya isklyuchayushchego 'ili' operandov. Operaciya primenima tol'ko k operandam celochislennogo tipa. 15.10. Pobitovaya operaciya vklyuchayushchego 'ili' Vyrazhenie-vklyuchayushchego-ili: vyrazhenie \! Vyrazhenie Operaciya \! YAvlyaetsya associativnoj, i soderzhashchie \! Vyrazhe- niya mogut byt' pereuporyadocheny. vypolnyayutsya obychnye arifme- ticheskie preobrazovaniya; rezul'tatom yavlyaetsya pobitovaya fun- kciya vklyuchayushchego 'ili' operandov. Operaciya primenima tol'ko k operandam celochislennogo tipa. 15.11. Logicheskaya operaciya 'i' Vyrazhenie-logicheskogo-i: vyrazhenie && vyrazhenie Operaciya && gruppiruetsya sleva napravo. Ona vozvrashchaet 1, esli oba ee operanda otlichny ot nulya, i 0 v protivnom slu- chae. V otlichie ot & operaciya && garantiruet vychislenie sleva napravo; bolee togo, esli pervyj operand raven 0, to znache- nie vtorogo operanda voobshche ne vychislyaetsya. Operandy ne obyazany byt' odinakovogo tipa, no kazhdyj iz nih dolzhen byt' libo odnogo iz osnovnyh tipov, libo ukazate- lem. rezul'tat vsegda imeet tip ITN. 15.12. Operaciya logicheskogo 'ili' Vyrazhenie-logicheskogo-ili: vyrazhenie \!\! vyrazhenie Operaciya \!\! Gruppiruetsya sleva napravo. Ona vozvrashchaet 1, esli odin iz operandov otlichen ot nulya, i 0 v protivnom slu- chae. V otlichie ot operacii \! Operaciya \!\! Garantiruet vy- chislenie sleva napravo; bolee togo, esli pervyj operand ot- lichen ot nulya, to znachenie vtorogo operanda voobshche ne vychis- lyaetsya. Operandy ne obyazany byt' odinakovogo tipa, no kazhdyj iz nih dolzhen byt' libo odnogo iz osnovnyh tipov, libo ukazate- lem. Rezul'tat vsegda imeet tip INT. 15.13. Uslovnaya operaciya Uslovnoe-vyrazhenie: vyrazhenie ? vyrazhenie : vyrazhenie Uslovnye vyrazheniya gruppiruyutsya slevo napravo. Vychislyaetsya znachenie pervogo vyrazheniya, i esli ono otlichno ot nulya, to rezul'tatom budet znachenie vtorogo vyrazheniya; v protivnom sluchae rezul'tatom budet znachenie tret'ego vyrazheniya. Esli eto vozmozhno, provodyatsya obychnye arifmeticheskie preobrazova- niya, s tem, chtoby privesti vtoroe i tret'e vyrazheniya k obshche- mu tipu; v protivnom sluchae, esli oba vyrazheniya yavlyayutsya ukazatelyami odinakovogo tipa, to rezul'tat imeet tot zhe tip; v protivnom sluchae odno vyrazhenie dolzhno byt' ukazatelem, a drugoe - konstantoj 0, i rezul'tat budet imet' tip ukazate- lya. Vychislyaetsya tol'ko odno iz vtorogo i tret'ego vyrazhenij. 15.14. Operaciya prisvaivaniya Imeetsya ryad operacij prisvaivaniya, kazhdaya iz kotoryh gruppiruetsya sleva napravo. Vse operacii trebuyut v kachestve svoego levogo operanda L-znachenie, a tipom vyrazheniya prisva- ivaniya yavlyaetsya tip ego levogo operanda. Znacheniem vyrazheniya prisvaivaniya yavlyaetsya znachenie, hranimoe v levom operande posle togo, kak prisvaivanie uzhe budet proizvedeno. Dve chas- ti sostavnoj operacii prisvaivaniya yavlyayutsya otdel'nymi lek- semami. Vyrazhenie-prisvaivaniya: L-znachenie = vyrazhenie L-znachenie += vyrazhenie L-znachenie -= vyrazhenie L-znachenie *= vyrazhenie L-znachenie /= vyrazhenie L-znachenie %= vyrazhenie L-znachenie >>= vyrazhenie L-znachenie <<= vyrazhenie L-znachenie &= vyrazhenie L-znachenie ^= vyrazhenie L-znachenie \!= vyrazhenie Kogda proizvoditsya prostoe prisvaivanie C'=', znachenie vyrazheniya zamenyaet znachenie ob容kta, na kotoroe ssylaetsya L-znachenie. Esli oba operanda imeyut arifmeticheskij tip, to pered prisvaivaniem pravyj operand preobrazuetsya k tipu le- vogo operanda. O svojstvah vyrazheniya vida E1 op = E2, gde Op - odna iz perechislennyh vyshe operacij, mozhno sdelat' vyvod, esli uchest', chto ono ekvivalentno vyrazheniyu E1 = E1 op (E2); od- nako vyrazhenie E1 vychislyaetsya tol'ko odin raz. V sluchae ope- racij += i -= levyj operand mozhet byt' ukazatelem, prichem pri etom (celochislennyj) pravyj operand preobrazuetsya takim obrazom, kak ob座asneno v p. 15.4; vse pravye operandy i vse otlichnye ot ukazatelej levye operandy dolzhny imet' arifmeti- cheskij tip. Ispol'zuemye v nastoyashchee vremya kompilyatory dopuskayut prisvaivanie ukazatelya celomu, celogo ukazatelyu i ukazatelya ukazatelyu drugogo tipa. takoe prisvaivanie yavlyaetsya chistym kopirovaniem bez kakih-libo preobrazovanij. Takoe upotreble- nie operacij prisvaivaniya yavlyaetsya neperenosimym i mozhet privodit' k ukazatelyam, kotorye pri ispol'zovanii vyzyvayut oshibki adresacii. Tem ne menee garantiruetsya, chto prisvaiva- nie ukazatelyu konstanty 0 daet nulevoj ukazatel', kotoryj mozhno otlichat' ot ukazatelya na lyuboj ob容kt. 15.15. Operaciya zapyataya Vyrazhenie-s-zapyatoj: vyrazhenie , vyrazhenie Para vyrazhenij, razdelennyh zapyatoj, vychislyaetsya sleva nap- ravo i znachenie levogo vyrazheniya otbrasyvaetsya. Tipom i zna- cheniem rezul'tata yavlyaetsya tip i znachenie pravogo operanda. |ta operaciya gruppiruetsya sleva napravo. V kontekste, gde zapyataya imeet special'noe znachenie, kak, naprimer, v spiske fakticheskih argumentov funkcij (p. 15.1) Ili v spiskah ini- cializatorov (p. 16.6), Operaciya zapyataya, opisyvaemaya v etom razdele, mozhet poyavlyat'sya tol'ko v kruglyh skobkah; napri- mer, funkciya F(A,(T=3,T+2),C) imeet tri argumenta, vtoroj iz kotoryh imeet znachenie 5. 16. Opisaniya Opisaniya ispol'zuyutsya dlya ukazaniya interpretacii, koto- ruyu yazyk "C" budet davat' kazhdomu identifikatoru; oni ne obyazatel'no rezerviruyut pamyat', sootvetstvuyushchuyu identifika- toru. Opisaniya imeyut formu Opisanie: specifikatory-opisaniya spisok-opisatelej neob; Opisateli v spiske opisatelej soderzhat opisyvaemye identifi- katory. Specifikatory opisaniya predstavlyayut soboj posledova- tel'nost' specifikatorov tipa i specifikatorov klassa pamya- ti. Specifikatory-opisaniya: specifikator-tipa specifikatory-opisaniya neob specifikator-klassa-pamyati specifikator-opisaniya neob spisok dolzhen byt' samosoglasovannym v smysle, opisyvaemom nizhe. 16.1. Specifikatory klassa pamyati Nizhe perechislyayutsya specifikatory klassa pamyati: Specifikator-klassa-pamyati: AUTO STATIC EXTERN REGISTER TYPEDEF Specifikator TYPEDEF ne realizuet pamyati i nazyvaetsya "specifikatorom klassa pamyati" tol'ko po sintaksicheskim so- obrazheniyam; eto obsuzhdaetsya v p. 16.8. Smysl razlichnyh klas- sov pamyati byl obsuzhden v p. 12. Opisaniya AUTO, STATIC i REGISTER sluzhat takzhe v kachestve opredelenij v tom smysle, chto oni vyzyvayut rezervirovanie nuzhnogo kolichestva pamyati. V sluchae EXTERN dolzhno prisutst- vovat' vneshnee opredelenie (p. 18) Ukazyvaemyh identifikato- rov gde-to vne funkcii, v kotoroj oni opisany. Opisanie REGISTER luchshe vsego predstavlyat' sebe kak opi- sanie AUTO vmeste s namekom kompilyatoru, chto opisannye takim obrazom peremennye budut chasto ispol'zovat'sya. |ffektivny tol'ko neskol'ko pervyh takih opisanij. Krome togo, v regis- trah mogut hranit'sya tol'ko peremennye opredelennyh tipov; na PDP-11 eto INT, CHAR ili ukazatel'. Sushchestvuet i drugoe ogranichenie na ispol'zovanie registrovyh peremennyh: k nim nel'zya primenyat' operaciyu vzyatiya adresa &. Pri razumnom is- pol'zovanii registrovyh opisanij mozhno ozhidat' polucheniya men'shih po razmeru i bolee bystryh programm, no uluchshenie v budushchem generirovaniya kodov mozhet sdelat' ih nenuzhnymi. Opisanie mozhet soderzhat' ne bolee odnogo specifikatora klassa pamyati. Esli opisanie ne soderzhit specifikatora klas- sa pamyati, to schitaetsya, chto on imeet znachenie AUTO, esli opisanie nahoditsya vnutri nekotoroj funkcii, i EXTERN v pro- tivnom sluchae. isklyuchenie: funkcii nikogda ne byvaet avtoma- ticheskimi. 16.2. Specifikatory tipa Nizhe perechislyayutsya specifikatory tipa. Specifikator-tipa: CHAR SHORT INT LONG UNSIGNED FLOAT DOUBLE specifikator-struktury-ili-ob容dineniya opredelyayushchee-tip-imya Slova LONG, SHORT i USIGNED mozhno rassmatrivat' kak pri- lagatel'nye; dopustimy sleduyushchie kombinacii: SHORT INT LONG INT USIGNED INT LONG FLOAT Poslednyaya kombinaciya oznachaet to zhe, chto i DOUBLE. V ostal'- nom opisanie mozhet soderzhat' ne bolee odnogo specifikatora tipa. Esli opisanie ne soderzhit specifikatora tipa, to schi- taetsya, chto on imeet znachenie INT. Specifikatory struktur i ob容dinenij obsuzhdayutsya v p. 16.5; Opisaniya s opredelyayushchimi tip imenami TYPEDEF obsuzhda- yutsya v p. 16.8. 16.3. Opisateli Vhodyashchij v opisanie spisok opisatelej predstavlyaet soboj posledovatel'nost' razdelennyh zapyatymi opisatelej, kazhdyj iz kotoryh mozhet imet' inicializator. Spisok-opisatelej: inicializiruemyj-opisatel' inicializiruemyj-opisatel', spisok-opisatelej inicializiruemyj-opisatel': opisatel'-inicializator neob Inicializatory opisyvayutsya v p. 16.6. Specifikatory i opisa- niya ukazyvayut tip i klass pamyati ob容ktov, na kotorye ssyla- yutsya opisateli. Opisateli imeyut sleduyushchij sintaksis: opisatel': identifikator ( opisatel' ) * opisatel' opisatel' () opisatel' [konstantnoe-vyrazhenie neob] Gruppirovanie takoe zhe kak i v vyrazheniyah. 16.4. Smysl opisatelej Kazhdyj opisatel' rassmatrivaetsya kak utverzhdenie togo, chto kogda konstrukciya toj zhe samoj formy, chto i opisatel', poyavlyaetsya v vyrazhenii, to ona vydaet ob容kt ukazannogo tipa i ukazannogo klassa pamyati. Kazhdyj opisatel' soderzhit rovno odin identifikator; eto imenno tot identifikator, kotoryj i opisyvaetsya. Esli v kachestve opisatelya poyavlyaetsya prosto identifika- tor, to on imeet tip, ukazyvaemyj v specificiruyushchem zagolov- ke opisaniya. Opisatel' v kruglyh skobkah identichen opisatelyu bez kruglyh skobok, no kruglye skobki mogut izmenyat' svyazi v sostavnyh opisatelyah. Primery smotri nizhe. Predstavim sebe opisanie T DI gde T - specifikator tipa (podobnyj INT i t.d.), a DI - opi- satel'. Predpolozhim, chto eto opisanie privodit k tomu, chto sootvetstvuyushchij identifikator imeet tip "...T", gde "..." pusto, esli DI prosto otdel'nyj identifikator (tak chto tip X v "INT X" prosto INT). Togda , esli DI imeet formu *D to soderzhashchijsya identifikator budet imet' tip "... Ukazatel' na T". Esli DI imeet formu D() to soderzhashchijsya identifikator imeet tip "... Funkciya, vozv- rashchayushchaya T". Esli DI imeet formu D[konstantnoe-vyrazhenie] ili D[ ] to soderzhashchijsya identifikator imeet tip "...massiv T". V pervom sluchae konstantnym vyrazheniem yavlyaetsya vyrazhenie, znachenie kotorogo mozhno opredelit' vo vremya kompilyacii i ko- toroe imeet tip INT. (Tochnoe opredelenie konstantnogo vyra- zheniya dano v p. 23). Kogda neskol'ko specifikacij vida "mas- siv iz" okazyvayutsya primykayushchimi, to sozdaetsya mnogomernyj massiv; konstantnoe vyrazhenie, zadayushchee granicy massivov, mozhet otsutstvovat' tol'ko u pervogo chlena etoj posledova- tel'nosti. Takoe opuskanie polezno, kogda massiv yavlyaetsya vneshnim i ego fakticheskoe opredelenie, kotoroe vydelyaet pa- myat', privoditsya v drugom meste. Pervoe konstantnoe vyrazhe- nie mozhet byt' opushcheno takzhe togda, kogda za opisatelem sle- duet inicializaciya. V etom sluchae razmer opredelyaetsya po chislu privedennyh inicializiruemyh elementov. Massiv mozhet byt' obrazovan iz elementov odnogo iz os- novnyh tipov, iz ukazatelej, iz struktur ili ob容dinenij ili iz drugih massivov (chtoby obrazovat' mnogomernyj massiv). Ne vse vozmozhnosti, kotorye razresheny s tochki zreniya ukazannogo vyshe sintaksisa, fakticheski dopustimy. Imeyutsya sleduyushchie ogranicheniya: funkcii ne mogut vozvrashchat' massivy, struktury, ob容dineniya ili funkcii, hotya oni mogut vozvra- shchat' ukazateli na takie veshchi; ne sushchestvuet massivov funk- cij, hotya mogut byt' massivy ukazatelej na funkcii. Analo- gichno, struktury ili ob容dineniya ne mogut soderzhat' funkciyu, no oni mogut soderzhat' ukazatel' na funkciyu. V kachestve primera rassmotrim opisanie INT I, *IP, F(), *FIP(), (*PFI)(); v kotorom opisyvaetsya celoe I, ukazatel' IP na celoe, funk- ciya F, vozvrashchayushchaya celoe, funkciya FIP, vozvrashchayushchaya ukaza- tel' na celoe, i ukazatel' PFI na funkciyu, kotoraya vozvrashcha- et celoe. Osobenno polezno sravnit' dva poslednih opisatelya. Svyaz' v *FIP() mozhno predstavit' v vide *(FIP()), tak chto opisaniem predpolagaetsya, a takoj zhe konstrukciej v vyrazhe- nii trebuetsya obrashchenie k funkcii FIP i posleduyushchee ispol'- zovanie kosvennoj adresacii dlya vydachi s pomoshch'yu poluchennogo rezul'tata (ukazatelya) celogo. V opisatele (*PFI)() dopolni- tel'nye skobki neobhodimy, poskol'ku oni tochno tak zhe, kak i v vyrazhenii, ukazyvayut, chto kosvennaya adresaciya cherez ukaza- tel' na funkciyu vydaet funkciyu, kotoraya zatem vyzyvaetsya; eta vyzvannaya funkciya vozvrashchaet celoe. V kachestve drugogo primera privedem opisanie FLOAT FA[17], *AFP[17]; v kotorom opisyvaetsya massiv chisel tipa FLOAT i massiv uka- zatelej na chisla tipa FLOAT. Nakonec, STATIC INT X3D[3][5][7]; opisyvaet staticheskij trehmernyj massiv celyh razmerom 3*5*7. bolee podrobno, X3D yavlyaetsya massivom iz treh elemen- tov; kazhdyj element yavlyaetsya massivom pyati massivov; kazhdyj poslednij massiv yavlyaetsya massivo