m iz semi celyh. Kazhdoe iz vyrazhenij X3D, X3D[I], X3D[I][J] i X3D[I][J][K] mozhet razum- nym obrazom poyavlyat'sya v vyrazheniyah. Pervye tri imeyut tip "massiv", poslednee imeet tip INT. 16.5. Opisanie struktur i ob容dinenij Struktura - eto ob容kt, sostoyashchij iz posledovatel'nosti imenovannyh chlenov. kazhdyj chlen mozhet byt' proizvol'nogo ti- pa. Ob容dinenie - eto ob容kt, kotoryj v dannyj moment mozhet soderzhat' lyuboj iz neskol'kih chlenov. Specifikatory i ob容dineniya imeyut odinakovuyu formu. Specifikator-struktury-ili-ob容dineniya struktura-ili-ob容dinenie \( spisok-opisanij-struktury\) identifikator struktury-ili-ob容dineniya \(spisok-opisanij-struktury\) identifikator struktury-ili-ob容dineniya Struktura-ili-ob容dinenie: STRUCT UNION Spisok-opisanij-struktury yavlyaetsya posledovatel'nost'yu opi- sanij chlenov struktury ili ob容dineniya: Spisok-opisanij-struktury: opisanie-struktury opisanie-struktury spisok-opisanij-struktury opisanie-struktury: specifikator-tipa spisok-opisatelej-struktury spisok-opisatelej-struktury: opisatel'-struktury opisatel'-struktury, spisok-opisatelej-struktury V obychnom sluchae opisatel' struktury yavlyaetsya prosto opisa- telem chlena struktury ili ob容dineniya. CHlen struktury mozhet takzhe sostoyat' iz specificirovannogo chisla bitov. Takoj chlen nazyvaetsya takzhe polem; ego dlina otdelyaetsya ot imeni polya dvoetochiem. Opisatel'-struktury: opisatel' opisatel': konstantnoe vyrazhenie : konstantnoe vyrazhenie Vnutri struktury opisannye v nej ob容kty imeyut adresa, koto- rye uvelichivayutsya v sootvetstvii s chteniem ih opisanij sleva napravo. Kazhdyj chlen struktury, kotoryj ne yavlyaetsya polem, nachinaetsya s adresnoj granicy, sootvetstvuyushchej ego tipu; sledovatel'no v strukture mogut okazat'sya neimenovannye dy- ry. CHleny, yavlyayushchiesya polyami, pomeshchayutsya v mashinnye celye; oni ne perekryvayut granicy slova. Pole, kotoroe ne umeshchaetsya v ostavshemsya v dannom slove prostranstve, pomeshchaetsya v sle- duyushchee slovo. Polya vydelyayutsya sprava nalevo na PDP-11 i sle- va napravo na drugih mashinah. Opisatel' struktury, kotoryj ne soderzhit opisatelya, a tol'ko dvoetochie i shirinu, ukazyvaet neimenovannoe pole, po- leznoe dlya zapolneniya svobodnogo prostranstva s cel'yu soot- vetstviya zadavaemyh izvne shemam. Special'nyj sluchaj neime- novannogo polya s shirinoj 0 ispol'zuetsya dlya ukazaniya o vy- ravnivanii sleduyushchego polya na granicu slova. Pri etom pred- polagaetsya, chto "sleduyushchee pole" dejstvietl'no yavlyaetsya po- lem, a ne obychnym chlenom struktury, poskol'ku v poslednem sluchae vyravnivanie osushchestvlyaetsya avtomaticheski. Sam yazyk ne nakladyvaet ogranichenij na tipy ob容ktov, opisannyh kak polya, no ot realizacij ne trebuetsya obespechi- vat' chto-libo otlichnoe ot celyh polej. Bolee togo, dazhe polya tipa INT mogut rassmatrivat'sya kak neimeyushchie znaka. Na PDP-11 polya ne imeyut znaka i mogut prinimat' tol'ko celye znacheniya. Vo vseh realizaciyah otsutstvuyut massivy polej i k polyam ne primenima operaciya vzyatiya adresa &, tak chto ne su- shchestvuet i ukazatelej na polya. Ob容dinenie mozhno predstavit' sebe kak strukturu, vse chleny kotoroj nachinayutsya so smeshcheniya 0 i razmer kotoroj dos- tatochen, chtoby soderzhat' lyuboj iz ee chlenov. V kazhdyj moment ob容dinenie mozhet soderzhat' ne bolee odnogo iz svoih chlenov. Specifikator struktury ili ob容dineniya vo vtoroj forme, t.e. Odin iz STRUCT identifikator \(spisok-opisanij-struktury\) UNION identifikator \(spisok-opisanij-struktury\) opisyvaet identifikator v kachestve yarlyka struktury (ili yar- lyka ob容dineniya) struktury, specificirovannoj etim spiskom. Posleduyushchee opisanie mozhet zatem ispol'zovat' tret'yu formu specifikatora, odin iz STRUCT identifikator UNION identifikator YArlyki struktur dayut vozmozhnost' opredeleniya struktur, koto- rye ssylayutsya na samih sebya; oni takzhe pozvolyayut neodnokrat- no ispol'zovat' privedennuyu tol'ko odin raz dlinnuyu chast' opisaniya. Zapreshchaetsya opisyvat' strukturu ili ob容dinenie, kotorye soderzhat obrazec samogo sebya, no struktura ili ob容dinenie mogut soderzhat' ukazatel' na strukturu ili ob容dinenie takogo zhe vida, kak oni sami. Imena chlenov i yarlykov mogut sovpadat' s imenami obychnyh peremennyh. Odnako imena yarlykov i chlenov dolzhny byt' vzaim- no razlichnymi. Dve struktury mogut imet' obshchuyu nachal'nuyu posledovatel'- nost' chlenov; eto oznachaet, chto tot zhe samyj chlen mozhet poya- vit'sya v dvuh razlichnyh strukturah, esli on imeet odinakovyj tip v obeih strukturah i esli vse predydushchie chleny obeih struktur odinakovy. (Fakticheski kompilyator tol'ko proveryaet, chto imya v dvuh razlichnyh strukturah imeet odinakovyj tip i odinakovoe smeshchenie, no esli predshestvuyushchie chleny otlichayut- sya, to konstrukciya okazyvaetsya neperenosimoj). Vot prostoj primer opisaniya struktury: STRUCT TNODE \( CHAR TWORD[20]; INT COUNT; STRUCT TNODE *LEFT; STRUCT TNODE *RIGHT; \); Takaya struktura soderzhit massiv iz 20 simvolov, celoe i dva ukazatelya na podobnye struktury. Kak tol'ko privedeno takoe opisanie, opisanie STRUCT TNODE S, *SP; govorit o tom, chto S yavlyaetsya strukturoj ukazannogo vida, a SP yavlyaetsya ukazatelem na strukturu ukazannogo vida. Pri na- lichii etih opisanij vyrazhenie SP->COUNT ssylaetsya k polyu COUNT struktury, na kotoruyu ukazyvaet SP; vyrazhenie S.LEFT ssylaetsya na ukazatel' levogo poddereva v strukture S, a vy- razhenie S.RIGHT->TWORD[0] ssylaetsya na pervyj simvol chlena TWORD pravogo poddereva iz S. 16.6. Inicializaciya Opisatel' mozhet ukazyvat' nachal'noe znachenie opisyvaemo- go identifikatora. Inicializator sostoit iz vyrazheniya ili zaklyuchennogo v figurnye skobki spiska znachenij, pered koto- rymi stavitsya znak =. Inicializator: = vyrazhenie = \(spisok-inicializatora\) = \(spisok-inicializatora,\) spisok-inicializatora: vyrazhenie spisok-inicializatora,spisok-inicializatora \(spisok-inicializatora\) Vse vyrazheniya, vhodyashchie v inicializator staticheskoj ili vneshnej peremennoj, dolzhny byt' libo konstantnymi vyrazheniya- mi, opisyvaemymi v p. 23, Libo vyrazheniyami, kotorye svodyatsya k adresu ranee opisannoj peremennoj, vozmozhno smeshchennomu na konstantnoe vyrazhenie. Avtomaticheskie i registrovye peremen- nye mogut byt' inicializirovany proizvol'nymi vyrazheniyami, vklyuchayushchimi konstanty i ranee opisannye peremennye i funk- cii. Garantiruetsya, chto neinicializirovannye staticheskie i vneshnie peremennye poluchayut v kachestve nachal'nyh znachenij 0;neinicializirovannye avtomaticheskie i registrovye peremen- nye v kachestve nachal'nyh znachenij soderzhat musor. Kogda inicializator primenyaetsya k skalyaru (ukazatelyu ili ob容ktu arifmeticheskogo tipa), to on sostoit iz odnogo vyra- zheniya, vozmozhno zaklyuchennogo v figurnye skobki. Nachal'noe znachenie ob容kta nahoditsya iz vyrazheniya; vypolnyayutsya te zhe samye preobrazovaniya, chto i pri prisvaivanii. Kogda opisyvaemaya peremennaya yavlyaetsya agregatom (struk- turoj ili massivom ), to inicializator sostoit iz zaklyuchen- nogo v figurnye skobki i razdelennogo zapyatymi spiska inici- alizatorov dlya chlenov agregata. |tot spisok sostavlyaetsya v poryadke vozrastaniya indeksa ili v sootvetstvii s poryadkom chlenov. Esli agregat soderzhit podagregaty, to eto pravilo primenyaetsya rekursivno k chlenam agregata. Esli kolichestvo inicializatorov v spiske okazyvaetsya men'she chisla chlenov ag- regata, to ostavshiesya chleny agregata zapolnyayutsya nulyami. Zapreshchaetsya inicializirovat' ob容dineniya ili avtomaticheskie agregaty. Figurnye skobki mogut byt' opushcheny sleduyushchim obrazom. Esli inicializator nachinaetsya s levoj figurnoj skobki, to posleduyushchij razdelennyj zapyatymi spisok inicializatorov ini- cializiruet chleny agregata; budet oshibkoj, esli v spiske okazhetsya bol'she inicializatorov, chem chlenov agregata. Esli odnako inicializator ne nachinaetsya s levoj figurnoj skobki, to iz spiska beretsya tol'ko nuzhnoe dlya chlenov dannogo agre- gata chislo elementov; ostavshiesya elementy ispol'zuyutsya dlya inicializacii sleduyushchego chlena agregata, chast'yu kotorogo yav- lyaetsya nastoyashchij agregat. Poslednee sokrashchenie dopuskaet vozmozhnost' inicializacii massiva tipa CHAR s pomoshch'yu stroki. V etom sluchae chleny mas- siva posledovatel'no inicializiruyutsya simvolami stroki. Naprimer, INT X[] = \(1,3,5\); opisyvaet i inicializiruet X kak odnomernyj massiv; poskol'- ku razmer massiva ne specificirovan, a spisok inicializitora soderzhit tri elementa, schitaetsya, chto massiv sostoit iz treh chlenov. Vot primer inicializacii s polnym ispol'zovaniem figur- nyh skobok: FLOAT *Y[4][3] = \( ( 1, 3, 5 ), ( 2, 4, 6 ), ( 3, 5, 7 ), \); Zdes' 1, 3 i 5 inicializiruyut pervuyu stroku massiva Y[0], a imenno Y[0][0], Y[0][1] i Y[0][2]. Analogichnym obrazom sle- duyushchie dve strochki inicializiruyut Y[1] i Y[2]. Inicializator zakanchivaetsya prezhdevremenno, i, sledovatel'no massiv Y[3] inicializiruetsya nulyami. V tochnosti takogo zhe effekta mozhno bylo by dostich', napisav FLOAT Y[4][3] = \( 1, 3, 5, 2, 4, 6, 3, 5, 7 \); Inicializator dlya Y nachinaetsya s levoj figurnoj skobki, no inicializatora dlya Y[0] net. Poetomu ispol'zuetsya 3 elementa iz spiska. Analogichno sleduyushchie tri elementa ispol'zuyutsya posledovatel'no dlya Y[1] i Y[2]. sleduyushchee opisanie FLOAT Y[4][3] = \( (1), (2), (3), (4) \); inicializiruet pervyj stolbec Y (esli ego rassmatrivat' kak dvumernyj massiv), a ostal'nye elementy zapolnyayutsya nulyami. I nakonec, opisanie CHAR MSG[] = "SYNTAX ERROR ON LINE %S\N"; demonstriruet inicializaciyu elementov simvol'nogo massiva s pomoshch'yu stroki. 16.7. Imena tipov V dvuh sluchayah (dlya yavnogo ukazaniya tipa preobrazovaniya v konstrukcii perevoda i dlya argumentov operacii SIZEOF) zhe- latel'no imet' vozmozhnost' zadavat' imya tipa dannyh. |to osushchestvlyaetsya s pomoshch'yu "imeni tipa", kotoroe po sushchestvu yavlyaetsya opisaniem ob容kta takogo tipa , v kotorom opushcheno imya samogo ob容kta. Imya tipa: specifikator-tipa abstraktnyj-opisatel' abstraktnyj-opisatel': pusto (abstraktnyj-opisatel') * abstraktnyj opisatel' abstraktnyj-opisatel' () abstraktnyj-opisatel' [konstantnoe vyrazhenie neob] Vo izbezhanii dvusmyslennosti v konstrukcii (abstraktnyj opisatel') trebuetsya, chtoby abstraktnyj-opisatel' byl nepust. Pri etom ogranichenii vozmozhno odnoznacheno opredelit' to mesto v abst- raktnom-opisatele, gde by poyavilsya identifikator, esli by eta konstrukciya byla opisatelem v opisanii. Imenovannyj tip sovpadaet togda s tipom gipoteticheskogo identifikatora. Nap- rimer, imena tipov INT INT * INT *[3] INT (*)[3] INT *() INT (*)() imenuyut sootvetstvenno tipy "celyj", "ukazatel' na celoe", "massiv iz treh ukazatelej na celoe", "ukazatel' na massiv iz treh celyh", " funkciya, vozvrashchayushchaya ukazatel' na celoe" i "ukazatel' na funkciyu, vozvrashchayushchuyu celoe". 16.8. TYPEDEF Opisaniya, v kotoryh "klass pamyati"specificirovan kak TYPEDEF, ne vyzyvayut vydeleniya pamyati. vmesto etogo oni op- redelyayut identifikatory ,kotorye pozdnee mozhno ispol'zovat' tak, slovno oni yavlyayutsya klyuchevymi slovami, imeyushchimi osnov- nye ili proizvodnye tipy. Opredelyayushchee-tip-imya identifikator V predelah oblasti dejstviya opisaniya so specifikatorom TYPEDEF kazhdyj identifikator, yavlyayushchijsya chast'yu lyubogo opi- satelya v etom opisanii, stanovitsya sintaksicheski ekvivalent- nym klyuchevomu slovu, imeyushchemu tot tip , kotoryj associiruet s identifikatorom v opisannom v p. 16.4 Smysle. Naprimer, posle opisanij TYPEDEF INT MILES, >KLICKSP; TYPEDEF STRUCT ( DOUBLE RE, IM; ) COMPLEX; konstrukcii MILES DISTANCE; EXTERN KLICKSP METRICP; COMPLEX Z, *ZP; stanovyatsya zakonnymi opisaniyami; pri etom tipom DISTANCE yav- lyaetsya INT, tipom METRICP - "ukazatel' na INT", tipom Z - specificirovannaya struktura i tipom ZP - ukazatel' na takuyu strukturu. Specifikator TYPEDEF ne vvodit kakih-libo sovershenno no- vyh tipov, a tol'ko opredelyaet sinonimy dlya tipov, kotorye mozhno bylo by specificirovat' i drugim sposobom. Tak v pri- vedennom vyshe primere peremennaya DISTANCE schitaetsya imeyushchej tochno takoj zhe tip, chto i lyuboj drugoj ob容kt, opisannyj v INT. 17. Operatory Za isklyucheniem osobo ogovarivaemyh sluchaev, operatory vypolnyayutsya posledovatel'no. 17.1. Operatornoe vyrazhenie Bol'shinstvo operatorov yavlyayutsya operatornymi vyrazheniya- mi, kotorye imeyut formu vyrazhenie; obychno operatornye vyrazheniya yavlyayutsya prisvaivaniyami ili ob- rashcheniyami k funkciyam. 17.2. Sostavnoj operator (ili blok) S tem chtoby dopustit' vozmozhnost' ispol'zovaniya neskol'- kih operatorov tam, gde ozhidaetsya prisutstvie tol'ko odnogo, predusmatrivaetsya sostavnoj operator (kotoryj takzhe i ekvi- valentno nazyvayut "blokom"): sostavnoj operator: \(spisok-opisanij spisok-operatorov neob neob\) spisok-opisanij: opisanie opisanie spisok-opisanij spisok-operatorov: operator operator spisok-operatorov Esli kakoj-libo identifikator iz spiska-opisanij byl opisan ranee, to vo vremya vypolneniya bloka vneshnee opisanie podav- lyaetsya i snova vstupaet v silu posle vyhoda iz bloka. Lyubaya inicializaciya avtomaticheskih i registracionnyh pe- remennyh provoditsya pri kazhdom vhode v blok cherez ego nacha- lo. V nastoyashchee vremya razreshaetsya (no eto plohaya praktika) peredavat' upravlenie vnutr' bloka; v takom sluchae eti ini- cializacii ne vypolnyayutsya. Inicializacii staticheskih pere- mennyh provodyatsya tol'ko odin raz, kogda nachinaetsya vypolne- nie programmy. Nahodyashchiesya vnutri bloka vneshnie opisaniya ne rezerviruyut pamyati, tak chto ih inicializaciya ne razreshaetsya. 17.3. Uslovnye operatory Imeyutsya dve formy uslovnyh operatorov: IF (vyrazhenie) operator IF (vyrazhenie) operator ELSE operator V oboih sluchayah vychaslyaetsya vyrazhenie i, esli ono otlichno ot nulya, to vypolnyaetsya pervyj podoperator. Vo vtorom sluchae, esli vyrazhenie ravno nulyu, vypalnyaetsya vtoroj podoperator. Kak obychno, dvusmyslennost' "ELSE" razreshaetsya svyazyvaeniem ELSE s poslednim vstrechayushchimsya IF, u kotorogo net ELSE. 17.4. Operator WHILE Operator WHILE imeet formu WHILE (vyrazhenie) operator Podoperator vypolnyaetsya povtorno do teh por, poka znachenie vyrazheniya ostaetsya otlichnym ot nulya. proverka proizvoditsya pered kazhdym vypolneniem operatora. 17.5. Operator DO Operator DO imeet formu DO operator WHILE (vyrazheniya) Operator vypolnyaetsya povtorno do teh por, poka znachenie vyrazheniya ne stanet ravnym nulyu. Proverka proizvoditsya posle kazhdogo vypolneniya operatora. 17.6. Operator FOR Operator FOR imeet formu (vyrazhenie-1 ; vyrazhenie-2 ; vyrazhenie-3 )operator neob neob neob Operator FOR ekvivalenten sleduyushchemu vyrazhenie-1; WHILE (vyrazhenie-2) \( operator vyrazhenie-3 \) Takim obrazom, pervoe vyrazhenie opredelyaet inicializaciyu cikla; vtoroe specifiuiruet proverku, vypolnyaemuyu pered kazh- doj iteraciej, tak chto vyhod iz cikla proishodit togda, kog- da znachenie vyrazheniya stanovitsya nulem; tret'e vyrazhenie chasto zadaet prirashchenie parametra, kotoroe provoditsya posle kazhdoj iteracii. Lyuboe vyrazhenie ili dazhe vse oni mogut byt' opushcheny. Es- li otsutstvuet vtoroe vyrazhenie, to predlozhenie s WHILE schi- taetsya ekvivalentnym WHILE(1); drugie otsutstvuyushchie vyrazhe- niya prosto opuskayutsya iz privedennogo vyshe rasshireniya. 17.7. Operator SWITCH Operator SWITCH (pereklyuchatel'), vyzyvaet peredachu up- ravleniya k odnomu iz neskol'kih operatorov, v zavisimosti ot znacheniya vyrazheniya. Operator imeet formu SWITCH (vyrazhenie) operator V vyrazhenii provodyatsya obychnye arifmeticheskie preobrazova- niya, no rezul'tat dolzhen imet' tip INT. Operator obychno yav- lyaetsya sostavnym. Lyuboj operator vnutri etogo operatora mo- zhet byt' pomechen odnim ili bolee variantnym prefiksom CASE, imeyushchim formu: CASE konstanstnoe vyrazhenie: gde konstantnoe vyrazhenie dolzhno imet' tip INT. Nikakie dve variantnye konstanty v odnom i tom zhe pereklyuchatele ne mogut imet' odinakovoe znachenie. tochnoe opredelenie konstantnogo vyrazheniya privoditsya v p. 23. Krome togo, mozhet prisutstvovat' samoe bol'shee odin ope- ratornyj prefiks vida DEFAULT: Pri vypolnenii operatora SWITCH vychislyaetsya vhodyashchee v nego vyrazhenie i sravnivaetsya s kazhdoj variantnoj konstan- toj. Esli odna iz variantnyh konstant okazyvaetsya ravnoj znacheniyu etogo vyrazheniya, to upravlenie peredaetsya operato- ru, kotoryj sleduet za sovpadayushchim variantnym prefiksom. Es- li ni odna iz variantnyh konstant ne sovpadaet so znacheniem vyrazheniya i esli pri etom prisutstvuet prefiks DEFAULT, to upravlenie peredaetsya operatoru, pomechennomu etim prefiksom. esli ni odin iz variantov ne podhodit i prefiks DEFAULT ot- sutstvuet, to ni odin iz operatorov v pereklyuchatele ne vy- polnyaetsya. Sami po sebe prefiksy CASE i DEFAULT ne izmenyayut potok upravleniya, kotoroe besprepyatsvenno prohodit cherez takie prefiksy. Dlya vyhoda iz pereklyuchatelya smotrite operator BREAK, p. 17.8. Obychno operator, kotoryj vhodit v pereklyuchatel', yavlyaet- sya sostavnym. Opisaniya mogut poyavlyat'sya v nachale etogo ope- ratora, no inicializacii avtomaticheskih i registrovyh pere- mennyh budut neeffektivnymi. 17.8. Operator BREAK Operator BREAK; vyzyvaet zavershenie vypolneniya naimen'shego ohvatyvayushchego etot operator operatora WHILE, DO, FOR ili SWITCH; upravle- nie peredaetsya operatoru, sleduyushchemu za zavershennym operato- rom. 17.9. Operator CONTINUE Operator CONTINUE; privodit k peredache upravleniya na prodolzhayushchuyu cikl chast' naimen'shego ohvatyvayushchego etot operator operatora WHILE, DO ili FOR; to est' na konec cikla. Bolee tochno, v kazhdom iz operatorov WHILE(...) \( DO \( FOR(...) \( ... ... ... CONTIN: ; CONTIN: ; CONTIN: ; \) \) WHILE(...); \) Operator CONTINUE ekvivalenten operatoru GOTO CONTIN. (Za CONTIN: sleduet pustoj operator; sm. P. 17.13.). 17.10. Operator vozvrata Vozvrashchenie iz funkcii v vyzyvayushchuyu programmu osushchestv- lyaetsya s pomoshch'yu operatora RETURN, kotoryj imeet odnu iz sleduyushchih form RETURN; RETURN vyrazhenie; V pervom sluchae vozvrashchaemoe znachenie neopredeleno. Vo vto- rom sluchae v vyzyvayushchuyu funkciyu vozvrashchaetsya znachenie vyra- zheniya. Esli trebuetsya, vyrazhenie preobrazuetsya k tipu funk- cii, v kotoroj ono poyavlyaetsya, kak v sluchae prisvaivaniya. Popadanie na konec funkcii ekvivalentno vozvratu bez vozvra- shchaemogo znacheniya. 17.11. Operator GOTO Upravlenie mozhno peredavat' bezuslovno s pomoshch'yu opera- tora GOTO identifikator1 identifikator dolzhen byt' metkoj (p. 9.12), Lokalizovannoj v dannoj funkcii. 17.12. Pomechennyj operator Pered lyubym operatorom mozhet stoyat' pomechennyj prefiks vida identifikator: kotoryj sluzhit dlya opisaniya identifikatora v kachestve metki. Metki ispol'zuyutsya tol'ko dlya ukazaniya mesta, kuda peredaet- sya upravlenie operatorom GOTO. Oblast'yu dejstviya metki yavlya- etsya dannaya funkciya, za isklyucheniem lyubyh podblokov, v koto- ryh tot zhe identifikator opisan snova. Smotri p. 19. 17.13. Pustoj operator Pustoj operator imeet formu: ; Pustoj operator okazyvaetsya poleznym, tak kak on pozvolyaet postavit' metku pered zakryvayushchej skobkoj \) sostavnogo ope- ratora ili ukazat' pustoe telo v operatorah cikla, takih kak WHILE. 18. Vneshnie opredeleniya C-programma predstavlyaet soboj posledovatel'nost' vnesh- nih opredelenij. Vneshnee opredelenie opisyvaet identifikator kak imeyushchij klass pamyati EXTERN (po umolchaniyu), ili vozmozhno STATIC, i specificirovannyj tip. Specifikator tipa (p. 16.2) Takzhe mozhet byt' pustym; v etom sluchae schitaetsya, chto tip yavlyaetsya tipom INT. Oblast' dejstviya vneshnih opredelenij rasprostranyaetsya do konca fajla, v kotorom oni privedeny, tochno tak zhe , kak vliyanie opisanij prostiraetsya do konca bloka. Sintaksis vneshnih opredelenij ne otlichaetsya ot sin- taksisa opisanij, za isklyucheniem togo, chto tol'ko na etom urovne mozhno privodit' tekst funkcij. 18.1. Vneshnee opredelenie funkcii Opredelenie funkcii imeet formu opredelenie-funkcii: specifikatory-opisaniya opisatel'-funkcii telo-funkcii neob Edinstvennymi specifikatorami klassa pamyati, dopuskaemymi v kachestve specifikatorov-opisaniya, yavlyayutsya EXTERN ili STATIC; o razlichii mezhdu nimi smotri p. 19.2. Opisatel' fun- kcii podoben opisatelyu dlya "funkcii, vozvrashchayushchej...", za isklyucheniem togo, chto on perechislyaet formal'nye parametry opredelyaemoj funkcii. Oisatel'-funkcii: opisatel' (spisok-parametrov neob) spisok parametrov: identifikator identifikator, spisok-parametrov telo-funkcii imeet formu telo-funkcii: spisok-opisanij sostavnoj-operator Identifikatory iz spiska parametrov i tol'ko oni mogut byt' opisany v spiske opisanij. Lyuboj identifikator, tip ko- torogo ne ukazan, schitaetsya imeyushchim tip INT. Edinstvennym dopustimym zdes' specifikatorom klassa pamyati yavlyaetsya REGISTER; esli takoj klass pamyati specificirovan, to v nacha- le vypolneniya funkcii sootvetstvuyushchij fakticheskij parametr kopiruetsya, esli eto vozmozhno, v registr. Vot prostoj primer polnogo opredeleniya funkcii: INT MAX(A, B, C) INT A, B, C; \( INT M; M = (A>B) ? A:B; RETURN((M>C) ? M:C); \) Zdes' INT - specifikator-tipa, MAX(A,B,C) - opisatel'-funk- cii, INT A,B,C; - spisok-opisanij formal'nyh parametrov, \( ... \) - Blok, soderzhashchij tekst operatora. V yazyke "C" vse fakticheskie parametry tipa FLOAT preob- razuyutsya k tipu DOUBLE, tak chto opisaniya formal'nyh paramet- rov, ob座avlennyh kak FLOAT, prisposobleny prochest' parametry tipa DOUBLE. Analogichno, poskol'ku ssylka na massiv v lyubom kontekste (v chastnosti v fakticheskom parametre) rassmatriva- etsya kak ukazatel' na pervyj element massiva, opisaniya for- mal'nyh parametrov vila "massiv ..." prisposobleny prochest' : "ukazatel' na ...". I nakonec, poskol'ku struktury, ob容dineniya i funkcii ne mogut byt' peredany funkcii, bess- myslenno opisyvat' formal'nyj parametr kak strukturu, ob容dinenie ili funkciyu (ukazateli na takie ob容kty, konech- no, dopuskayutsya). 18.2. Vneshnie opredeleniya dannyh Vneshnee opredelenie dannyh imeet formu opredelenie-dannyh: opisanie Klassom pamyati takih dannyh mozhet byt' EXTERN (v chastnosti, po umolchaniyu) ili STATIC, no ne AUTO ili REGISTER. 19. Pravila, opredelyayushchie oblast' dejstviya Vsya C-programma neobyazatel'no kompiliruetsya odnovremen- no; ishodnyj tekst programmy mozhet hranit'sya v neskol'kih fajlah i ranee skompilirovannye procedury mogut zagruzhat'sya iz bibliotek. Svyaz' mezhdu funkciyami mozhet osushchestvlyat'sya kak cherez yavnye obrashcheniya, tak i v rezul'tate manipulirovaniya s vneshnimi dannymi. Poetomu sleduet rassmotret' dva vida oblastej dejstviya: vo-pervyh, tu, kotoraya mozhet byt' nazvana leksicheskoj ob- last'yu dejstviya identifikatora i kotoraya po sushchestvu yavlyaet- sya toj oblast'yu v programme, gde etot identifikator mozhno ispol'zovat', ne vyzyvaya diagnosticheskogo soobshcheniya "neopre- delennyj identifikator"; i vo-vtoryh, oblast' dejstviya, ko- toraya svyazana s vneshnimi identifikatorami i kotoraya harakte- rizuetsya pravilom, chto ssylki na odin i tot zhe vneshnij iden- tifikator yavlyayutsya ssylkami na odin i tot zhe ob容kt. 19.1. Leksicheskaya oblast' dejstviya Leksicheskaya oblast' dejstviya identifikatorov, opisannyh vo vneshnih opredeleniyah, prostiraetsya ot opredeleniya do kon- ca ishodnogo fajla, v kotorom on nahoditsya. Leksicheskaya ob- last' dejstviya identifikatorov, yavlyayushchihsya formal'nymi para- metrami, rasprostranyaetsya na tu funkciyu, k kotoroj oni otno- syatsya. Leksicheskaya oblast' dejstviya identifikatorov, opisan- nyh v nachale bloka, prostiraetsya do konca etogo bloka. Lek- sicheskoj oblast'yu dejstviya metok yavlyaetsya ta funkciya, v ko- toroj oni nahodyatsya. Poskol'ku vse obrashcheniya na odin i tot zhe vneshnij identi- fikator obrashchayutsya k odnomu i tomu zhe ob容ktu (sm. P. 19.2), Kompilyator proveryaet vse opisaniya odnogo i togo zhe vneshnego identifikatora na sovmestimost'; v dejstvitel'nosti ih ob- last' dejstviya rasprostranyaetsya na ves' fajl, v kotorom oni nahodyatsya. Vo vseh sluchayah, odnako, est' nekotoryj identifikator, yavnym obrazom opisan v nachale bloka, vklyuchaya i blok, kotoryj obrazuet funkciyu, to dejstvie lyubogo opisaniya etogo identi- fikatora vne bloka priostanavlivaetsya do konca etogo bloka. Napomnim takzhe (p. 16.5), CHto identifikatory, sootvetst- vuyushchie obychnym peremennym, s odnoj storony, i identifikato- ry, sootvetstvuyushchie chlenam i yarlykam struktur i ob容dinenij, s drugoj storony, formiruyut dva neperesekayushchihsya klassa, ko- torye ne vstupayut v protivorechie. CHleny i yarlyki podchinyayutsya tem zhe samym pravilam opredeleniya oblastej dejstviya, kak i drugie identifikatory. Imena, specificiruemye s pomoshch'yu TYPEDEF, vhodyat v tot zhe klass, chto i obychnye identifikato- ry. Oni mogut byt' pereopredeleny vo vnutrennih blokah, no vo vnutrennem opisanii tip dolzhen byt' ukazan yavno: TYPEDEF FLOAT DISTANCE; ... \( AUTO INT DISTANCE; ... Vo vtorom opisanii specifikator tipa INT dolzhen prisutstvo- vat', tak kak v protivnom sluchae eto opisanie budet prinyato za opisanie bez opisatelej s tipom DISTANCE (prim. Avtora: soglasites', chto led zdes' tonok.). 19.2. Oblast' dejstviya vneshnih identifikatorov Esli funkciya ssylaetsya na identifikator, opisannyj kak EXTERN, to gde-to sredi fajlov ili bibliotek, obrazuyushchih polnuyu programmu, dolzhno soderzhat'sya vneshnee opredelenie etogo identifikatora. Vse funkcii dannoj programmy, kotorye ssylayutsya na odin i tot zhe vneshnij identifikator, ssylayutsya na odin i tot zhe ob容kt, tak chto sleduet pozabotit'sya, chtoby specificirovannye v etom opredelenii tip i razmer byli sov- mestimy s tipom i razmerom, ukazyvaemymi v kazhdoj funkcii, kotoraya ssylaetsya na eti dannye. Poyavlenie klyuchevogo slova EBTERN vo vneshnem opredelenii ukazyvaet na to, chto pamyat' dlya opisannyh v nem identifika- torov budet vydelena v drugom fajle. Sledovatel'no, v sosto- yashchej iz mnogih fajlov programme vneshnee opredelenie identi- fikatora, ne soderzhashchee specifikatora EXTERN, dolzhno poyav- lyat'sya rovno v odnom iz etih fajlov. lyubye drugie fajly, ko- torye zhelayut dat' vneshnee opredelenie etogo identifikatora, dolzhny vklyuchat' v eto opredelenie slovo EXTERN. Identifika- tor mozhet byt' inicializirovan tol'ko v tom opisanii, koto- roe privodit k vydeleniyu pamyati. Identifikatory, vneshnee opredelenie kotoryh nachinaetsya so slova STATIC, nedostupny iz drugih fajlov. Funkcii mogut byt' opisany kak STATIC. 20. Stroki upravleniya kompilyatorom Kompilyator yazyka "C" soderzhit preprocessor, kotoryj poz- volyaet osushchestvlyat' makropodstanovki, uslovnuyu kompilyaciyu i vklyuchenie imenovannyh fajlov. Stroki, nachinayushchiesya s #, ob- shchayutsya s etim preprocessorom. Sintaksis etih strok ne svyazan s ostal'nym yazykom; oni mogut poyavlyat'sya v lyubom meste i ih vliyanie rasprostranyaetsya (nezavisimo ot oblasti dejstviya) do konca ishodnogo programmnogo fajla. 20.1. Zamena leksem Upravlyayushchaya kompilyatorom stroka vida #DEFINE identifikator stroka-leksem (Obratite vnimanie na otsutstvie v konce tochki s zapya- toj) privodit k tomu, chto preprocessor zamenyaet posleduyushchie vhozhdeniya etogo identifikatora na ukazannuyu stroku leksem. Stroka vida #DEFINE identifikator (identifikator,...,identifikator)stroka leksem gde mezhdu pervym identifikatorom i otkryvayushchejsya skobkoj ( net probela, predstavlyaet soboj makroopredelenie s argumen- tami. Posleduyushchee vhozhdenie pervogo identifikatora, za koto- rym sleduet otkryvayushchaya skobka '(', posledovatel'nost' raz- delennyh zapyatymi leksem i zakryvayushchaya skobka ')', zamenyayut- sya strokoj leksem iz opredeleniya. kazhdoe vhozhdenie identifi- katora, upomyanutogo v spiske formal'nyh parametrov v oprede- lenii , zamenyaetsya sootvetstvuyushchej strokoj leksem iz obrashche- niya. Fakticheskimi argumentami v obrashchenii yavlyayutsya stroki leksem, razdelennye zapyatymi; odnako zapyatye, vhodyashchie v za- kavychennye stroki ili zaklyuchennye v kruglye skobki, ne raz- delyayut argumentov. Kolichestvo formal'nyh i fakticheskih para- metrov dolzhno sovpadat'. Tekst vnutri stroki ili simvol'noj konstanty ne podlezhit zamene. V oboih sluchayah zamenennaya stroka prosmatrivaetsya snova s cel'yu obnaruzheniya drugih opredelennyh identifikatorov. V oboih sluchayah slishkom dlinnaya stroka opredeleniya mozhet byt' prodolzhena na drugoj stroke, esli pomestit' v konce prodol- zhaemoj stroki obratnuyu kosuyu chertu \ . Opisyvaemaya vozmozhnost' osobenno polezna dlya opredeleniya "ob座avlyaemyh konstant", kak, naprimer, #DEFINE TABSIZE 100 INT TABLE[TABSIZE]; Upravlyayushchaya stroka vida #UNDEF identifikator privodit k otmene preprocessornogo opredeleniya dannogo iden- tifikatora. 20.2. Vklyuchenie fajlov Stroka upravleniya kompilyatorom vida #INCLUDE "FILENAME" privodit k zamene etoj stroki na vse soderzhimoe fajla s ime- nem FILENAME. Fajl s etim imenem snachala ishchetsya v spravochni- ke nachal'nogo ishodnogo fajla, a zatem v posledovatel'nosti standartnyh mest. V otlichie ot etogo upravlyayushchaya stroka vida #INCLUDE <FILENAME> ishchet fajl tol'ko v standartnyh mestah i ne prosmatrivaet spravochnik ishodnogo fajla. Stroki #INCLUDE mogut byt' vlozhennymi. 20.3. Uslovnaya kompilyaciya Stroka upravleniya kompilyatorom vida #IF konstantnoe vyrazhenie proveryaet, otlichno li ot nulya znachenie konstantnogo vyrazhe- niya (sm. P. 15). Upravlyayushchaya stroka vida #IF DEF identifikator proveryaet, opredelen li etot identifikator v nastoyashchij mo- ment v preprocessore, t.e. Opredelen li etot identifikator s pomoshch'yu upravlyayushchej stroki #DEFINE. 21. Neyavnye opisaniya Ne vsegda yavlyaetsya neobhodimym specificirovat' i klass pamyati i tip identifikatora v opisanii. Vo vneshnih opredele- niyah i opisaniyah formal'nyh parametrov i chlenov struktur klass pamyati opredelyaetsya po kontekstu. Esli v nahodyashchemsya vnutri funkcii opisanii ne ukazan tip, a tol'ko klass pamya- ti, to predpolagaetsya, chto identifikator imeet tip INT; esli ne ukazan klass pamyati, a tol'ko tip, to identifikator pred- polagaetsya opisannym kak AUTO. Isklyuchenie iz poslednego pra- vila daetsya dlya funkcij, potomu chto specifikator AUTO dlya funkcij yavlyaetsya bessmyslennym (yazyk "C" ne v sostoyanii kom- pilirovat' programmu v stek); esli identifikator imeet tip "funkciya, vozvrashchayushchaya ...", to on predpolagaetsya neyavno opisannym kak EXTERN. Vhodyashchij v vyrazhenie i neopisannyj ranee identifikator, za kotorym sleduet skobka ( , schitaetsya opisannym po kontek- stu kak "funkciya, vozvrashchayushchaya INT". 22. Snova o tipah V etom razdele obobshchayutsya svedeniya ob operaciyah, kotorye mozhno primenyat' tol'ko k ob容ktam opredelennyh tipov. 22.1. Struktury i ob容dineniya Tol'ko dve veshchi mozhno sdelat' so strukturoj ili ob容di- neniem: nazvat' odin iz ih chlenov (s pomoshch'yu operacii) ili izvlech' ih adres ( s pomoshch'yu unarnoj operacii &). Drugie operacii, takie kak prisvaivanie im ili iz nih i peredacha ih v kachestve parametrov, privodyat k soobshcheniyu ob oshibke. V bu- dushchem ozhidaetsya, chto eti operacii, no ne obyazatel'no ka- kie-libo drugie, budut razresheny. V p. 15.1 Govoritsya, chto pri pryamoj ili kosvennoj ssylke na strukturu (s pomoshch'yu . Ili ->) imya sprava dolzhno byt' chlenom struktury, nazvannoj ili ukazannoj vyrazheniem sleva. |to ogranichenie ne navyazyvaetsya strogo kompilyatorom, chtoby dat' vozmozhnost' obojti pravila tipov. V dejstvitel'nosti pered '.' dopuskaetsya lyuboe L-znachenie i zatem predpolagaet- sya, chto eto L-znachenie imeet formu struktury, dlya kotoroj stoyashchee sprava imya yavlyaetsya chlenom. Takim zhe obrazom, ot vy- razheniya, stoyashchego pered '->', trebuetsya tol'ko byt' ukazate- lem ili celym. V sluchae ukazatelya predpolagaetsya, chto on ukazyvaet na strukturu, dlya kotoroj stoyashchee sprava imya yavlya- etsya chlenom. V sluchae celogo ono rassmatrivaetsya kak abso- lyutnyj adres sootvetstvuyushchej struktury, zadannyj v edinicah mashinnoj pamyati. Takie struktury ne yavlyayutsya perenosimymi. 22.2. Funkcii Tol'ko dve veshchi mozhno sdelat' s funkciej: vyzvat' ee ili izvlech' ee adres. Esli imya funkcii vhodit v vyrazhenie ne v pozicii imeni funkcii, sootvetstvuyushchej obrashcheniyu k nej, to generiruetsya ukazatel' na etu funkciyu. Sledovatel'no, chtoby peredat' odnu funkciyu drugoj, mozhno napisat' INT F(); ... G(F); Togda opredelenie funkcii G moglo by vyglyadet' tak: G(FUNCP) INT(*FUNCP)(); \( ... (*FUNCP)(); ... \) Obratite vnimanie, chto v vyzyvayushchej procedure funkciya F dol- zhna byt' opisana yavno, potomu chto za ee poyavleniem v G(F) ne sleduet skobka ( . 22.3. Massivy, ukazateli i indeksaciya Kazhdyj raz, kogda identifikator, imeyushchij tip massiva, poyavlyaetsya v vyrazhenii, on preobrazuetsya v ukazatel' na per- vyj chlen etogo massiva. Iz-za etogo preobrazovaniya massivy ne yavlyayutsya L-znacheniyami. Po opredeleniyu operaciya indeksaciya [] interpretiruetsya takim obrazom, chto E1[E2] schitaetsya identichnym vyrazheniyu *((e1)+(e2)). Soglasno pravilam preob- razovanij, primenyaemym pri operacii +, esli E1 - massiv, a e2 - celoe, to e1[e2] ssylaetsya na e2-j chlen massiva e1. Po- etomu nesmotrya na nesimmetrichnyj vid operaciya indeksacii yav- lyaetsya kommutativnoj. V sluchae mnogomernyh massivov primenyaetsya posledovatel'- noe pravilo. Esli e yavlyaetsya N-mernym massivom razmera I*J*...*K, to pri poyavlenii v vyrazhenii e preobrazuetsya v ukazatel' na (N-1)-mernyj massiv razmera J*...*K. Esli ope- raciya * libo yavno, libo neyavno, kak rezul'tat indeksacii, primenyaetsya k etomu ukazatelyu, to rezul'tatom operacii budet ukazannyj (N-1)-mernyj massiv, kotoryj sam nemedlenno preob- razuetsya v ukazatel'. Rassmotrim, naprimer, opisanie INT X[3][5]; Zdes' X massiv celyh razmera 3*5. Pri poyavlenii v vyrazhenii X preobrazuetsya v ukazatel' na pervyj iz treh massivov iz 5 celyh. V vyrazhenii X[I], kotoroe ekvivalentno *(X+I), snacha- la X preobrazuetsya v ukazatel' tak, kak opisano vyshe; zatem I preobrazuetsya k tipu X, chto vyzyvaet umnozhenie I na dlinu ob容kta, na kotoryj ukazyvaet ukazatel', a imenno na 5 celyh ob容ktov. Rezul'taty skladyvayutsya, i primenenie kosvennoj adresacii daet massiv (iz 5 celyh), kotoryj v svoyu ochered' preobrazuetsya v ukazatel' na pervoe iz etih celyh. Esli v vyrazhenie vhodit i drugoj indeks, to tazhe samaya argumentaciya primenyaetsya snova; rezul'tatom na etot raz budet celoe. Iz vsego etogo sleduet, chto massivy v yazyke "C" hranyatsya postrochno ( poslednij indeks izmenyaetsya bystree vsego) i chto pervyj indeks v opisanii pomogaet opredelit' obshchee kolichest- vo pamyati, trebuemoe dlya hraneniya massiva, no ne igraet ni- kakoj drugoj roli v vychisleniyah, svyazannyh s indeksaciej. 22.4. YAvnye preobrazovaniya ukazatelej Razreshayutsya opredelennye preobrazovaniya, s ispol'zovani- em ukazatelej , no oni imeyut nekotorye zavisyashchie ot konkret- noj realizacii aspekty. Vse eti preobrazovaniya zadayutsya s pomoshch'yu operacii yavnogo preobrazovaniya tipa; sm. P. 15.2 i 16.7. Ukazatel' mozhet byt' preobrazovan v lyuboj iz celochislen- nyh tipov, dostatochno bol'shoj dlya ego hraneniya. Trebuetsya li pri etom INT ili LONG, zavisit ot konkretnoj mashiny. Preob- razuyushchaya funkciya takzhe yavlyaetsya mashinno-zavisimoj, no ona budet vpolne estestvennoj dlya teh, kto znaet strukturu adre- sacii v mashine. Detali dlya nekotoryh konkretnyh mashin privo- dyatsya nizhe. Ob容kt celochislennogo tipa mozhet byt' yavnym obrazom pre- obrazovan v ukazatel'. takoe preobrazovanie vsegda perevodit preobrazovannoe iz ukazatelya celoe v tot zhe samyj ukazatel', no v drugih sluchayah ono budet mashinno-zavisimym. Ukazatel' na odin tip mozhet byt' preobrazovan v ukaza- tel' na drugoj tip. Esli preobrazuemyj ukazatel' ne ukazyva- et na ob容kty, kotorye podhodyashchim obrazom vyravneny v pamya- ti, to rezul'tiruyushchij ukazatel' mozhet pri ispol'zovanii vy- zyvat' oshibki adresacii. Garantiruetsya, chto ukazatel' na ob容kt zadannogo razmera mozhet byt' preobrazovan v ukazatel' na ob容kt men'shego razmera i snova obratno, ne preterpev pri etom izmeneniya. Naprimer, procedura raspredeleniya pamyati mogla by prini- mat' zapros na razmer vydelyaemogo ob容kta v bajtah, a vozv- rashchat' ukazatel' na simvoly; eto mozhno bylo by ispol'zovat' sleduyushchim obrazom. EXTERN CHAR *ALLOC(); DOUBLE *DP; DP=(DOUBLE*) ALLOC(SIZEOF(DOUBLE)); *DP=22.0/7.0; Funkciya ALLOC dolzhna obespechivat' (mashinno-zavisimym sposo- bom), chto vozvrashchaemoe eyu znachenie budet podhodyashchim dlya pre- obrazovaniya v ukazatel' na DOUBLE; v takom sluchae ispol'zo- vanie etoj funkcii budet perenosimym. Predstavlenie ukazatelya na PDP-11 sootvetstvuet 16-bito- vomu celomu i izmeryaetsya v bajtah. Ob容kty tipa CHAR ne ime- yut nikakih ogranichenij na vyravnivanie; vse ostal'nye ob容k- ty dolzhny imet' chetnye adresa. Na HONEYWELL 6000 ukazatel' sootvetstvuet 36-bitovomu celomu; slovu sootvetstvuet 18 levyh bitov i dva neposredst- venno primykayushchih k nim sprava bita, kotorye vydelyayut simvol v slove. Takim obrazom, ukazateli na simvoly izmeryayutsya v edinicah 2 v stepeni 16 bajtov; vse ostal'noe izmeryaetsya v edinicah 2 v stepeni 18 mashinnyh slov. Velichiny tipa DOUBLE i soderzhashchie ih agregaty dolzhny vyravnivat'sya po chetnym ad- resam slov (0 po modulyu 2 v stepeni 19). |vm IBM 370 i INTERDATA 8/32 shodny mezhdu soboj. Na obeih mashinah adresa izmeryayutsya v bajtah; elementarnye ob容kty dolzhny byt' vyrov- neny po granice, ravnoj ih dline, tak chto ukazateli na SHORT dolzhny byt' kratny dvum, na INT i FLOAT - chetyrem i na DOUBLE - vos'mi. Agregaty vyravnivayutsya po samoj strogoj granice, trebuemoj kakim-libo iz ih elementov. 23. Konstantnye vyrazheniya V neskol'kih mestah v yazyke "C" trebuyutsya vyrazheniya, ko- torye posle vychisleniya stanovyatsya konstantami: posle varian- tnogo prefiksa CASE, v kachestve granic massivov i v inicia- lizatorah. V pervyh dvuh sluchayah vyrazhenie mozhet soderzhat' tol'ko celye konstanty, simvol'nye konstanty i vyrazheniya SIZEOF, vozmozhno svyazannye libo binarnymi operaciyami + - * / . % & \! CH << >> == 1= <> <= >= libo unarnymi operaciyami - \^ libo ternarnoj operaciej ?: Kruglye skobki mogut ispol'zovat'sya dlya gruppirovki, no ne dlya obrashcheniya k funkciyam. V sluchae inicializatorov dopuskaetsya bol'shaya (udarenie na bukvu o) svoboda; krome perechislennyh vyshe konstantnyh vyrazhenij mozhno takzhe primenyat' unarnuyu operaciyu & k vneshnim ili staticheskim ob容ktam i k vneshnim ili staticheskim massi- vam, imeyushchim v kachestve indeksov konstantnoe vyrazhenie. Unarnaya operaciya & mozhet byt' takzhe primenena neyavno, v re- zul'tate poyavleniya neindeksirovannyh massivov i funkcij. Os- novnoe pravilo zaklyuchaetsya v tom, chto posle vychisleniya ini- cializator dolzhen stanovitsya libo konstantoj, libo adresom ranee opisannogo vneshnego ili staticheskogo ob容kta plyus ili minus konstanta. 24. Soobrazheniya o perenosimosti Nekotorye chasti yazyka "C" po svoej suti mashinno-zavisi- my. Sleduyushchie nizhe perechislenie potencial'nyh trudnostej ho- tya i ne yavlyayutsya vseob容mlyushchimi, no vydelyaet osnovnye iz nih. Kak pokazala praktika, voprosy, celikom svyazannye s ap- paratnym oborudovaniem, takie kak razmer slova, svojstva plavayushchej arifmetiki i celogo deleniya, ne predstavlyayut oso- bennyh zatrudnenij. Drugie aspekty apparatnyh sredstv naho- dyat svoe otrazhenie v razlichnyh realizaciyah. Nekotorye iz nih, v chastnosti, znakovoe rasshirenie (preobrazuyushchee otrica- tel'nyj simvol v otricatel'noe celoe) i poryadok, v kotorom pomeshchayutsya bajty v slove, predstavlyayut soboj nepriyatnost', kotoraya dolzhna tshchatel'no otslezhivat'sya. Bol'shinstvo iz os- tal'nyh problem etogo tipa ne vyzyvaet skol'ko-nibud' znachi- tel'nyh zatrudnenij. CHislo peremennyh tipa REGISTER, kotoroe fakticheski mozhet byt' pomeshcheno v registry, menyaetsya ot mashiny k mashine, takzhe kak i nabor dopustimyh dlya nih tipov. Tem ne menee vse kom- pilyatory na svoih mashinah rabotayut nadlezhashchim obrazom; lish- nie ili nedopustimye registrovye opisaniya ignoriruyutsya. Nekotorye trudnosti voznikayut tol'ko pri ispol'zovanii somnitel'noj praktiki programmirovaniya. Pisat' programmy, kotorye zavisyat ot kakih- libo etih svojstv, yavlyaetsya chrez- vychajno nerazumnym. YAzykom ne ukazyvaetsya poryadok vychisleniya argumentov fun- kcij; oni vychislyayutsya sprava nalevo na PDP-11 i VAX-11 i sleva napravo na ostal'nyh mashinah. poryadok, v kotorom pro- ishodyat pobochnye effekty, takzhe ne specificiruetsya. Tak kak simvol'nye konstanty v dejstvitel'nosti yavlyayutsya ob容ktami tipa INT, dopuskaetsya ispol'zovanie simvol'nyh konstant, sostoyashchih iz neskol'kih simvolov. Odnako, poskol'- ku poryadok, v kotorom simvoly pripisyvayutsya k slovu, menyaet- sya ot mashiny k mashine, konkretnaya realizaciya okazyvaetsya ves'ma mashinno-zavisimoj. Prisvaivanie polej k slovam i simvolov k celym osushchestv- lyaetsya spravo nalevo na PDP-11 i VAX-11 i sleva napravo na drugih mashinah. eti razlichiya nezametny dlya izolirovannyh programm, v kotoryh ne razresheno smeshivat' tipy (preobrazuya, naprimer, ukazatel' na INT v ukazatel' na CHAR i zatem pro- veryaya ukazyvaemuyu pamyat'), no dolzhny uchityvat'sya pri sogla- sovanii s nakladyvaemymi izvne shemami pamyati. YAzyk, prinyatyj na razlichnyh kompilyatorah, otlichaetsya tol'ko neznachitel'nymi detalyami. Samoe zametnoe otlichie sos- toit v tom, chto ispol'zuemyj v nast