B'ern Straustrap. Spravochnoe rukovodstvo po C++ --------------------------------------------------------------- Vtoroe dopolnennoe izdanie ---------------------------------------------------------------  * SPRAVOCHNOE RUKOVODSTVO R.1 Vvedenie |to spravochnoe rukovodstvo opisyvaet yazyk programmirovaniya S++ po sostoyanii na maj 1991. S++ - yazyk programmirovaniya obshchego naznacheniya, baziruyushchijsya na yazyke programmirovaniya S X. X "The C Programming Language" B. Kernighan, D. Ritchie. Prentice Hall, 1978, 1988. Est' russkij perevod: "YAzyk programmirovaniya S. Zadachi po yazyku S" B. Kernigan, D. Ritchi, A. F'yuer. "Finansy i statistika". 1984 V dopolnenie k vozmozhnostyam S yazyk S++ predostavlyaet klassy, funkcii podstanovki, peregruzku operacij, peregruzku imen funkcij, postoyannye tipy, ssylki, operatory upravleniya svobodnoj pamyat'yu, proverku parametrov funkcij i privedenie tipov. Vse rasshireniya S summiruyutsya v $$R.18.1. Razlichiya mezhdu S++ i ANSI C++ privedeny v $$R.18.2 X. X American National Standard X3.159-1989. Amerikanskij nacional'nyj standart. Rasshireniya S++ versii 1985 goda do dannogo opisaniya summiruyutsya v $$R.18.1.2. Razdely, otnosyashchiesya k shablonam tipa ($$R.14) i upravleniyu osobymi situaciyami ($$R.15), yavlyayutsya mestami planiruemyh rasshirenij yazyka. R.1.1 Obzor |to rukovodstvo soderzhit sleduyushchee: 1. Vvedenie. 2. Soglasheniya o leksicheskih ponyatiyah. 3. Osnovnye ponyatiya. 4. Standartnye preobrazovaniya. 5. Vyrazheniya. 6. Operatory. 7. Opisaniya. 8. Opisateli. 9. Klassy. 10. Proizvodnye klassy. 11. Kontrol' dostupa k chlenam. 12. Special'nye funkcii-chleny. 13. Peregruzka. 14. SHablony tipov. 15. Upravlenie osobymi situaciyami. 16. Preprocessornaya obrabotka. Prilozhenie A: Svodka sintaksisa Prilozhenie B: Sovmestimost' R.1.2 Zapis' sintaksisa V zapisi sintaksisa yazyka v etom rukovodstve sintaksicheskie ponyatiya oboznachayutsya kursivom, a literal'nye slova i simvoly shriftom postoyannoj shiriny. Varianty perechislyayutsya na otdel'nyh strokah, za isklyucheniem teh nemnogih sluchaev, kogda dlinnyj spisok variantov daetsya na odnoj stroke s pometkoj "odin iz". Neobyazatel'nyj terminal'nyj ili neterminal'nyj simvol oboznachaetsya s pomoshch'yu nizhnego indeksa "opt", poetomu { vyrazhenie opt } oznachaet neobyazatel'noe vyrazhenie, zaklyuchennoe v figurnye skobki. R.2 Soglasheniya o leksicheskih ponyatiyah Programma na S++ sostoit iz odnogo ili neskol'kih fajlov ($$R.3.3). S logicheskoj tochki zreniya fajl transliruetsya za neskol'ko prohodov. Pervyj prohod sostoit v preprocessornoj obrabotke ($$R.16), na kotoroj proishodit vklyuchenie fajlov i makropodstanovka. Rabota preprocessora upravlyaetsya s pomoshch'yu komand, yavlyayushchihsya strokami, pervyj simvol kotoryh otlichnyj ot probela est' # ($$R2.1). Rezul'tat raboty preprocessora est' posledovatel'nost' leksem. Takuyu posledovatel'nost' leksem, t.e. fajl posle preprocessornoj obrabotki, nazyvayut edinicej translyacii. R.2.1 Leksemy Sushchestvuyut leksemy pyati vidov: identifikatory, sluzhebnye slova, literaly, operacii i razlichnye razdeliteli. Probely, vertikal'naya i gorizontal'naya tabulyaciya, konec stroki, perevod stroki i kommentarii (vse vmeste "obobshchennye" probely), kak ukazano nizhe, ignoriruyutsya, za isklyucheniem togo, chto oni otdelyayut leksemy. Obobshchennye probely nuzhny, chtoby razdelit' stoyashchie ryadom identifikatory, sluzhebnye slova i konstanty. Esli vhodnoj potok razobran na leksemy do dannogo simvola, to sleduyushchej leksemoj schitaetsya leksema s maksimal'no vozmozhnoj dlinoj, kotoraya nachinaetsya s etogo simvola. R.2.2 Kommentarii Simvoly /* nachinayut kommentarij, kotoryj zavershaetsya simvolami */. Takie kommentarii ne mogut byt' vlozhennymi. Simvoly // nachinayut kommentarij, kotoryj zavershaetsya koncom etoj stroki. Simvoly //, /* i */ ne imeyut special'nogo naznacheniya v kommentarii // i rassmatrivayutsya kak obychnye simvoly. Analogichno simvoly // i /* ne imeyut special'nogo naznacheniya vnutri kommentariya /*. R.2.3 Identifikatory Identifikator - eto posledovatel'nost' bukv i cifr proizvol'noj dliny. Pervyj simvol dolzhen byt' bukvoj, simvol podcherkivaniya _ schitaetsya bukvoj. Propisnye i strochnye bukvy razlichayutsya. Vse simvoly sushchestvenny. R.2.4 Sluzhebnye slova Perechislennye nizhe identifikatory fiksiruyutsya kak sluzhebnye slova i v drugom smysle ne mogut ispol'zovat'sya: asm continue float new signed try auto default for operator sizeof typedef break delete friend private static union case do goto protected struct unsigned catch double if public switch virtual char else inline register template void class enum int return this volatile const extern long short throw while V dopolnenie k etomu identifikatory, soderzhashchie dvojnoe podcherkivanie (__) rezerviruyutsya dlya realizacij S++ i standartnyh bibliotek i pol'zovateli ne dolzhny upotreblyat' ih. V predstavlenii programmy na S++ v kodirovke ASCII ispol'zuyutsya v kachestve operacij ili razdelitelej sleduyushchie simvoly: ! % ^ & * ( ) - + = { } | ~ [ ] \ ; ' : " < > ? , . / a sleduyushchie kombinacii simvolov ispol'zuyutsya dlya zadaniya operacij: -> ++ -- .* ->* << >> <= >= == != && || *= /= %= += -= <<= >>= &= ^= |= :: Kazhdaya operaciya schitaetsya otdel'noj leksemoj. V dopolnenii k etomu sleduyushchie simvoly rezerviruyutsya dlya preprocessora: # ## Opredelennye, zavisyashchie ot realizacii, svojstva, takie kak tip operacii sizeof ($$R5.3.2) ili diapazony bazovyh tipov ($$R.3.6.1) opredelyayutsya v standartnyh zagolovochnyh fajlah ($$R.16.4) <float.h> <limits.h> <stddef.h> |ti fajly yavlyayutsya chast'yu ANSI standarta dlya S. Krome togo zagolovochnye fajly <new.h> <stdarg.h> <stdlib.h> opredelyayut tipy samyh vazhnyh bibliotechnyh funkcij. Dva poslednih fajla vhodyat v ANSI standart dlya S, fajl <new.h> otnositsya tol'ko k S++. R.2.5 Literaly Est' neskol'ko vidov literalov (chasto nazyvaemyh "konstantami"). literal: celaya konstanta simvol'naya konstanta konstanta s plavayushchej tochkoj stroka literalov R.2.5.1 Celye konstanty Vse celye konstanty, sostoyashchie iz posledovatel'nosti cifr, schitayutsya desyatichnymi (osnovanie schisleniya desyat'), esli tol'ko oni ne nachinayutsya s 0 (cifra nol'). Posledovatel'nost' cifr, nachinayushchayasya s 0, schitaetsya vos'merichnym celym (osnovanie schisleniya vosem'). Cifry 8 i 9 ne yavlyayutsya vos'merichnymi. Posledovatel'nost' cifr, nachinayushchayasya s 0x ili 0X, schitaetsya shestnadcaterichnym celym (osnovanie schisleniya shestnadcat'). SHestandcaterichnye cifry mogut sostoyat' iz simvolov ot a ili A do f ili F s desyatichnymi znacheniyami ih ot desyati do pyatnadcati. Naprimer, chislo dvenadcat' mozhno zapisat' kak 12, 014 ili 0XC. Tip celoj konstanty opredelyaetsya ee predstavleniem, znacheniem i okonchaniem. Esli ona desyatichnaya i ne imeet okonchaniya, ee tip budet pervym podhodyashchim dlya ee znacheniya iz sleduyushchih tipov: int, long int, unsigned long int. Esli ona vos'merichnaya ili shestnadcaterichnaya i ne imeet okonchaniya, ee tip budet pervym podhodyashchim dlya ee znacheniya iz sleduyushchih: int, unsigned int, long int, unsigned long int. Esli ona okanchivaetsya simvolom u ili U, ee tip budet pervym podhodyashchim dlya ee znacheniya iz sleduyushchih: unsigned int, unsigned long int. Esli ona okanchivaetsya simvolom l ili L, ee tip budet pervym podhodyashchim dlya ee znacheniya iz sleduyushchih: long int, unsigned long int. Esli ona okanchivaetsya na ul, lu, uL, Lu, Ul, lU, UL ili LU, ee tipom budet unsigned long int. R.2.5.2 Simvol'nye konstanty Simvol'noj konstantoj yavlyaetsya odin ili neskol'ko simvolov, zaklyuchennye v odinochnye kavychki, naprimer 'x'. Konstanta iz odnogo simvola imeet tip char. Znachenie konstanty iz odnogo simvola est' poryadkovyj nomer simvola v tablice kodirovki simvolov na dannoj mashine. Simvol'nye konstanty iz neskol'kih simvolov imeyut tip int. Znachenie takoj konstanty zavisit ot realizacii. Nekotorye simvoly, ne imeyushchie graficheskogo predstavleniya, kak odinochnaya kavychka ',dvojnaya kavychka ", znak voprosa ?, obratnaya drobnaya cherta \, mozhno predstavlyat' kombinaciej simvolov (nachinayushchejsya s \) v sootvetstvii s privodimoj nizhe tablicej: konec stroki NL (LF) \n gorizontal'naya tabulyaciya HT \t vertikal'naya tabulyaciya VT \v shag nazad BS \b vozvrat karetki CR \r perevod formata (avtoregistr) FF \f signal BEL \a obratnaya drobnaya cherta \ \\ znak voprosa ? \? odinochnaya kavychka ' \' dvojnaya kavychka " \" vos'merichnoe chislo ooo \ooo shestnadcaterichnoe chislo hhh \xhhh Esli za obratnoj drobnoj chertoj sleduet simvol, otlichnyj ot perechislennyh, rezul'tat neopredelen. Kombinaciya \ooo sostoit iz obratnoj drobnoj cherty, a kotoroj sleduyut odna, dve ili tri vos'merichnye cifry. Schitaetsya, chto oni opredelyayut znachenie iskomogo simvola. Kombinaciya \xhhh sostoit iz iz obratnoj drobnoj cherty, za kotoroj sleduet x, a za nim, v svoyu ochered', sleduet posledovatel'nost' shestnadcaterichnyh cifr. Schitaetsya, chto ona zadaet znachenie iskomogo simvola. Net ogranicheniya na dlinu etoj posledovatel'nosti shestnadcaterichnyh cifr. Posledovatel'nost' vos'merichnyh ili shestnadcaterichnyh cifr okanchivaetsya, kogda vstrechaetsya pervyj simvol, kotoryj ne est' vos'merichnaya ili shestnadcaterichnaya cifra sootvetstvenno. Esli znachenie simvol'noj konstanty prevoshodit maksimal'noe iz char, to ono opredelyaetsya realizaciej. Simvol'naya konstanta, kotoroj neposredstvenno predshestvuet bukva L, yavlyaetsya shirokoj simvol'noj konstantoj, naprimer, L'ab'. Takie konstanty imeyut tip wchar_t, yavlyayushchijsya celochislennym tipom ($$R.3.6.1), opredelennom v standartnom zagolovochnom fajle <stddef.h>. SHirokie simvoly prednaznacheny dlya takogo nabora simvolov, gde znachenie simvola ne pomeshchaetsya v odin bajt. R.2.5.3 Konstanty s plavayushchej tochkoj Konstanty s plavayushchej tochkoj sostoyat iz celoj chasti, simvola tochka, drobnoj chasti, e ili E, celogo pokazatelya s vozmozhnym znakom i vozmozhnym okonchaniem, ukazyvayushchim tip. Celaya i drobnaya chasti sostoyat iz posledovatel'nosti desyatichnyh (osnovanie schisleniya desyat') cifr. Ili celaya chast', ili drobnaya chast' (no ne obe) mogut otsutstvovat'. Ili tochka, ili simvol e (ili E) vmeste s pokazatelem mogut otsutstvovat' (no ne oba). Tip konstanty s plavayushchej tochkoj est' double, esli tol'ko on ne zadan yavno s pomoshch'yu okonchaniya. Okonchaniya f ili F zadayut tip float, okonchaniya l ili L zadayut tip long double. R.2.5.4 Stroki literalov Stroka literalov est' posledovatel'nost' simvolov (kak oni opredeleny v $$R.2.5.2), zaklyuchennaya v dvojnye kavychki, t.e. "...". Stroka imeet tip "massiv simvolov" i klass pamyati static ($$R.3.5), ona inicializiruetsya zadannymi simvolami. Budut li vse stroki razlichny (t.e. hranitsya v otdel'nyh ob容ktah), opredelyaetsya realizaciej. Sosednie stroki literalov konkateniruyutsya. Simvoly v strokah, poluchennyh pri konkatenacii, hranyatsya otdel'no. Naprimer, posle konkatenacii "\xA" "B" stroka budet soderzhat' dva simvola '\xA' i 'B' (a ne odin shestnadcaterichnyj simvol '\xAB'). Posle vseh neobhodimyh konkatenacij k stroke dobavlyaetsya simvol '\0', chtoby programma, chitayushchaya stroku, mogla opredelit' ee konec. Razmer stroki raven chislu vseh ee simvolov, vklyuchaya simvol zavershitel' stroki. Vnutri stroki pered simvolom dvojnoj kavychki " dolzhen idti simvol \. Stroka literalov, pered kotoroj neposredstvenno idet simvol L, schitaetsya shirokosimvol'noj strokoj, naprimer, L"asdf". Takaya stroka imeet tip "massiv elementov tipa wchar_t", gde wchar_t celochislennyj tip, opredelennyj v standartnom zagolovochnom fajle <stddef.h>. Rezul'tat konkatenacii obychnyh i shirokosimvol'nyh strok literalov neopredelen. R.3 Osnovnye ponyatiya Imya oboznachaet ob容kt, funkciyu, mnozhestvo funkcij, element perechisleniya, tip, chlen klassa, shablon tipa, znachenie ili metku. Imya stanovitsya izvestno v programme s pomoshch'yu opisaniya. Imya mozhno ispol'zovat' tol'ko v predelah chasti programmy, nazyvaemoj oblast'yu vidimosti imeni. Imya imeet tip, kotoryj zadaet ego ispol'zovanie. Imya, ispol'zuemoe v bolee chem odnoj edinice translyacii, mozhet oboznachat' odin i tot zhe (a mozhet i raznye) ob容kt, funkciyu, tip, shablon tipa ili znachenie, v zavisimosti ot komponovki ($$R.3.3) etih edinic translyacii. Ob容kt imeet oblast' dlya ego hraneniya ($$R.3.7). Poimenovannyj ob容kt imeet klass pamyati ($$R.3.5), kotoryj opredelyaet ego vremya zhizni. Interpretaciya znachenij, hranyashchihsya v ob容kte, opredelyaetsya tipom vyrazheniya, zadayushchego dostup k ob容ktu. R.3.1 Opisaniya i opredeleniya Opisanie ($$r.7) delaet izvestnym v programme odno ili neskol'ko imen. Opisanie schitaetsya opredeleniem, esli tol'ko ono ne opisyvaet funkciyu bez zadaniya ee tela ($$R.8.3), ne soderzhit opisatelya extern ($$R.7.11), ne imeet chasti inicializacii ili tela funkcii, ne yavlyaetsya opisaniem staticheskogo chlena dannyh v opisanii klassa ($$R.9.4), ne yavlyaetsya opisaniem imeni klassa ($$R.9.1), ne yavlyaetsya opisaniem typedef ($$R.7.1.3). Nizhe privedeny primery opredelenij: int a; extern const c = 1; int f(int x) { return x+a; } struct S { int a; int b; }; enum { up, down }; togda kak nizhe sleduyut tol'ko opisaniya: extern int a; extern const c; int f(int); struct S; typedef int Int; Dlya kazhdogo ob容kta, funkcii, klassa i elementa perechisleniya, ispol'zuemyh v programme, dolzhno byt' tol'ko odno opredelenie ($$R.3.3). Esli funkciya nikogda ne vyzyvaetsya i ee adres nikogda ne ispol'zuetsya, ee ne nuzhno opredelyat'. Analogichno, esli imya klassa ispol'zuetsya tol'ko tak, chto ne trebuetsya znat' opredeleniya klassa, to takoj klass ne nado opredelyat'. R.3.2 Oblast' vidimosti Sushchestvuet chetyre oblasti vidimosti: lokal'naya, funkciya, fajl i klass. Lokal'naya: Imya, opisannoe v bloke ($$R.6.3), yavlyaetsya lokal'nym v etom bloke i mozhet ispol'zovat'sya tol'ko v nem i v blokah, soderzhashchihsya v etom bloke i poyavlyayushchihsya posle momenta opisaniya. Imena formal'nyh parametrov rassmatrivayutsya, kak esli by oni byli opisany v samom ob容mlyushchem bloke etoj funkcii. Funkciya: Metki ($$R.6.1) mozhno ispol'zovat' povsyudu v funkcii, v kotoroj oni opisany. Tol'ko metki imeyut oblast' vidimosti, sovpadayushchuyu s funkciej. Fajl: Imya opisannoe vne vseh blokov ($$R.6.3) i klassov ($$R.9) imeet oblast' vidimosti fajl i mozhet byt' ispol'zovano v edinice translyacii, v kotoroj ono poyavlyaetsya posle momenta opisaniya. Imena, opisannye s fajlovoj oblast'yu vidimosti, nazyvayutsya global'nymi. Klass: Imya chlena klassa yavlyaetsya lokal'nym v svoem klasse i ono mozhet byt' ispol'zovano tol'ko v funkcii-chlene etogo klassa ($$R.9.3), ili posle operacii . , primenyaemoj k ob容ktu dannogo klassa ($$R.5.2.4) ili ob容ktu proizvodnogo klassa($$R.10), ili posle operacii ->, primenyaemoj k ukazatelyu na ob容kt dannogo klassa ($$R.5.2.4) ili na ob容kt proizvodnogo klassa, ili posle operacii razresheniya :: ($$R.5.1), primenennoj k imeni dannogo ili proizvodnogo klassa. Imya, vvedennoe s pomoshch'yu operacii friend ($$R.11.4), prinadlezhit toj zhe oblasti opredelennosti, chto i klass, soderzhashchij opisanie friend. Klass, vpervye opisannyj v operatore return ili v tipe parametra, prinadlezhit k global'noj oblasti vidimosti. Special'nye soglasheniya dejstvuyut na imena, vvedennye pri opisanii parametrov funkcii ($$R.8.2.5) i v opisaniyah friend ($$R.11.4). Imya mozhet byt' skryto yavnym opisaniem togo zhe imeni v ob容mlyushchem bloke ili klasse. Skrytoe imya chlena klassa vse-taki mozhno ispol'zovat', esli ono predvaryaetsya imenem klassa, k kotoromu primenena operaciya :: ($$R.4.1, $$R.9.4, $$R.10). Skrytoe imya ob容kta, funkcii, tipa ili elementa perechisleniya s fajlovoj oblast'yu vidimosti mozhno ispol'zovat', esli ono predvaryaetsya unarnoj operaciej :: ($$R.5.1). V dopolnenii k etomu, imya klassa ($$R.9.1) mozhet byt' skryto imenem ob容kta, funkcii ili elementa perechisleniya, imeyushchego tu zhe oblast' vidimosti. Esli klass i ob容kt, ili funkciya, ili element perechisleniya opisany (v lyubom poryadke) s odinakovym imenem v odnoj oblasti vidimosti, to imya klassa stanovitsya skrytym. Imya klassa, skrytoe v lokal'noj oblasti vidimosti ili v oblasti vidimosti klassa imenem ob容kta, funkcii ili elementa perechisleniya, vse-taki mozhno ispol'zovat', esli predvarit' ego podhodyashchej specifikaciej class, struct ili union ($$R.7.1.6). Analogichno, skrytoe imya elementa perechisleniya mozhno ispol'zovat', esli predvarit' ego specifikaciej tipa enum ($$R.7.1.6). V $$R.10.4 privoditsya svodka pravil oblasti vidimosti. Momentom opisaniya imeni schitaetsya moment zaversheniya opisatelya imeni ($$R.8), predshestvuyushchej chasti inicializacii (esli ona est'). Naprimer, int x = 12; { int x = x; } Zdes' vtoroe x inicializiruetsya svoim sobstvennym (neopredelennym) znacheniem. Momentom opisaniya elementa perechisleniya schitaetsya moment srazu posle poyavleniya ego identifikatora, naprimer: enum { x = x }; Zdes' element perechisleniya x opyat' inicializiruetsya svoim sobstvennym (neopredelennym) znacheniem. R.3.3 Programma i svyazyvanie Programma sostoit iz odnogo ili neskol'kih fajlov, svyazyvaemyh vmeste ($$R.2). Fajl sostoit iz posledovatel'nosti opisanij. Imya s fajlovoj oblast'yu vidimosti, kotoroe yavno opisano kak static, yavlyaetsya lokal'nym v svoej edinice translyacii i mozhet ispol'zovat'sya dlya imenovaniya ob容ktov, funkcij i t.p. v drugih edinicah translyacii. Govoryat, chto takie imena imeyut vnutrennee svyazyvanie. Imya s fajlovoj oblast'yu vidimosti, kotoroe yavno opisano so specifikaciej inline, yavlyaetsya lokal'nym v svoej edinice translyacii. Imya s fajlovoj oblast'yu vidimosti, kotoroe yavno opisano so specifikaciej const i ne opisano yavno kak extern, schitaetsya lokal'nym v svoej edinice translyacii. To zhe verno dlya imeni klassa, kotoroe ne ispol'zovalos' v nelokal'nyh dlya dannoj edinicy translyacii opisaniyah ob容kta, funkcii ili klassa, i kotoryj ne imeet staticheskih chlenov ($$R.9.4), ne imeet funkcij-chlenov, krome podstanovok ($$R.9.3.2). Vsyakoe opisanie nekotorogo imeni s fajlovoj oblast'yu vidimosti, kotoroe ne opisano odnim iz perechislennyh sposobov tak, chtoby imet' vnutrennee svyazyvanie, v mnogofajlovoj programme oboznachaet odin i tot zhe ob容kt ($$R.3.7), funkciyu ($$R.8.2.5) ili klass ($$R.9). Takie imena nazyvayutsya vneshnimi ili govoryat, chto oni imeyut vneshnee svyazyvanie. V chastnosti, poskol'ku nel'zya opisat' imya klassa kak static, vsyakoe upotreblenie imeni nekotorogo klassa s fajlovoj oblast'yu vidimosti, kotoryj (klass) ispol'zovalsya dlya opisaniya ob容kta ili funkcii s vneshnim svyazyvaniem, ili zhe kotoryj imeet staticheskij chlen ili funkciyu-chlen, ne yavlyayushchuyusya podstanovkoj, budet oboznachat' odin i tot zhe klass. Imena opredelyaemyh tipov (typedef $$R.7.13), elementy perechisleniya ($$R.7.2) ili imena shablonov tipa ($$R.14) ne imeyut vneshnego svyazyvaniya. Staticheskie chleny klassa ($$R.9.4) dopuskayut vneshnee svyazyvanie. Funkcii-chleny, ne yavlyayushchiesya podstanovkoj, dopuskayut vneshnee svyazyvanie. Funkcii-chleny, yavlyayushchiesya podstanovkoj, dolzhny imet' v tochnosti odno opredelenie v programme. Lokal'nye imena ($$R.3.2), yavno opisannye so specifikaciej extern, imeyut vneshnee svyazyvanie, esli tol'ko oni uzhe ne byli opisany kak static ($$R.7.1.1). Tipy, ispol'zuemye vo vseh opisaniyah nekotorogo vneshnego imeni, dolzhny sovpadat', za isklyucheniem ispol'zovaniya imen opredelyaemyh tipov ($$R.7.1.3) i ukazaniya granic massivov ($$R.8.2.4). Dolzhno byt' v tochnosti odno opredelenie dlya kazhdoj funkcii, ob容kta, klassa i elementa perechisleniya, ispol'zuemyh v programme. Odnako, esli funkciya nikogda ne vyzyvaetsya i ee adres nikogda ne ispol'zuetsya, ee ne nuzhno opredelyat'. Analogichno, esli imya klassa ispol'zuetsya tol'ko takim obrazom, chto ne trebuetsya znat' opredelenie klassa, to klass ne nuzhno opredelyat'. Oblast' vidimosti funkcii mozhet byt' tol'ko fajl ili klass. S pomoshch'yu specifikacii svyazyvaniya mozhno dobit'sya svyazyvaniya s opisaniyami na drugom yazyke ($$R.7.4). R.3.4 Nachalo i okonchanie programmy Programma dolzhna soderzhat' funkciyu s imenem main(). Ej pripisyvaetsya rol' nachala programmy. |ta funkciya ne yavlyaetsya predopredelennoj dlya translyatora, ona ne mozhet byt' peregruzhena, a ee tip zavisit ot realizacii. Predpolagaetsya, chto lyubaya realizaciya dolzhna dopuskat' dva privedennyh nizhe opredeleniya i chto mozhno dobavlyat' posle argv lyubye parametry. Funkciya main mozhet opredelyat'sya tak int main() { /* ... */ } ili int main(int argc, char* argv[]) { /* ... */ } V poslednem opredelenii argc zadaet chislo parametrov, peredavaemyh programme okruzheniem, v kotorom ona vypolnyaetsya. Esli argc ne ravno nulyu, parametry dolzhny peredavat'sya kak stroki, zavershayushchiesya simvolom '\0', s pomoshch'yu argv[0] do argv[argc-1], prichem argv[0] dolzhno byt' imenem, pod kotorym programma byla zapushchena, ili "". Dolzhno garantirovat'sya, chto argv[argc]==0. Funkciya main() ne dolzhna vyzyvat'sya v programme. Svyazyvanie main() ($$R.3.3) zavisit ot realizacii. Nel'zya poluchat' adres main() i ne sleduet opisyvat' ee kak inline ili static. Vyzov funkcii void exit(int); opisannoj v <stdlib.h>, zavershaet programmu. Znachenie parametra peredaetsya okruzheniyu programmy v kachestve rezul'tata programmy. Inicializaciya nelokal'nyh staticheskih ob容ktov ($$R.3.5) edinicy translyacii proishodit prezhde pervogo obrashcheniya k funkcii ili ob容ktu, opredelennomu v etoj edinice translyacii. |ta inicializaciya ($$R.8.4, $$R.9.4, &&R.12.1, $$R.12.6.1) mozhet byt' provedena pered vypolneniem pervogo operatora main() ili otlozhena do lyubogo momenta, predshestvuyushchego pervomu ispol'zovaniyu funkcii ili ob容kta, opredelennyh v dannoj edinice translyacii. Vse staticheskie ob容kty po umolchaniyu inicializiruyutsya nulem ($$R.8.4) prezhde lyuboj dinamicheskoj (vo vremeni vypolneniya programmy) inicializacii. Bol'she nikakih trebovanij na poryadok inicializacii ob容ktov iz razlichnyh edinic translyacii ne nalagaetsya. Inicializaciya lokal'nyh i staticheskih ob容ktov opisana v $$R.8.4. Destruktory ($$R.12.4) dlya inicializirovannyh staticheskih ob容ktov vyzyvayutsya pri vozvrate iz main() ili pri vyzove exit(). Unichtozhenie proishodit v obratnom poryadke po sravneniyu s inicializaciej. S pomoshch'yu funkcii atexit() iz <stdlib.h> mozhno ukazat' funkciyu, kotoruyu nuzhno vyzyvat' pri vyhode iz programmy. Esli bylo obrashchenie k funkcii atexit(), ob容kty, inicializirovannye do vyzova atexit(), ne dolzhny unichtozhat'sya do teh por, poka ne proizojdet vyzov funkcii, ukazannoj v atexit(). Esli realizaciya S++ sosushchestvuet s realizaciej S, vse dejstviya, kotorye dolzhny byli proizojti posle vyzova funkcii, zadannoj v atexit(), proishodyat tol'ko posle vyzova vseh destruktorov. Vyzov funkcii void abort(); opisannoj v <stdlib.h>, zavershaet programmu bez vypolneniya destruktorov staticheskih ob容ktov i bez vyzova funkcij, zadannyh v atexit(). R.3.5 Klassy pamyati Sushchestvuet dva opisyvaemyh klassa pamyati: avtomaticheskij i staticheskij. Avtomaticheskie ob容kty stanovyatsya lokal'nymi pri peredache upravleniya v kazhdyj blok. Staticheskie ob容kty sushchestvuyut i sohranyayut svoe znachenie vo vse vremya vypolneniya programmy. Avtomaticheskie ob容kty inicializiruyutsya ($$R.12.1) vsyakij raz, kogda upravlenie perehodit v blok, gde oni opredeleny i unichtozhayutsya ($$R.12.4) po vyhode iz etogo bloka ($$R.6.7). Poimenovannyj avtomaticheskij ob容kt ne dolzhen byt' unichtozhen do okonchaniya ego bloka, tochno tak zhe, kak ne mozhet byt' isklyuchen poimenovannyj avtomaticheskij ob容kt klassa, imeyushchego konstruktor ili destruktor s pobochnym effektom, dazhe esli kazhetsya, chto etot ob容kt ne ispol'zuetsya. Analogichno, global'nyj ob容kt klassa s konstruktorom ili destruktorom, imeyushchimi pobochnyj effekt, ne mozhet byt' isklyuchen, dazhe esli kazhetsya, chto on ne ispol'zuetsya. Staticheskie ob容kty inicializiruyutsya i unichtozhayutsya v sootvetstvii s opisaniem v $$R.3.4 i $$R.6.7. S nekotorymi ob容ktami ne svyazano nikakogo imeni, sm. $$R.5.3.3 i $$R.12.2. Vse global'nye ob容kty imeyut klass pamyati staticheskij. Lokal'nym ob容ktam i chlenam klassa mozhno predat' klass pamyati staticheskij s pomoshch'yu yavnogo ispol'zovaniya specifikacii klassa pamyati static ($$R.7.1.1). R.3.6 Tipy Sushchestvuyut dva vida tipov: osnovnye i proizvodnye. R.3.6.1 Osnovnye tipy Sushchestvuet neskol'ko osnovnyh tipov. V standartnom zagolovochnom fajle <limits.h> zadayutsya v zavisimosti ot realizacii minimal'nye i maksimal'nye znacheniya kazhdogo tipa. Ob容kty, opisannye kak simvoly (char), mogut hranit' lyuboj element iz bazovogo nabora simvolov dannoj mashiny. Esli simvol etogo nabora hranitsya v simvol'noj peremennoj, to ee znachenie ravno celomu znacheniyu koda etogo simvola. Simvoly mogut yavno opisyvat'sya kak unsigned ili signed. Obychnyj char, signed char i unsigned char yavlyayutsya tremya razlichnymi tipami. Dlya vseh etih treh tipov trebuetsya odinakovyj ob容m pamyati. S pomoshch'yu opisanij short int, int i long int mozhno opredelit' celye treh razlichnyh razmerov. Dlya dlinnyh celyh trebuetsya pamyati ne men'she chem dlya korotkih celyh, no v realizacii ili korotkie celye, ili dlinnye celye, ili i te i drugie mogut okazat'sya ekvivalentnymi obychnym celym. Obychnye celye imeyut razmer, opredelyaemyj sistemoj komand, razmery drugih celyh opredelyayutsya konkretnymi potrebnostyami. Dlya kazhdogo iz tipov signed char, short, int i long sushchestvuet sootvetstvuyushchij bezznakovyj tip, kotoryj zanimaet tot zhe ob容m pamyati i udovletvoryaet tem zhe trebovaniyam vyravnivaniya. Trebovanie vyravnivanie - eto ogranichenie na znachenie ukazatelya na dannyj ob容kt, kotoroe nakladyvaet realizaciya ($$R.5.4). Bezznakovye celye, opisannye kak unsigned, podchinyayutsya zakonom arifmetiki po modulyu 2@n, gde n chislo bitov, ispol'zuemoe dlya predstavleniya znacheniya. Otsyuda sleduet, chto v arifmetike bezznakovyh ne voznikaet perepolneniya. Sushchestvuet tri tipa s plavayushchej tochkoj: float, double i long double. Tip double garantiruet ne men'shuyu tochnost' predstavleniya, chem float, a tip long double garantiruet tochnost' ne men'she, chem u double. Harakteristiki osnovnyh tipov s plavayushchej tochkoj opredelyayutsya v sootvetstvii s realizaciej v standartnom zagolovochnom fajle <float.h>. Tipy char, int lyubyh razmerov i tip perechisleniya ($$R.7.2) nazyvayutsya celochislennymi tipami. Celochislennye tipy vmeste s tipami s plavayushchej tochkoj obrazuyut arifmeticheskie tipy. Tip void zadaet pustoe mnozhestvo znachenij. On ispol'zuetsya dlya oboznacheniya tipa funkcij, kotorye ne vozvrashchayut rezul'tat. Nel'zya opisyvat' ob容kty s tipom void. Lyuboe vyrazhenie mozhno yavno preobrazovat' k tipu void ($$R.5.4), poluchivsheesya vyrazhenie mozhno ispol'zovat' tol'ko kak vyrazhenie-operator ($$R.6.2), kak levyj operand operacii zapyataya ($$R.5.18) ili v kachestve vtorogo ili tret'ego operanda v operacii ?: ($$R.5.16). R.3.6.2 Proizvodnye tipy Sushchestvuet potencial'no beskonechnoe chislo proizvodnyh tipov, kotorye stroyatsya iz osnovnyh tipov sleduyushchimi sposobami: massiv ob容ktov dannogo tipa, $$R.8.4; funkcii, imeyushchie parametry dannogo tipa i vozvrashchayushchie ob容kty dannogo tipa, $$R.8.2.5; ukazateli na ob容kty ili funkcii dannogo tipa, $$R.8.2.1; ssylki na ob容kty ili funkcii dannogo tipa, $$R.8.2.2; konstanty, yavlyayushchiesya znacheniyami dannogo tipa, $$R.7.1.6; klassy, soderzhashchie sovokupnost' ob容ktov razlichnyh tipov ($$R.9), nabor funkcij dlya upravleniya etimi ob容ktami ($$R.9.3) i i spisok ogranichenij na dostup k etim ob容ktam i funkciyam, $$R.11; struktury, kotorye yavlyayutsya klassami bez standartnyh ogranichenij na dostup, $$r.11; ob容dineniya, kotorye yavlyayutsya strukturami, sposobnymi soderzhat' v raznoe vremya ob容kty razlichnyh tipov, $$R.9.5; ukazateli na chleny klassov, kotorye zadayut chleny dannogo tipa sredi vseh ob容ktov dannogo klassa, $$R.8.2.3. V obshchem sluchae ukazannye metody postroeniya ob容ktov mogut primenyat'sya rekursivno, ogranicheniya privedeny v $$r.8.2.1, $$R.8.2.4, $$R.8.2.5 i $$R.8.2.2. Pro ukazatel' na ob容kty tipa T govoryat "ukazatel' na na T". Naprimer, pro ukazatel' na ob容kt tipa int govoryat "ukazatel' na int", a ukazatel' na ob容kt klassa X nazyvaetsya "ukazatel' na X". Ob容kty tipa void* (ukazatel' na void), const void* i volatile void* mogut ispol'zovat'sya kak ukazateli na ob容kty neizvestnogo tipa. Ob容kt tipa void* dolzhen imet' dostatochno pamyati, chtoby hranit' ukazatel' na lyuboj ob容kt. Vse fragmenty rukovodstva, govoryashchie ob "ukazatelyah", ne otnosyatsya k ukazatelyam na chleny, za isklyucheniem ukazatelej na staticheskie chleny. R.3.6.3 Imena tipov Osnovnye i proizvodnye tipy mozhno poimenovat' s pomoshch'yu mehanizma typedef ($$R.7.1.3), a semejstvo tipov i funkcij mozhno zadat' i poimenovat' s pomoshch'yu mehanizma shablona tipov ($$R.14). R.3.7 Adresa Lyuboj ob容kt - eto nekotoraya oblast' pamyati, adres - vyrazhenie, ssylayushcheesya na ob容kt ili funkciyu. Ochevidnym primerom adresa budet imya ob容kta. Sushchestvuyut operacii, porozhdayushchie adresa, naprimer, esli E vyrazhenie tipa ukazatel', to *E - adresnoe vyrazhenie, sootvetstvuyushchee ob容ktu, na kotoryj ukazyvaet E. Termin "adres" ("lvalue" t.e. left value - levaya velichina) poyavlyaetsya iz operatora prisvaivaniya E1 = E2, gde levyj operand E1 dolzhen "adresovat'" izmenyaemuyu peremennuyu. Pri obsuzhdenii vseh operacij v $$R.5 ukazyvaetsya primenimy li oni k adresnym operandam i porozhdayut li oni sami adresa. Adres mozhet izmenyat'sya, esli on ne yavlyaetsya imenem funkcii, imenem massiva ili const. R.4 Standartnye preobrazovaniya Nekotorye operacii v zavisimosti ot svoih operandov mogut vyzvat' preobrazovanie znacheniya operanda ot odnogo tipa k drugomu. Zdes' opisyvayutsya preobrazovaniya, vyzvannye samymi obychnymi operaciyami, i ob座asnyaetsya kakovy mogut byt' rezul'taty takih preobrazovanij. Po mere nadobnosti budut dany dopolnitel'nye ob座asneniya pri obsuzhdenii kazhdoj operacii. Podobnye preobrazovaniya takzhe proishodyat pri inicializacii ($$R.8.4, $$R.8.4.3, $$R.12.8, $$R.12.1). V $$R.12.3 i $$R.13.2 opisyvayutsya preobrazovaniya, zadannye pol'zovatelem, i ih sootnosheniya so standartnymi preobrazovaniyami. V rezul'tate preobrazovaniya mozhet poluchit'sya adres, tol'ko esli rezul'tat est' ssylka ($$R.8.2.2). R.4.1 Standartnye preobrazovaniya dlya celochislennyh Vsyudu, gde trebuetsya celoe, mozhno ispol'zovat' char, short int, element perechisleniya ($$R.7.2) ili bitovoe pole ($$R.9.6), prichem v znakovom i bezznakovom variantah. Esli int mozhet predstavlyat' vse znacheniya ishodnogo tipa, znachenie preobrazuetsya k int, inache ono preobrazuetsya k unsigned int. |to nazyvaetsya standartnym preobrazovaniem dlya celochislennyh. R.4.2 Preobrazovaniya celochislennyh Esli celoe preobrazuetsya v bezznakovyj tip, to poluchennoe znachenie est' naimen'shee bezznakovoe celoe, sovpadayushchee s celym so znakom po (mod 2**n), gde n est' chislo bitov v predstavlenii bezznakovogo celogo. Dlya predstavleniya v dopolnitel'nom kode eto preobrazovanie lish' konceptual'noe, nikakih izmenenij v dvoichnom predstavlenii v dejstvitel'nosti ne proishodit.\ Esli celoe preobrazuetsya k znakovomu tipu, znachenie ne menyaetsya, pri uslovii, chto ego mozhno predstavit' s pomoshch'yu novogo tipa, inache znachenie opredelyaetsya realizaciej. R.4.3 Znacheniya s plavayushchej tochkoj i dvojnoj tochnost'yu Dlya vyrazhenij tipa float mozhet ispol'zovat'sya arifmetika s obychnoj tochnost'yu. Esli znachenie s plavayushchej tochkoj men'shej tochnosti preobrazuetsya v znachenie tipa float ravnoj ili bol'shej tochnosti, to izmeneniya znacheniya ne proishodit. Esli znachenie s plavayushchej tochkoj bol'shej tochnosti preobrazuetsya v znachenie tipa float men'shej tochnosti i znachenie nahoditsya v predelah, zadavaemyh predstavleniem tipa, to v rezul'tate mozhet poluchit'sya ili blizhajshee bol'shee ili blizhajshee men'shee predstavimoe znachenie. Esli rezul'tat okazalsya vne granic predstavleniya tipa, povedenie neopredeleno. R.4.4 Celochislennye i chisla s plavayushchej tochkoj Preobrazovanie znacheniya s plavayushchej tochkoj k celochislennomu tipu svoditsya k "usecheniyu", t.e. otbrasyvaniyu drobnoj chasti. Takie preobrazovaniya zavisyat ot mashiny, v chastnosti v kakuyu storonu budet prohodit' usechenie dlya otricatel'nyh chisel opredelyaetsya na raznyh mashinah po raznomu. Rezul'tat schitaetsya neopredelennym, esli znachenie nel'zya predstavit' v celochislennom tipe. Preobrazovaniya celochislennyh znachenij k znacheniyam s plavayushchej tochkoj matematicheski korrektny nastol'ko, naskol'ko eto pozvolyaet sistema komand. Mozhet proizojti poterya tochnosti, esli celochislennoe znachenie nel'zya tochno predstavit' kak znachenie s plavayushchej tochkoj. R.4.5 Arifmeticheskie preobrazovaniya Dlya bol'shinstva operacij preobrazovaniya operandov i tip rezul'tata opredelyayutsya odnimi i i temi zhe pravilami. |to pravilo mozhno nazvat' "obychnymi arifmeticheskimi preobrazovaniyami". Esli odin iz operandov est' long double, drugoj operand preobrazuetsya v long double. Inache, esli odin iz operandov est' double, drugoj operand preobrazuetsya v double. Inache, esli odin iz operandov est' float, drugoj operand preobrazuetsya v float. Inache, esli standartnye celochislennye preobrazovaniya ($$R.4.1) proishodyat nad oboimi operandami. Togda, esli odin iz operandov est' unsigned long, drugoj operand preobrazuetsya v unsigned long. Inache, esli odin iz operandov est' long int, a drugoj - unsigned int, to pri uslovii, chto long int mozhet predstavlyat' vse vozmozhnye znacheniya unsigned int, znachenie unsigned int preobrazuetsya v long int, v protivnom sluchae oba operanda preobrazuyutsya v unsigned long int. Inache, esli odin iz operandov est' long, drugoj operand preobrazuetsya v long. Inache, esli odin iz operandov est' unsigned, drugoj operand preobrazuetsya v unsigned. Inache, oba operanda dolzhny byt' int. R.4.6 Preobrazovaniya ukazatelej Vsyudu, gde ukazateli ($$R.8.2.1) prisvaivayutsya, inicializiruyutsya, sravnivayutsya ili ispol'zuyutsya inym obrazom, mogut proishodit' sleduyushchie preobrazovaniya: Konstantnoe vyrazhenie ($$R.5.19), kotoroe svoditsya k nulyu, preobrazuetsya v ukazatel', obychno nazyvaemyj pustym ukazatelem. Garantiruetsya, chto znachenie takogo ukazatelya budet otlichno ot lyubogo ukazatelya na ob容kt ili funkciyu. Ukazatel' na ob容kt lyubogo tipa, ne yavlyayushchegosya const ili volatile, mozhno preobrazovat' v void*. Ukazatel' na funkciyu mozhno preobrazovat' v void*, pri uslovii, chto dlya void* otvoditsya dostatochno pamyati, chtoby hranit' etot ukazatel'. Ukazatel' na dannyj klass mozhno preobrazovat' v ukazatel' na dostupnyj bazovyj klass dannogo klassa ($$R.10), esli takoe preobrazovanie ne soderzhit dvusmyslennost' ($$R.10.1). Bazovyj klass schitaetsya dostupnym, esli dostupny ego obshchie chleny ($$R.11.1). Rezul'tatom preobrazovaniya budet ukazatel' na ob容kt tipa bazovogo klassa, vlozhennyj v ob容kt tipa proizvodnogo klassa. Pustoj ukazatel' (0) preobrazuetsya sam v sebya. Vyrazhenie tipa "massiv T" mozhet preobrazovyvat'sya v ukazatel' na nachal'nyj element massiva. Vyrazhenie tipa "funkciya, vozvrashchayushchaya T" preobrazuetsya v "ukazatel' na funkciyu, vozvrashchayushchuyu T", za isklyucheniem teh sluchaev, kogda ono ispol'zuetsya kak operand adresnoj operacii & ili operacii vyzova funkcii (). R.4.7 Preobrazovaniya ssylok Vsyudu, gde ssylki ($$R.8.2.2) inicializiruyutsya (vklyuchaya peredachu parametrov ($$R.5.2.2) i vozvrat znacheniya funkcii ($$R.6.6.3)) ili ispol'zuyutsya inym obrazom, vozmozhny sleduyushchie preobrazovaniya: Ssylka na dannyj klass mozhet byt' preobrazovana v ssylku na dostupnyj bazovyj klass ($$R.10, $$R.11.1) dannogo klassa ($$R.8.4.3), pri uslovii, chto takoe preobrazovanie ne soderzhit dvusmyslennosti ($$R.10.1.1). Rezul'tatom preobrazovaniya budet ssylka na ob容kt bazovogo klassa, vlozhennyj v ob容kt proizvodnogo klassa. R.4.8 Ukazateli na chleny Vsyudu, gde ukazateli na chleny ($$R.8.2.3) inicializiruyutsya, prisvaivayutsya, sravnivayutsya ili ispol'zuyutsya inym obrazom, mogut proishodit' sleduyushchie preobrazovaniya: Konstantnoe vyrazhenie ($$R.5.19), kotoroe svoditsya k nulyu, preobrazuetsya v ukazatel' na chlen. Garantiruetsya, chto ego znachenie budet otlichno ot lyubyh drugih ukazatelej na chleny. Ukazatel' na chlen dannogo klassa mozhno preobrazovat' v ukazatel' na chlen proizvodnogo ot dannogo klassa, pri uslovii, chto dopustimo obratnoe preobrazovanie ot ukazatelya na chlen proizvodnogo klassa v ukazatel' chlen bazovogo klassa, i chto ono vypolnimo odnoznachnym obrazom ($$R.10.1.1). Pravilo preobrazovaniya ukazatelej na chleny (t.e. ot ukazatelya na chlen bazovogo klassa k ukazatelyu na chlen proizvodnogo klassa) vyglyadit perevernutym, esli sravnivat' ego s pravilom dlya ukazatelej na ob容kty (t.e. ot ukazatelya na proizvodnyj ob容kt k ukazatelyu na bazovyj ob容kt) ($$R.4.6, $$R.10). |to neobhodimo dlya garantii nadezhnosti tipov. Otmetim, chto ukazatel' na chlen ne yavlyaetsya ukazatelem na ob容kt ili ukazatelem na funkciyu i pravila preobrazovanij takih ukazatelej ne primenimy dlya ukazatelej na chleny. V chastnosti ukazatel' na chlen nel'zya preobrazovat' v void*. R.5 Vyrazheniya Zdes' opredelyayutsya sintaksis, poryadok vychisleniya i naznachenie vyrazhenij. Vyrazhenie - eto posledovatel'nost' operacij i operandov, kotoraya zadaet vychislenie. Vychislenie mozhet vydavat' v kachestve rezul'tata znachenie i mozhet vyzyvat' pobochnye effekty. Operacii mogut byt' peregruzheny, t.e. im mozhet byt' pripisano znachenie, kogda oni primenyayutsya k vyrazheniyam tipa klass ($$R.9). Primenenie peregruzhennyh operacij preobrazuetsya v vyzovy funkcij v sootvetstvii s opisaniem v $$R.13.4. Peregruzhennye operacii podchinyayutsya sintaksicheskim pravilam, opredelennym v etom razdele, no trebovaniya k tipu operanda, adresu i poryadku vychisleniya zamenyayutsya na pravila vyzova funkcii. Sootnosheniya mezhdu operaciyami, tipa ++a oznachaet a+=1, ne garantiruyutsya dlya peregruzhennyh operacij ($$R.13.4). V etom razdele opisano primenenie operacij k tipam, dlya kotoryh oni ne yavlyayutsya peregruzhennymi. Peregruzka operacij ne mozhet izmenit' pravila primeneniya operacij k tipam, dlya kotoryh takoe primenenie predusmotreno v samom yazyke. Poryadok vychisleniya podvyrazhenij opredelyaetsya prioritetom i poryadkom primeneniya operacij. Obychnye matematicheskie pravila associativnosti i kommutativnosti operacij dejstvuyut tol'ko, esli operacii dejstvitel'no associativny ili kommutativny. Za isklyucheniem ogovorennyh sluchaev poryadok vychisleniya operandov konkretnoj operacii neopredelen. V chastnosti, esli v vyrazhenii znachenie izmenyaetsya dvazhdy, rezul'tat vyrazheniya neopredelen, esli tol'ko poryadok vypolneniya ne obespechivaetsya samimi operaciyami, naprimer: i = v[i++]; // the value of `i' is undefined i=7,i++,i++; // `i' becomes 9 Reakciya na perepolnenie i delenie na nul' pri vychislenii vyrazheniya zavisit ot realizacii. V bol'shinstve sushchestvuyushchih realizacij S++ ignoriruetsya perepolnenie celyh. Reakciya na delenie na nul' i oshibki operacij nad chislami s plavayushchej tochkoj var'iruetsya ot mashiny k mashine i obychno svyazana s sootvetstvuyushchimi bibliotechnymi funkciyami. Krome ogovorennyh sluchaev, operandy tipa const T, volatile T, T&, const T& i volatile T& mozhno ispol'zovat', kak esli by oni imeli tip prosto T. Analogichno, operandy tipa T* const, T*volatile mozhno ispol'zovat', kak esli by oni imeli tip prosto T*, za isklyucheniem ogovorennyh sluchaev. Analogichno, prosto tip T mozhno ispol'zovat' vsyudu, gde trebuetsya tip volatile T ili const T. |ti pravila mozhet primenyat' v kombinacii, tak chto const T* volatile mozhno ispol'zovat' tam, gde trebuetsya T*, za isklyucheniem ogovorennyh sluchaev. Pri rassmotrenii razresheniya peregruzki ($$R.13.2) takoe ispol'zovanie operacij ne schitaetsya standartnym preobrazovaniem operandov. Esli vyrazhenie imeet tip "ssylka na T" ($$R.8.2.2, $$R.8.4.3), znachenie vyrazhenie est' ob容kt tipa "T", na kotoryj nastroena ssylka. Vyrazhenie yavlyaetsya adresom. Ssylku mozhno predstavlyat' kak imya ob容kta. Dopustimy opredelennye pol'zovatelem preobrazovaniya ob容ktov klassa v (i obratno) osnovnye tipy, ukazateli i t.d. ($$R.12.3) Esli oni nedvusmyslenny ($$R.13.2), takie preobrazovaniya mogut primenyat'sya translyatorom vsegda, kogda poyavlyaetsya ob容kt tipa klassa v kachestve operanda operacii, v kachestve inicializiruyushchego vyrazheniya ($$R.8.4), v kachestve vyrazheniya, zadayushchego uslovie ($$R.6.4), ili v kachestve vyrazheniya, ispol'zuemogo v operatore cikla ($$R.6.5), ili v kachestve znacheniya, vozvrashchaemogo funkciej ($$R.6.6.3), ili v kachestve parametra funkcii ($$R.5.2.2). R.5.1 Pervichnye vyrazheniya Pervichnymi vyrazheniyami yavlyayutsya literaly, imena i imena, opredelennye s pomoshch'yu operacii razresheniya oblasti vidimosti ::. pervichnoe-vyrazhenie: literal this :: identifikator