YAzyk programmirovaniya Si. Proizvodstvenno-vnedrencheskij kooperativ "I N T E R F E J S" Dialogovaya Edinaya Mobil'naya Operacionnaya Sistema Demos/P 2.1 YAzyk programmirovaniya Si. Moskva 1988 Opisan universal'nyj yazyk programmirovaniya Si. Prive- deny struktura i sintaksis yazyka, pravila napisaniya prog- ramm, dany nachal'nye svedeniya o vzaimodejstvii programm na Si s operacionnoj sistemoj Demos.  * 1. VVEDENIE YAzyk Si - eto universal'nyj yazyk programmirovaniya, dlya kotorogo harakterny ekonomichnost' vyrazheniya, sovremennyj nabor operatorov i tipov dannyh. YAzyk Si ne yavlyaetsya ni yazykom "ochen' vysokogo urovnya", ni "bol'shim" yazykom, i ne prednaznachaetsya dlya nekotoroj special'noj oblasti primene- niya, no otsutstvie ogranichenij i obshchnost' yazyka delayut ego dlya mnogih zadach bolee udobnym i effektivnym, chem yazyki, predpolozhitel'no bolee moshchnye. Operacionnaya sistema, kompi- lyator s yazyka Si i po sushchestvu vse prikladnye programmy sis- temy "DEMOS" napisany na Si. YAzyk Si ne svyazan s kakimi- libo opredelennymi apparatnymi sredstvami ili sistemami, i na nem legko pisat' programmy, kotorye mozhno propuskat' bez izmenenij na lyuboj |VM, imeyushchej Si-kompilyator. YAzyk Si yavlyaetsya universal'nym yazykom programmirovaniya. On pervonachal'no poyavilsya v operacionnoj sisteme UNIX, i razvivalsya kak osnovnoj yazyk sistem, sovmestimyh s OS UNIX. Sam yazyk , odnako, ne svyazan s kakoj-libo odnoj operacionnoj sistemoj ili mashinoj; i hotya ego nazyvayut yazykom sistemnogo programmirovaniya, tak kak on udoben dlya napisaniya operacion- nyh sistem, on mozhet ispol'zovat'sya dlya napisaniya lyubyh bol'shih vychislitel'nyh programm, programm dlya obrabotki tekstov i baz dannyh. YAzyk Si - eto yazyk otnositel'no "nizkogo urovnya". |to oznachaet, chto Si imeet delo s ob容ktami togo zhe vida, chto i bol'shinstvo |VM, a imenno, s simvolami, chislami i adresami. Oni mogut ob容dinyat'sya i peresylat'sya posredstvom obychnyh arifmeticheskih i logicheskih operacij, osushchestvlyaemyh real'- nymi |VM. V yazyke Si otsutstvuyut operacii, imeyushchie delo nepos- redstvenno s sostavnymi ob容ktami, takimi kak stroki simvo- lov, mnozhestva, spiski ili s massivami, rassmatrivaemymi kak celoe. Zdes', naprimer, net nikakogo analoga operaciyam PL/1, operiruyushchim s massivami i strokami. YAzyk ne predostavlyaet nikakih drugih vozmozhnostej raspredeleniya pamyati, krome sta- ticheskogo opredeleniya i mehanizma stekov, obespechivaemogo lokal'nymi peremennyh funkcij. Sam po sebe yazyk Si ne obes- pechivaet nikakih vozmozhnostej vvoda-vyvoda. Vse eti meha- nizmy vysokogo urovnya dolzhny obespechivat'sya yavno vyzyvaemymi funkciyami. Analogichno, yazyk Si predlagaet tol'ko prostye, posledo- vatel'nye konstrukcii upravleniya: proverki, cikly, gruppiro- vanie i podprogrammy, no ne mul'tiprogrammirovanie, paral- lel'nye operacii, sinhronizaciyu ili soprogrammy. Uderzhanie yazyka v skromnyh razmerah daet real'nye prei- mushchestva. Tak kak Si otnositel'no mal, on ne trebuet mnogo mesta dlya svoego opisaniya i mozhet byt' bystro vyuchen. -1- Kompilyator s Si mozhet byt' prostym i kompaktnym. |to obes- pechivaet vysokuyu stepen' mobil'nosti yazyka. Poskol'ku tipy dannyh i struktury upravleniya, imeyushchiesya v Si, neposredst- venno podderzhivayutsya bol'shinstvom sushchestvuyushchih |VM, biblio- teka, neobhodimaya vo vremya progona izolirovannyh programm, okazyvaetsya ochen' malen'koj. Na SM-4, naprimer , ona soder- zhit tol'ko programmy dlya 32-bitovogo umnozheniya i deleniya i dlya upryatyvaniya i vosstanovleniya registrov pri vhode v funk- ciyu. Konechno, kazhdaya realizaciya obespechivaet ischerpyvayushchuyu, sovmestimuyu biblioteku funkcij dlya vypolneniya operacij vvoda-vyvoda, obrabotki strok i raspredeleniya pamyati, no tak kak obrashchenie k nim osushchestvlyaetsya tol'ko yavno, mozhno, esli neobhodimo, izbezhat' ih vyzova; eti funkcii mogut byt' kom- paktno napisany na samom Si. Opyat' zhe iz-za togo, chto yazyk Si otrazhaet vozmozhnosti sovremennyh komp'yuterov, programmy na Si okazyvayutsya dosta- tochno effektivnymi, tak chto ne voznikaet pobuzhdeniya pisat' vmesto etogo programmy na yazyke assemblera. Hotya Si soot- vetstvuet vozmozhnostyam mnogih |VM, on ne zavisit ot kakoj- libo konkretnoj arhitektury mashiny i v silu etogo bez osobyh usilij pozvolyaet pisat' "perenosimye" programmy, t.e. prog- rammy, kotorye mozhno propuskat' bez izmenenij na razlichnyh apparatnyh sredstvah. YAzyk Si ne yavlyaetsya yazykom so strogimi tipami dannyh v smysle Paskalya ili Algola-68. On sravnitel'no snishoditelen k preobrazovaniyu dannyh, hotya i ne budet bujno preobrazovy- vat' tipy dannyh podobno yazyku PL/1. Kompilyator ne predus- matrivaet nikakoj proverki indeksov massivov, tipov argumen- tov i t.d. vo vremya vypolneniya programmy. V teh situaciyah, kogda zhelatel'na strogaya proverka tipov, ispol'zuetsya special'naya programma lint. Programma lint ne generiruet mashinnogo koda, a delaet ochen' stroguyu proverku vseh teh storon programmy, kotorye mozhno prokontro- lirovat' vo vremya kompilyacii i zagruzki. Ona opredelyaet nesootvetstvie tipov, nesovmestimost' argumentov, neispol'- zovannye ili ochevidnym obrazom neinicializirovannye peremen- nye, potencial'nye trudnosti perenosimosti i t.d. Iz za togo, chto v yazyke otsutstvuyut sredstva vvoda/vyvoda i t.p., pri programmirovanii na nem sushchestven- nuyu rol' igraet biblioteka standartnyh programm, osushchestvlya- yushchih vzaimodejstvie s sistemoj. Vo vseh sistemah, sovmesti- myh s OS UNIX, k kotorym otnositsya i DEMOS, sushchestvuet sov- mestimyj nabor programm dlya vvoda/vyvoda, upravleniya pamyat'yu, preobrazovaniya dannyh i vypolnyayushchih drugie funkcii, ispol'zovanie kotoryh obespechivaet vozmozhnost' perenosa programm na drugie |VM. V dannom dokumente opisyvaetsya yazyk Si, rasshireniya, obespechivaemye special'nym preprocessorom (fakticheski oni -2- voshli uzhe v ponyatie "yazyk Si"), standartnaya biblioteka vvoda/vyvoda, i dayutsya nachal'nye svedeniya o vzaimodejstvii programm na Si s OS DEMOS. Polnoe opisanie bibliotechnyh programm imeetsya v rukovodstve programmista OS DEMOS (chasti 3 i 4), i v operativnoj dokumentacii man(2) i man(3). Horo- shim uchebnikom po yazyku Si yavlyaetsya kniga [1], kratkoe for- mal'noe opisanie yazyka privedeno v [2]. V tekste vstrechayutsya primechaniya, otnosyashchiesya k realiza- cii yazyka Si v OS DEMOS. Takie primechaniya vydelyayutsya verti- kal'noj chertoj sprava (kak vydelen dannyj abzac).  * 2. SINTAKSICHESKAYA NOTACIYA V ispol'zuemoj v etom rukovodstve sintaksicheskoj nota- cii sintaksicheskie kategorii zapisyvayutsya russkimi bukvami i simvolom "_", a vse ostal'nye simvoly rassmatrivayutsya kak liternye (to est' izobrazhayushchie sami sebya). 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 opisyvaetsya v Prilozhenii 1. Esli opisanie ne pomeshchaetsya na odnoj stroke, ono pro- dolzhaetsya na sleduyushchej s nekotorym sdvigom vpravo, naprimer: opisanie_struktury: specifikator_tipa spisok_opisatelej_struktury Zdes' sleduet chitat': opisanie_struktury: specifikator_tipa spisok_opisatelej_struktury Esli sdelan razbor vhodnogo potoka na leksemy vplot' do dannogo simvola, to v kachestve sleduyushchej leksemy beretsya samaya dlinnaya stroka simvolov, IBM/370 (OS-360) 7 simvolov, 1 registr VAX 11 (UNIX) 7 simvolov, 2 registra 2.1. Klyuchevye slova Sleduyushchie identifikatory zarezervirovany dlya ispol'zo- vaniya v kachestve klyuchevyh slov i ne mogut ispol'zovat'sya inym obrazom: -3- int extern else char register for float typedef do double static while struct goto switch union return case long sizeof default short break entry unsigned continue auto if Klyuchevoe slovo entry v nastoyashchee vremya ne ispol'zuetsya kakim-libo kompilyatorom; ono zarezervirovano dlya ispol'zova- niya v budushchem. V nekotoryh realizaciyah rezerviruyutsya takzhe slova fortran i asm. 2.2. Konstanty Imeetsya neskol'ko vidov konstant, kotorye perechisleny nizhe. 2.2.1. Celye konstanty Celaya konstanta, sostoyashchaya iz posledovatel'nosti cifr, schitaetsya vos'merichnoj, esli ona nachinaetsya s 0 (cifra nul'), i desyatichnoj v protivnom sluchae. Cifry 8 i 9 imeyut vos'merichnye znacheniya 10 i 11 sootvetstvenno. Posledova- tel'nost' cifr, kotoroj predshestvuyut simvoly 0h (nul', h- malen'koe) ili 0h (nul' X-bol'shoe), rassmatrivaetsya kak shestnadcatirichnoe celoe. SHestnadcatirichnye cifry vklyuchayut bukvy ot a (malen'koe) ili A (bol'shoe) do f (malen'koe) ili F (bol'shoe) so znacheniyami ot 10 do 15. Desyatichnaya konstanta, velichina kotoroj prevyshaet naibol'shee mashinnoe celoe so zna- kom, schitaetsya dlinnoj; vos'merichnaya ili shestnadcatirichnaya konstanta, kotoraya prevyshaet naibol'shee mashinnoe celoe bez znaka, takzhe schitaetsya dlinnoj. 2.2.2. Dlinnye (long) konstanty Desyatichnaya, vos'merichnaya ili shestnadcatirichnaya kons- tanta, za kotoroj neposredstvenno sleduet l (el'-malen'koe) ili L (el'-bol'shoe), yavlyaetsya dlinnoj konstantoj. Na nekoto- ryh mashinah celye i dlinnye znacheniya mogut rassmatrivat'sya kak identichnye. 2.2.3. Simvol'nye konstanty Simvol'naya konstanta - eto simvol, zaklyuchennyj v odi- nochnye kavychki, kak, naprimer, 'h'. Znacheniem simvol'noj konstanty yavlyaetsya chislennoe znachenie etogo simvola v mashin- nom predstavlenii nabora simvolov. -4- Nekotorye negraficheskie simvoly, odinochnaya kavychka ' i obratnaya kosaya cherta \ mogut byt' predstavleny dvumya simvo- lami v sootvetstvii so sleduyushchej tablicej uslovnyh posledo- vatel'nostej: Nazvanie Kod Oboznachenie novaya stroka 012 \n gorizontal'naya tabulyaciya 011 \t simvol vozvrata na odnu 010 \v poziciyu vozvrat karetki 015 \r perehod na novuyu stranicu 014 \f obratnaya kosaya cherta 0133 \\ odinochnaya kavychka 047 \' proizvol'nyj simvol 0ddd \ddd Uslovnaya posledovatel'nost' \ddd sostoit iz obratnoj kosoj cherty, za kotoroj sleduyut 1, 2 ili 3 vos'merichnyh cifry, kotorye rassmatrivayutsya kak zadayushchie znachenie zhelae- mogo simvola. Special'nym sluchaem etoj konstrukcii yavlyaetsya posledovatel'nost' \0 (za nulem ne sleduet cifra), kotoraya opredelyaet nulevoj simvol. Esli sleduyushchij za obratnoj kosoj chertoj simvol ne sovpadaet s odnim iz ukazannyh, to obratnaya kosaya cherta ignoriruetsya. 2.2.4. Veshchestvennye konstanty Veshchestvennaya konstanta sostoit iz celoj chasti, desyatich- noj 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 desyatichnaya tochka, libo e i eksponenta (no ne to i dru- goe odnovremenno) mozhet otsutstvovat'. Veshchestvennye kons- tanty v bol'shinstve realizacij schitayutsya konstantami dvojnoj tochnosti. 2.3. Stroki Stroka - eto posledovatel'nost' simvolov, zaklyuchennaya v dvojnye kavychki, kak, naprimer, "...". Stroka imeet tip mas- siv simvolov i klass pamyati static (sm. nizhe). Stroka inici- alizirovana 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 kavychki " dol- zhen byt' postavlen simvol obratnoj kosoj cherty \; krome togo, mogut ispol'zovat'sya te zhe uslovnye posledovatel'- nosti, chto i v simvol'nyh konstantah. Obratnaya kosaya cherta \, za kotoroj neposredstvenno sleduet simvol novoj stroki, -5- ignoriruetsya. Imeyutsya makroprocessornye sredstva, pozvolyayushchie ob容di- nyat' sovpadayushchie stroki pri translyacii s cel'yu ekonomii pamyati (sm. komandu xstr). 2.4. Harakteristiki apparatnyh sredstv Sleduyushchaya nizhe tablica summiruet nekotorye svojstva apparatnogo oborudovaniya, kotorye menyayutsya ot mashiny k mashine. Hotya oni i vliyayut na perenosimost' programm, na praktike oni predstavlyayut men'shuyu problemu, chem eto mozhet kazat'sya zaranee. Tablica 1. ----------------------------------------- | CM-|VM IBM 370 (OS) VAX-11 | | KOI-8 ebcdic ASCII | | char 8 bit 8 bit 8 bit | | int 16 32 32 | | short 16 16 16 | | long 32 32 32 | | float 32 32 32 | | double 64 64 64 | | range -38/+38 -76/+76 -76/+76 | |_______________________________________|  * 3. OB'EKTY YAZYKA SI 3.1. Interpretaciya identifikatorov S kazhdym identifikatorom v Si svyazano dva atributa: ego klass pamyati i ego tip. Klass pamyati opredelyaet mesto i vremya hraneniya pamyati, svyazannoj s identifikatorom; tip opredelyaet smysl velichin, nahodyashchihsya 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 vyhode iz etogo bloka. Staticheskie peremennye yavlyayutsya lokal'nymi, no sohranyayut svoi znacheniya 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 funk- ciyami, v tom chisle i mezhdu nezavisimo skompilirovannymi funkciyami. Registrovye peremennye hranyatsya (esli eto voz- mozhno) v bystryh registrah mashiny; podobno avtomaticheskim peremennym oni yavlyayutsya lokal'nymi dlya kazhdogo bloka i ische- zayut pri vyhode iz etogo bloka. V yazyke Si predusmotreno neskol'ko osnovnyh tipov ob容ktov: -6- Simvol'nyj. - Ob容kty, opisannye kak simvoly (char), dostatochno veliki, chtoby hranit' lyuboj chlen iz sootvetstvuyushchego dannoj realizacii vnutrennego nabora simvolov, i esli dejstvitel'nyj simvol iz etogo nabora simvolov hra- nitsya v simvol'noj peremennoj, to ee znachenie ekviva- lentno celomu kodu etogo simvola. V simvol'nyh pere- mennyh mozhno hranit' i drugie velichiny, no realizaciya budet mashinno-zavisimoj. (Na SM |VM znachenie simvol'- nyh peremennyh izmenyaetsya ot -0177 do 0177.) Celyj. - Mozhno ispol'zovat' do treh razmerov celyh, opisyvae- myh kak short int, int i long int. Dlinnye celye zanimayut ne men'she pamyati, chem korotkie, no v konk- retnoj realizacii mozhet okazat'sya, chto libo korotkie celye, libo dlinnye celye, libo te i drugie budut ekvivalentny prostym celym. "Prostye" celye imeyut estestvennyj razmer, predusmatrivaemyj arhitekturoj ispol'zuemoj mashiny; drugie razmery vvodyatsya dlya udovletvoreniya special'nyh potrebnostej. Bezznakovyj. - Celye bez znaka, opisyvaemye kak unsigned, podchinya- yutsya zakonam arifmetiki po modulyu 2**n, gde n - chislo bitov v ih predstavlenii. (Na CM-|VM dlinnye veli- chiny bez znaka ne predusmotreny). Veshchestvennyj. - Veshchestvennye odinarnoj tochnosti (float) i veshchestven- nye dvojnoj tochnosti (double) v nekotoryh realizaciyah mogut byt' sinonimami. (Na SM |VM float zanimaet 32 bita pamyati, a double - 64). V yazyke net logicheskogo tipa dannyh, a v kachestve logicheskih znachenij ispol'zuyutsya celye "0" - "lozh'" i "1" - "istina" (pri proverkah lyuboe celoe, ne ravnoe 0, traktuetsya kak "istina"). Poskol'ku ob容kty upomyanutyh vyshe tipov mogut byt' razumno interpretirovany kak chisla, eti tipy budut nazy- vat'sya arifmeticheskimi. Tipy char i int vseh razmerov sov- mestno budut nazyvat'sya celochislennymi. Tipy float i double sovmestno budut nazyvat'sya veshchestvennymi tipami. Krome osnovnyh arifmeticheskih tipov sushchestvuet koncep- tual'no beskonechnyj klass proizvodnyh tipov, kotorye obrazu- yutsya iz osnovnyh tipov sleduyushchim obrazom: - massivy ob容ktov bol'shinstva tipov; - funkcii, kotorye vozvrashchayut ob容kty zadannogo tipa; -7- - 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 primenyat'sya rekursivno. 3.2. Ob容kty i l_znacheniya Ob容kt yavlyaetsya dostupnym obrabotke uchastkom pamyati; l_znachenie (levoe znachenie) - eto vyrazhenie, ssylayushcheesya na ob容kt. Ochevidnym primerom vyrazheniya l_znacheniya yavlyaetsya identifikator. Sushchestvuyut operacii, rezul'tatom kotoryh yavlyayutsya l_znacheniya; esli, naprimer, e - vyrazhenie tipa uka- zatel', to *e yavlyaetsya vyrazheniem l_znacheniya, ssylayushchimsya na tot ob容kt, na kotoryj ukazyvaet 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_znachenie. 3.3. Preobrazovaniya Ryad operacij mozhet v zavisimosti ot svoih operandov vyzyvat' preobrazovanie znacheniya operanda iz odnogo tipa v drugoj. V etom razdele ob座asnyayutsya rezul'taty, kotorye sle- duet ozhidat' ot takih preobrazovanij. V konce podvodyatsya itogi preobrazovanij, trebuemye bol'shinstvom obychnyh opera- cij; eti svedeniya dopolnyayutsya neobhodimym obrazom pri obsuzh- denii kazhdoj operacii. 3.3.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 bolee dlinnomu vsegda soprovozhdaetsya znakovym rasshireniem; celye yavlyayutsya velichinami so znakom. Osushchestvlyaetsya ili net znakovoe rasshirenie dlya simvolov, zavisit ot ispol'zuemoj mashiny, na SM-|VM takoe preobrazovanie osushchestvlyaetsya tak, chto russkie bukvy pri pryamom preobrazovanii poluchat otrica- tel'nye kody. Oblast' znachenij simvol'nyh peremennyh na CM-|VM menyaetsya ot -128 do 127; simvoly iz nabora ASCII imeyut polozhitel'nye znacheniya. Simvol'naya konstanta, zadan- naya s pomoshch'yu vos'merichnoj uslovnoj posledovatel'nosti, pod- vergaetsya znakovomu rasshireniyu i mozhet okazat'sya otricatel'- noj; naprimer, '\377' imeet znachenie -1. -8- Kogda bolee dlinnoe celoe preobrazuetsya v bolee korot- koe ili v char, ono obrezaetsya sleva; lishnie bity prosto otbrasyvayutsya. 3.3.2. Tipy float i double Vsya veshchestvennaya arifmetika v Si 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. Edinstvennoe isklyuchenie mozhet byt' sdelano v kompilyato- rah dlya |VM, na kotoryh net apparatnyh operacij nad chislami tipa double (naprimer, SM-4). Utochnit' eto mozhno po opisa- niyu kompilyatora (komanda cc). 3.3.3. Veshchestvennye i celochislennye velichiny Preobrazovanie veshchestvennyh znachenij k celochislennomu tipu v nekotoroj stepeni mashinno-zavisimo; v chastnosti, nap- ravlenie usecheniya otricatel'nyh chisel menyaetsya ot mashine k mashine. Rezul'tat ne opredelen, esli znachenie ne pomeshchaetsya v predostavlyaemoe prostranstvo. Preobrazovanie celochislennyh znachenij v veshchestvennye vypolnyaetsya bez oslozhnenij. Mozhet proizojti nekotoraya poterya tochnosti, esli dlya rezul'tata ne hvatit dliny mantissy. 3.3.4. Ukazateli i celye Celoe ili dlinnoe celoe mozhet byt' pribavleno k ukaza- telyu ili vychteno iz nego; v etom sluchae pervaya velichina pre- obrazuetsya tak, kak ukazyvaetsya v opisanii operacii slozhe- niya. Dva ukazatelya na ob容kty odinakovogo tipa mogut byt' vychteny; v etom sluchae rezul'tat preobrazuetsya k celomu, kak ukazyvaetsya v opisanii operacii vychitaniya. 3.3.5. Celoe bez znaka Vsyakij raz, kogda celoe bez znaka ob容dinyaetsya s pros- tym celym, prostoe celoe preobrazuetsya v celoe bez znaka i rezul'tat okazyvaetsya celym bez znaka. Znacheniem yavlyaetsya naimen'shee celoe bez znaka, sootvetstvuyushchee celomu so znakom (po modulyu 2**razmer slova). V dvoichnom dopolnitel'nom predstavlenii 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. -9- Takim obrazom, eto preobrazovanie svoditsya k dobavleniyu nulej sleva. 3.3.6. Arifmeticheskie preobrazovaniya Podavlyayushchee bol'shinstvo operacij vyzyvaet preobrazova- nie i opredelyaet tipy rezul'tata analogichnym obrazom. Privo- dimaya nizhe shema v dal'nejshem budet nazyvat'sya "obychnymi arifmeticheskimi 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.  * 4. 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.0.4), yavlyayutsya vyrazheniya, opredelennye v p.p.0.1-0.3. Vnutri kazh- dogo podrazdela operacii imeyut odinakovoe starshinstvo. V kazhdom podrazdele dlya opisyvaemyh tam operacij ukazyvaetsya ih associativnost' sleva ili sprava. Starshinstvo i associa- tivnost' vseh operacij v vyrazheniyah rezyumiruyutsya v grammati- cheskoj svodke v prilozhenii. V protivnom sluchae poryadok vychislenij vyrazhenij ne opredelen. V chastnosti, kompilyator mozhet vychislyat' podvyra- zheniya v tom poryadke, kotoryj on nahodit naibolee effektiv- nym, dazhe esli eti podvyrazheniya privodyat k pobochnym effek- tam. Poryadok, v kotorom proishodyat pobochnye effekty, ne spe- cificiruetsya. Vyrazheniya, vklyuchayushchie kommutativnye i associa- tivnye operacii (*,+,&,|,^), mogut byt' pereuporyadocheny pro- izvol'nym obrazom dazhe pri nalichii kruglyh skobok; v etom sluchae neobhodimo ispol'zovat' yavnye promezhutochnye peremen- nye. Pri vychislenii vyrazhenij obrabotka perepolneniya i pro- verka pri delenii yavlyayutsya mashinno-zavisimymi. Bol'shinstvo realizacij yazyka Si (v tom chisle i v OS DEMOS) ignoriruyut perepolnenie celyh; obrabotka oshibki pri delenii na 0 i pri vseh osobyh sluchayah v operaciyah s veshchestvennymi chislami menyaetsya ot mashiny k mashine i obychno vypolnyaetsya s pomoshch'yu bibliotechnoj funkcii. -10- 4.1. Pervichnye vyrazheniya Pervichnye vyrazheniya, vklyuchayushchie ., ->, indeksaciyu i obrashcheniya k funkciyam, gruppiruyutsya sleva napravo. pervichnoe vyrazhenie: identifikator konstanta stroka (vyrazhenie) pervichnoe_vyrazhenie [vyrazhenie] pervichnoe_vyrazhenie (spisok_vyrazhenij) neob 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, tipom identifikatora yavlyaetsya massiv ..., to znacheniem vyra- zheniya, sostoyashchego iz etogo identifikatora, yavlyaetsya ukaza- tel' na pervyj ob容kt v etom massive, a tipom vyrazheniya budet ukazatel' na .... Bolee togo, identifikator massiva ne yavlyaetsya vyrazheniem l_znacheniya. Podobnym obrazom interpreti- ruetsya identifikator, kotoryj opisan kak funkciya, vozvrashchayu- shchaya .... Za isklyucheniem togo sluchaya, kogda on ispol'zuetsya v pozicii imeni funkcii pri obrashchenii, preobrazuetsya v ukaza- tel' na funkciyu, 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 modificiru- etsya v ukazatel' na simvoly, i rezul'tatom yavlyaetsya ukaza- tel' na pervyj simvol stroki. (Imeetsya isklyuchenie v nekoto- ryh inicializatorah; sm. nizhe.) Vyrazhenie v kruglyh skobkah yavlyaetsya pervichnym vyrazhe- niem, tip i znachenie kotorogo identichny tipu i znacheniyu etogo vyrazheniya bez skobok. Nalichie kruglyh skobok ne vli- yaet na to, yavlyaetsya li vyrazhenie l_znacheniem ili net. Pervichnoe vyrazhenie, za kotorym sleduet vyrazhenie v kvadratnyh skobkah, yavlyaetsya pervichnym vyrazheniem. |to vyra- zhenie s indeksom. Obychno pervichnoe vyrazhenie imeet tip uka- zatel' na ..., indeksnoe vyrazhenie imeet tip int, a tipom rezul'tata yavlyaetsya "...". Vyrazhenie e1[e2] po opredeleniyu identichno vyrazheniyu * ((e1) + (e2)). Vse, chto neobhodimo -11- dlya ponimaniya etoj zapisi, soderzhitsya v etom razdele; vop- rosy, svyazannye s ponyatiem identifikatorov i operacij * i + rassmatrivayutsya v p.p. 0.1, 0.2 i 0.4 sootvetstvenno; vyvody summiruyutsya nizhe. 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 nizhe, ranee ne vstrechavshchijsya identifikator, za kotorym neposredst- venno sleduet levaya kruglaya skobka, schitaetsya opisannym po kontekstu, kak predstavlyayushchij funkciyu, vozvrashchayushchuyu celoe; sledovatel'no chashche vsego vstrechayushchijsya sluchaj funkcii, vozv- rashchayushchej 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 sravnivayutsya tipy fakticheskih argumentov s tipami formal'nyh argumentov. Esli preobrazovanie neobhodimo, ispol'zujte yavnoe preobrazo- vanie. Pri podgotovke k vyzovu funkcii delaetsya kopiya kazhdogo fakticheskogo parametra; takim obrazom, vse peredachi argumen- tov v yazyke Si osushchestvlyayutsya strogo po znacheniyu. Funkciya mozhet izmenyat' znacheniya svoih formal'nyh parametrov, no eti izmeneniya ne vliyayut na znacheniya fakticheskih parametrov. S drugoj storony, imeetsya vozmozhnost' peredavat' ukazatel', pri etom funkciya mozhet izmenyat' znachenie ob容kta, na kotoryj etot ukazatel' ukazyvaet. Poryadok vychisleniya argumentov v yazyke ne opredelen; razlichnye kompilyatory vychislyayut po raz- nomu. 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 (sos- tavlennaya iz znakov - i >) i identifikator, yavlyaetsya vyrazhe- niem. 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. -12- Sledovatel'no, vyrazhenie e1->mos yavlyaetsya tem zhe samym, chto i vyrazhenie (*e1).mos. Struktury i ob容dineniya rassmat- rivayutsya nizhe. Privedennye zdes' pravila ispol'zovaniya struktur i ob容dinenij ne navyazyvayutsya strogo, dlya togo chtoby imet' vozmozhnost' obojti mehanizm tipov (sm. "Dopol- nitel'naya informaciya o tipah"). 4.2. Unarnye operacii Vyrazhenie s unarnymi operaciyami gruppiruetsya sprava nalevo. 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: vyrazhenie dolzhno byt' ukazatelem, a rezul'tatom yavlyaetsya l_znachenie, ssylayushcheesya na tot ob容kt, na kotoryj ukazyvaet vyrazhenie. Esli tipom vyrazheniya yavlyaetsya ukazatel' na ..., to tipom 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 ~ (simvol "til'da", nahoditsya na klavishe ^ v nizhnem registre) daet obratnyj kod (ili dopolnenie do edi- nicy) svoego operanda. Vypolnyayutsya obychnye arifmeticheskie preobrazovaniya. Operand dolzhen byt' celochislennogo tipa. -13- Ob容kt, na kotoryj ssylaetsya operand l_znacheniya pre- fiksnoj operacii ++, uvelichivaetsya. Znacheniem yavlyaetsya novoe znachenie operanda, no eto ne l_znachenie. Vyrazhenie ++h ekvi- valentno h += 1 . Informaciyu o preobrazovaniyah smotri v raz- bore operacii slozheniya (p. 0.4) i operacii prisvaivaniya (p. 0.14). Prefiksnaya operaciya -- analogichna prefiksnoj operacii ++, no privodit k umen'sheniyu svoego operanda l_znacheniya. Pri primenenii postfiksnoj operacii ++ k l_znacheniyu rezul'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 rezul'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 pered vyrazheniem, vyzyvaet preobrazovanie znacheniya etogo vyrazheniya k ukazannomu tipu. |ta konstrukciya nazyvaetsya perevod (cast). Imena tipov opisyvayutsya v sleduyushchem razdele. Operaciya sizeof vydaet razmer svoego operanda v bajta. (Ponyatie bajt v yazyke ne opredeleno, razve tol'ko, kak zna- chenie operacii sizeof. Odnako vo vseh sushchestvuyushchih realiza- ciyah bajtom yavlyaetsya prostranstvo, neobhodimoe dlya hraneniya ob容kta tipa char). Pri primenenii k massivu rezul'tatom yavlyaetsya 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 vyzove procedur, podobnyh raspredelitelyam pamyati, i v sistemah vvoda- vyvoda. Operaciya sizeof mozhet byt' takzhe primenena i k zaklyu- chennomu 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)) - 2. 4.3. Mul'tiplikativnye operacii Mul'tiplikativnye operacii *, /, i % gruppiruyutsya sleva napravo. Vypolnyayutsya obychnye arifmeticheskie preobrazovaniya. -14- mul'tiplikativnoe_vyrazhenie: vyrazhenie * vyrazhenie vyrazhenie / vyrazhenie vyrazhenie % vyrazhenie Binarnaya operaciya * oznachaet umnozhenie. Operaciya * associativna, 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 nulyu, no esli odin iz operandov otricatelen, to forma useche- niya zavisit ot ispol'zuemoj mashiny. 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 dolzhny byt' celogo tipa. 4.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 takzhe skladyvat' ukazatel' na ob容kt v massive i znachenie lyubogo celochislennogo tipa. Poslednee preobrazuetsya v adresnoe smeshchenie posredstvom umnozheniya ego na dlinu ob容kta, na kotoryj ukazyvaet etot ukazatel'. Rezul'tatom yavlyaetsya uka- zatel' togo zhe samogo tipa, chto i ishodnyj ukazatel', koto- ryj ukazyvaet na drugoj ob容kt v tom zhe massive, smeshchennyj 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 raz- reshayutsya. Operaciya + associativna, i vyrazhenie s neskol'kimi slo- zheniyami na odnom i tom zhe urovne mogut byt' pereuporyadocheny kompilyatorom. -15- Rezul'tatom operacii - yavlyaetsya raznost' operandov. Vypolnyayutsya obychnye arifmeticheskie preobrazovaniya. Krome togo, iz ukazatelya mozhet byt' vychteno znachenie lyubogo celo- chislennogo tipa, prichem, provodyatsya te zhe samye preobrazova- niya, chto i pri operacii slozheniya. Esli vychitayutsya dva ukazatelya na ob容kty odinakovogo tipa, to rezul'tat preobrazuetsya (deleniem na dlinu ob容kta) k tipu int, predstavlyaya soboj chislo ob容ktov, razdelyayushchih ukazyvaemye 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 ukaza- teli na ob容kty odinakovogo tipa ne obyazany otlichat'sya na velichinu, kratnuyu dline ob容kta. 4.5. Operacii sdviga Operacii sdviga << i >> gruppiruyutsya sleva napravo. Dlya obeih operacij provodyatsya obychnye arifmeticheskie preob- razovaniya ih operandov, kazhdyj iz kotoryh dolzhen byt' celogo 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 yavlyaetsya e1, sdvinutoe vpravo na e2 bitovyh pozicij. Esli e1 imeet tip unsigned, to sdvig vpravo garantirovanno budet logicheskim (zapolnenie nulem); v protivnom sluchae sdvig mozhet byt' (kak na CM-|VM) arifmeticheskim (osvobozhdayushchiesya bity zapolnyayutsya kopiej znakovogo bita). 4.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', a oznachaet ((a<b)<c). vyrazhenie_otnosheniya: vyrazhenie < vyrazhenie vyrazhenie > vyrazhenie vyrazhenie <= vyrazhenie vyrazhenie >= vyrazhenie Operacii < (men'she), > (bol'she), <= (men'she ili ravno) i >= (bol'she ili ravno) dayut 0, esli ukazannoe otnoshenie lozhno, i 1, esli ono istinno. Rezul'tat imeet tip int. Vypolnyayutsya -16- obychnye arifmeticheskie preobrazovaniya. Mogut sravnivat'sya dva ukazatelya; rezul'tat zavisit ot otnositel'nogo raspolo- zheniya ukazyvaemyh ob容ktov v adresnom prostranstve. Sravne- nie ukazatelej perenosimo tol'ko v tom sluchae, esli ukaza- teli ukazyvayut na ob容kty iz odnogo i togo zhe massiva. 4.7. Operacii ravenstva vyrazhenie_ravenstva: vyrazhenie == vyrazhenie vyrazhenie != vyrazhenie Operacii == (ravno)