oyashchee vremya kompilyator na PDP-11 ne inicializiruet struktury, kotorye soderzhat polya bitov, i ne dopuskaet nekotorye operacii prisvaivaniya v op- redelennyh kontekstah, svyazannyh s ispol'zovaniem znacheniya prisvaivaniya. 25. Anahronizmy Tak kak yazyk "C" yavlyaetsya razvivayushchimsya yazykom, v staryh programmah mozhno vstretit' nekotorye ustarevshie konstrukcii. Hotya bol'shinstvo versij kompilyatora podderzhivaet takie anah- ronizmy, oni v konce koncov ischeznut, ostaviv za soboj tol'- ko problemy perenosimosti. V rannih versiyah "C" dlya problem prisvaivaniya ispol'zo- valas' forma =ON, a ne ON=, privodya k dvusmyslennostyam, ti- pichnym primerom kotoryh yavlyaetsya X = -1 gde X fakticheski umen'shaetsya, poskol'ku operacii = i - pri- mykayut drug k drugu, no chto vpolne moglo rassmatrivat'sya i kak prisvaivanie -1 k X. Sintaksis inicializatorov izmenilsya: ran'she znak ravens- tva, s kotorogo nachinaetsya inicializator, otsutstvoval, tak chto vmesto INT X = 1; ispol'zovalos' INT X 1; izmenenie bylo vneseno iz-za inicializacii INT F (1+2) kotoraya dostatochno sil'no napominaet opredelenie funkcii, chtoby smutit' kompilyatory. 26. Svodka sintaksicheskih pravil |ta svodka sintaksisa yazyka "C" prednaznachena skoree dlya oblegcheniya ponimaniya i ne yavlyaetsya tochnoj formulirovkoj yazy- ka. 26.1. Vyrazheniya Osnovnymi vyrazheniyami yavlyayutsya sleduyushchie: vyrazhenie: pervichnoe-vyrazhenie * vyrazhenie & vyrazhenie - vyrazhenie ! Vyrazhenie \^ vyrazhenie ++ L-znachenie -- L-znachenie L-znachenie ++ L-znachenie -- SIZEOF vyrazhenie (imya tipa) vyrazhenie vyrazhenie binarnaya-operaciya vyrazhenie vyrazhenie ? Vyrazhenie : vyrazhenie L-znachenie operaciya-prisvaivaniya vyrazhenie vyrazhenie , vyrazhenie pervichnoe vyrazhenie: identifikator konstanta stroka (vyrazhenie) pervichnoe-vyrazhenie (spisok vyrazhenij neob) pervichnoe-vyrazhenie [vyrazhenie] L-znachenie . Identifikator pervichnoe vyrazhenie -> identifikator L-znachenie: identifikator pervichnoe-vyrazhenie [vyrazhenie] L-znachenie . Identifikator pervichnoe-vyrazhenie -> identifikator * vyrazhenie (L-znachenie) Operacii pervichnyh vyrazhenij () [] . -> imeyut samyj vysokij prioritet i gruppiruyutsya sleva napravo. Unarnye operacii * & - ! \^ ++ -- SIZEOF(Imya tipa) imeyut bolee nizkij prioritet, chem operacii pervichnyh vyrazhe- nij, no bolee vysokij, chem prioritet lyuboj binarnoj opera- cii. |ti operacii gruppiruyutsya sprava nalevo. Vse binarnye operacii i uslovnaya operaciya (prim. Perevod.: uslovnaya ope- raciya gruppiruetsya sprava nalevo; eto izmenenie vneseno v yazyk v 1978 g.) gruppiruyutsya sleva napravo i ih prioritet ubyvaet v sleduyushchem poryadke: Binarnye operacii: * / % + - >> << < > <= >= == != & \^ \! && \!\! ?: Vse operacii prisvaivaniya imeyut odinakovyj prioritet i grup- piruyutsya sprava nalevo. Operacii prisvaivaniya: = += -= *= ?= %= >>= <<= &= \^= \!= Operaciya zapyataya imeet samyj nizkij prioritet i gruppiruetsya sleva napravo. 26.2. Opisaniya Opisanie: specifikatory-opisaniya spisok-inicializiruemyh-opisatelej neob; --------------------------------------------------------- specifikatory-opisaniya: specifikator-tipa specifikatory-opisaniya neob specifikator-klassa-pamyati specifikatory-opisaniya neob specifikator-klassa-pamyati: AUTO STATIC EXTERN REGISTER TYPEDEF specifikator-tipa: CHAR SHORT INT LONG UNSIGNED FLOAT DOUBLE specifikator-struktury-ili-ob容dineniya opredelyayushchee-tip-imya spisok-inicializiruemyh-opisatelej: inicializiruemyj-opisatel' inicializiruemyj-opisatel', spisok-inicializiruemyh-opisatelej inicializiruemyj-opisatel' opisatel'-inicializator neob opisatel': identifikator (opisatel') * opisatel' opisatel' () opisatel' [konstantnoe vyrazhenie neob] specifikator-struktury-ili-ob容dineniya: STRUCT spisok-opisatelej-struktury STRUCT identifikator \(spisok-opisanij-struktury\) STRUCT identifikator UNION \(spisok-opisanij-struktury\) UNION identifikator \(spisok-opisanij-struktury\) UNION identifikator spisok-opisanij-struktcry: opisanie-struktury opisanie-struktury spisok-opisanij-struktury opisanie struktury: specifikator-tipa spisok-opisatelej-struktury: spisok-opisatelej-struktury opisatel'-struktury opisatel'-struktury,spisok-opisatelej-struktury opisatel'-struktury: opisatel' opisatel': konstantnoe vyrazhenie :konstantnoe-vyrazhenie inicializator: = vyrazhenie = \(spisok-inicializatora\) = \(spisok-inicializatora\) spisok inicializatora: vyrazhenie spisok-inicializatora,spisok-inicializatora \(spisok-inicializatora\) imya-tipa: specifikator-tipa abstraktnyj-opisatel' abstraktnyj-opisatel': pusto \(abstraktnyj-opisatel'\) * abstraktnyj-opisatel' abstraktnyj-opisatel' () abstraktnyj-opisatel' [konstantnoe-vyrazhenie neob] opredelyayushchee-tip-imya: identifikator 26.3. Operatory sostavnoj-operator: \(spisok-opisanij spisok-operatorov neob neob\) spisok-opisanij: opisanie opisanie spisok-opisanij spisok-operatorov: operator operator spisok-operatorov operator: sostavnoj operator vyrazhenie; IF (vyrazhenie) operator IF (vyrazhenie) operator ELSE operator WHILE (vyrazhenie) operator DO operator WHILE (vyrazhenie); FOR(vyrazhenie-1 ;vyrazhenie-2 ;vyrazhenie-3 ) neob neob neob operator SWITCH (vyrazhenie) operator CASE konstantnoe-vyrazhenie : operator DEFAULT: operator BREAK; CONTINUE; RETURN; RETURN vyrazhenie; GOTO identifikator; identifikator : operator ; 26.4. Vneshnie opredeleniya Programma: vneshnee-opredelenie vneshnee-opredelenie programma vneshnee-opredelenie: opredelenie-funkcii opredelenie-dannyh opredelenie-funkcii: specifikator-tipa opisatel'-funkcii telo-funkcii neob opisatel'-funkcii: opisatel' (spisok-parametrov ) neob spisok-parametrov: idetifikator identifikator , spisok-parametrov telo-funkcii: spisok-opisanij-tipa operator-funkcii operator-funkcii: \(spisok opisanij spisok-operatorov\) neob opredelenie dannyh: EXTERN specifikator tipa spisok neob neob inicializiruemyh opisatelej ; neob STATIC specifikator tipa spisok neob neob inicializiruemyh opisatelej neob; 26.5. Preprocessor #DEFINE identifikator stroka-leksem #DEFINE #DEFINE identifikator(identifikator,...,identifikator)str #UNDEF identifikator #INCLUDE "imya-fajla" #INCLUDE <imya-fajla> #IF konstantnoe-vyrazhenie #IFDEF identifikator #IFNDEF identifikator #ELSE #ENDIF #LINE konstanta identifikator Poslednie izmeneniya yazyka "C" (15 noyabrya 1978 g.) 27. Prisvaivanie struktury Struktury mogut byt' prisvoeny, peredany funkciyam v ka- chestve argumentov i vozvrashcheny funkciyam. Tipy uchastvuyushchih operandov dolzhny ostavat'sya temi zhe samymi. Drugie pravdopo- dobnye operatory, takie kak sravnenie na ravenstvo, ne byli realizovany. V realizacii vozvrashcheniya struktur funkciyami na PDP-11 imeetsya kovarnyj defekt: esli vo vremya vozvrata proishodit preryvanie i ta zhe samaya funkciya peenterabel'no vyzyvaetsya vo vremya etogo preryvaniya, to znachenie vozvrashchaemoe iz per- vogo vyzova, mozhet byt' isporcheno. |ta trudnost' mozhet voz- niknut' tol'ko pri nalichii istinnogo preryvaniya, kak iz ope- racionnoj sistemy, tak i iz programmy pol'zovatelya, preryva- niya, kotoroe sushchestvenno dlya ispol'zovaniya signalov; obychnye rekursivnye vyzovy sovershenno bezopasny. 28. Tip perechisleniya Vveden novyj tip dannyh,analogichnyj skalyarnym tipam yazy- ka paskal'. K specifikatoru-tipa v ego sintaksicheskom opisa- nii v razdele 8.2. Prilozheniya a sleduet dobavit' specifikator-perechisleniya ------------------------- s sintaksisom pecifikator-perechisleniya: ------------------------- ENUM spisok-perechisleniya ------------------- ENUM identifikator spisok-perechisleniya ------------- ------------------- ENUM identifikator ------------- cpisok-perechisleniya: ------------------- perechislyaemoe ------------- spisok-perechisleniya, perechislyaemoe ------------------- ------------- perechislyaemoe: -------------- identifikator ------------- identifikator = konstantnoe vyrazhenie ------------- --------------------- Rol' identifikatora v specifikatore-perechisleniya pol- nost'yu analogichna roli yarlyka struktury v specifikato- re-struktury; identifikator oboznachaet opredelennoe perechis- lenie. Naprimer, opisanie ENUM COLOR \(RED, WHITE, BLACK, BLUE \); . . . ENUM COLOR *CP, COL; Ob座avlyaet identifikator COLOR yarlykom perechisleniya tipa, opisyvayushchego razlichnye cveta i zatem ob座avlyaet CP ukazatelem na ob容kt etogo tipa, a COL - ob容ktom etogo tipa. Identifikatory v spiske-perechisleniya opisyvayutsya kak konstanty i mogut poyavit'sya tam, gde trebuyutsya (po konteks- tu) konstanty. Esli ne ispol'zuetsya vtoraya forma perechislyae- mogo (s ravestvom =), to velichiny konstant nachinayutsya s 0 i vozrastayut na 1 v sootvetstvii s prochteniem ih opisaniya sle- va na pravo. Perechislyaemoe s prisvoeniem = pridaet sootvets- tvuyushchemu identifikatoru ukazannuyu velichinu; posleduyushchie identifikatory prodolzhayut progressiyu ot pripisannoj velichi- ny. Vse yarlyki perechisleniya i konstanty mogut byt' razlichny- mi i nepohozhimi na yarlyki i chleny struktur dazhe pri uslovii ispol'zovaniya odnogo i togo zhe mnozhestva identifikatorov. Ob容kty dannogo tipa perechisleniya rassmatrivayutsya kak ob容kty, imeyushchie tip, otlichnyj ot lyubyh tipov i kontroliruyu- shchaya programma LINT soobshchaet ob oshibkah nesootvetstviya tipov. V realizacii na PDP-11 so vsemi perechislyaemymi peremennymi operiruyut tak, kak esli by oni imeli tip INT. 29. Tablica izobrazhenij nepechatnyh simvolov yazyka "C". V dannoj tablice privedeny izobrazheniya nekotoryh simvo- lov (figurnye skobki i t.d.) yazyka "C", kotoryh mozhet ne okazat'sya v znakovom nabore displeya ili pechatayushchego ustrojs- tva. ------------------------------------------------- ! Znachenie ! Izobrazhenie ** ! ! ! V tekste ! ------------------------------------------------- ! Figurnaya otkryvayushchayasya ! ! ! Skobka ! \( ! ! ! ! ------------------------------------------------- ! Figurnaya zakryvayushchayasya ! ! ! Skobka ! \) ! ! ! ! ------------------------------------------------- ! Vertikal'naya ! ! ! CHerta ! \! ! ! ! ! ------------------------------------------------- ! ! ! ! Apostorof ! \' ! ! ! ! ------------------------------------------------- ! Volnistaya ! ! ! CHerta ! \^ ! ! ! ! ------------------------------------------------- ** P_r_i_m_e_ch_a_n_i_e: Izobrazheniya privedeny dlya operacionoj sistemy UNIX. Pri rabote kompilyatora "C" pod upravleniem lyuboj drugoj operaci- onnoj sistemy, neobhodimo vospol'zovat'sya sootvetstvuyushchim rukovodstvom dlya dannoj sistemy.