Бьерн Страуструп. Язык программирования С++. Специальное издание (2011) (1004033), страница 201
Текст из файла (страница 201)
932 Приложение А. Грамматика рзеийо-Йез1шс(ог-пате: ::,р, лез(еЙ-лате-зресфег,р, (УРе-лате:: - гуре-пате ::,р, пез(еЙ-лате-зресфег гешр1асе (етр!а(е-!Й:: - (уре-пате ::,р, лез1ей-пате-зресфег,р, - (уре-пате илагу-ехр).езяол: роз фх-ехргезз(оп ее саз1-ехргезяоп - — саз(-ехргезз!оп илагу-орега(ог саз1-ехргезз!оп в г геок ипагу-ехргезз!оп вггеог ( 1уре-Ы ) пеи>ехргезз1оп Йе1е(е-ехргезяол ипагу-орега(от опе о[ * з пеи -ехргезз!ол( ::,, пеп пеи>р!асетеп1 „пеьо-(уре-Ы пеи(!пй!айгег,р, ::,р, пеи' пети-р!асетеп1т, ( (уре-Ы ) пеи1!лй!айгег,р, леи -р1асетеп(. ( ехргезз!ол-йз( ) леи -1уре-Ы: (уре-зресфег-зев пеы-Йес!ага(ог,л пеи-Йес1ага(ог: ра-орега1ог леи-Йес1ага(ог,р, Й(гес1-пети-Йес!ага(ог Й(гес(-леи-Йес1ага(огт [ ехргезяоп ) Й(гес1-пезз-Йес(ага(ог [ соле(ап1-ехргезз!оп ] лев-!п!1!айгег: ( ехр) езяол-йз(,р, ) Йе!е(е-ехргезз!оп: : ".,р, Йе!е(е саз(-ехргезяоп ::,р, Йе!е1е [ ] саЯ-ехргезяоп саз(-ехргезяол: ипагу-ехргезяоп ( (уре-Ы ) саз1-ехргезяоп рт-ехргезяоп: сая-ехргезяоп рт-ехргезз!оп .
* саз(-ехргезз!оп рт-ехргезз!оп ->* саз1-ехргезяоп тифр!кайзе-ехргезз!оп: рт-ехргезяоп ти!йрйсайие-ехргезяоп * рт-ехргезгйоп ти рйр!Ыа((ие-ехргезз!оп / рт-ехргезз!оп тий!рйса(гие-ехргезз!оп Ъ рт-ехргезяоп А.5. Выражения айй!1ие-ехргезлоп! ти10р1!са!!ие-ехртезлоп аЫ11!з>е-ехргезз1оп е та!1!р11са11ие-ехргезз1оп айй11ге-ехргезз!оп — ти16р1!са11ие-екргезз!оп зНЯ-ехргезз!оп! ай!!!!ие-ехргезз!оп к!1 ф-ехртезз!оп «а!1Й1!ие-ехргезз!оп з!зф-ехргезз1оп » а!1Й11ие-ехргезз!оп ге!а11опа1-ехртезз!оп зЬф-ехргезз!оп ге!а!!опа1-ехртеы!оп < зЬф-екртезз!оп ге!а!!опа1-ехргезз!оп > з11ф-ехртезз!оп ге!а!!опа 1-ехргезз!оп < = з11 1!1-ехргезз!оп ге!а!!опа1-ехртезз!оп >= з!1д1-екргезз1оп едиа1!зу-екргезз!оп: ге1а11опа1-екргезз|оп едиа1!1у-ехргезз1оп == ге!а!1опа!-ехргезз1оп едиа111у-екргезз!оп ! = ге!аиопа1-екргезиоп ат1-ехргезз!оп! едиа!!1у-ехргезлоп апйехргезз!оп ь едиа1йу-ехртезиоп ехс1илие-от-ехргезйоп! аЫ-ехргезз!оп ехс!пегие-ог-ехргеыюп " апйехргезлоп !ос!из!ие-ог-ехргеззюп! ехс1из!ае-ог-екртезз1оп !по!из!з>е-ог-екртезз!оп ~ ехс!илге-ог-ехргеы1оп 1офса1-спи-ехргезлоп: !по!из!ие-от-ехргезззоп !од!са1-апйекргезз!оп за !ос!пиме-ог-ехргезз!оп 1од!са1-ог-ехргезз!оп! !орса!-апйехргезз!оп !орса!-от-ехргезз!оп ~ ~ 1ое!са!-апй-ехргезз!оп сопй11опа1-екргезз!оп! 1ое!са!-от-ехргезз!оп !орса!-ог-ехргезз!оп ? ехргеззюп: аы!ептеп1-екргезлоп азз!дптеп1-ехргезз!оп! сопй1!опа1-екргезз!оп 1ое!са!-ог-ехргезз1оп азз!дптеп1-орегатог азлдптеп1-ехртезз!оп йгоы-ехргезз!оп азз1дптеп1-арета!от! опе о!' * /= «= »= ехргезлоп: азз!дптеп1-ехргезз!оп ехргезлоп, азз!дптеп1-екргезз!оп сопззап1-ехргезз!оп: сопй1!опа1-ехргезз!оп 934 Приложение А.
Грамматика Грамматические неоднозначности возникают из-за идентичности приведения типа в функциональном стиле и объявлений. Например: сп( х; ио!д Т() ( сааг (х); // приведение типа х к слог или обьявление переменной х типа сЬаг? Все такие неоднозначности разрешаются в пользу объявлений (если нечто выглядит как объявление, это и есть объявление). Например: Т(а) ->си! Т(а) ++! // оператор-выражение // оператор-выражение Т(*е) ((ис(3) ); //обьявление ТФ (4) ! //объявление Т(а) ! Т(а) =(и; Т(*Ы () ! Т(х),у, х=?; // обьявление // объявление // объявление // объявление А.6. Операторы См.
56.3. лсасетелс! !аЬе1едчиа(етеп( ехргелсдоп-с(асетеп! сотроилдсиа(етеп! яе1ес((оп-зсасетепс йегаболы(а(етеи( !итр-л(а(етеп( дес1агааол-е(асетеп( (гу-Ь(ос(с 1аЬе!ед-всасетеи(! !деп((Г(ег ! яса(етеис саяе сопя!оп(-ехргеяя!оп: яса(етеп( с(есая1с: лса(етеп! ехргевв!оп-с(асетепс: ехргелсдои,н с сотроил(1-с(а(етеп(: ( я(асетел(-лес!,г, ) Единственная информация, связанная с именем, это является ли оно именем типа или шаблона, Если это нельзя однозначно установить, то имя считается принадлежашим чему угодно, но только не типу (и не шаблону).
Конструкция (етр!асе неквалифииированный-идентификатор означает, что неквалифис(ированный-идентификатор относится к имени шаблона (если по контексту это не может быть определено) (см. 5С.13.б). 999 А.7. Объявления гсасевепсмедс тасетепс рсасетепсмед хсасетеп! ре1еспоп-гсасетепс: се ( сопйнои ) сласетеп! гг ( сопйноп ) гсасетепс е1ае р1асетеи! аитссн ( сопйноп ) гсасетеи1 соес!с!опс ехр гесс(оп суремресд)егмед ссес!агасог аМ8птепс-ехргегр(оп (сего!(оп-гса(етепи плате ( сопй1(оп ) гсасетеп! Оо гсагетепг рр)с!1е ( ехргехйоп ) ! хох ( /ог-!и(Смсагетеи! сопйноп,р, с ехргехйоп,р, ) г(а(етепС аког-(исс-рсасетепсс ехргегйопепасетеп! р!тр!е-Ыес1агас(ои уитр-с(а(етепсс Ьгеак сооссиое гесогп ехргерйоп,р, с восо (ссепсЯег ! с!ес1асапопенаСевелС( Ыос/с-ссес1агас!оп А.У.
Объявления Структура объявлений рассмотрена в главе 4, перечисления — в 54.8, указатели и массивы в главе 5, функции — в главе 7, пространства имен — в 88,2, директивы компоновки — в 59.2.4, классы хранения — в 810.4. с(ее!ага!!оп-сед! аес1ас.аиоп с!ее!ага!(оп-ред с!ее!ага!(оп с(ес!ага!!опс Ыос/с-с(ес1агапол !лисс(оп-йе7стс(оп гетр!осе-а(ее!ага!!оп ехр1(с!с-(и!сап!!а!!оп ехр!сслхрресса1(галоп 1(и(саяе-гресдссас(оп патехрасе-рсеГт(с(оп Ыосlс-Нес!ага!!ои! Нвр1е-с1ес1агаяои арт-ссе71и!с!ои павеарасе-а!!ах-асе71и!с!оп 936 Приложение й.
Грамматика ие!лу-Иес1ага!!ол ит!па-~йгест!ие ттр1ефес1ага!!ол: г!ес1-бресе!ег-ьед р, Гпутфес1агатог-!уег,р,,' т!ес1-ересфег: зтогаае-с!аде-яресфег !уремресфег 3ипсаоп-ересфег 1суепо Суреоес Нес!тресфег-лед: с!ес1-зресфегтесу,р, Йес!-яресфег е!аглае-с!аее-ересфег: аисо сед~всес ясак!с ехеесп шисаЬ!е уи пст!оп-ересфег: ал1г ее чассца1 ехр1!сг Е !урес!е1-лате: Ыел!фег туре-зресфег: е!тр1е-туретресе !ег с1аее-ьрест1! ег епит-ересфег е1аЬогатес1-туре-зресфег си-диа1фег е!тр1е-гуре-зресфег: ::,р, пес!ее!-пате-ерес11!егт, !уре-лате ::,р~ пел!ей-пате-яресфег сеер1асеел !етр1ате-Ы сЬаг и~сап> ! Ьоо! 5Ьог! й! 1опе еуепес! ипеудпей !тоа! ЫоиЫе тоЫ 938 Приложение А. Грамматика патезрасе-а!!аз-с)еаза(!/опз пвиеврвсе !с(еп!зу)ег - с/иа1(/)ей-патезрасе-зрес(/) ег; с/иа((!) ес(-патезрасе-зрес(Гзег: ::,р, пез!ес(-пате-зрес(Гзег,г, патезрасе-пате из/пя-з!ес!ага!!опз в в ь вч суре папе,в,::,т пез!ей-пате-зресз/) ег ипдиа((/(ей-и!; ввьпч:: ипз/иа1(Гзес(-Ы з из!пя-с(!гес!(вез овьпч папев(заве::от пез(ей-пате-зрес(рзегви патезрасе-пате; азт-Ие/йи!!опз ави ( з(нпя-!1!ега! ) 1/и/заве-зресфса!(опз ехсесп з!ппд-!пега! ( г(ее!ага!/оп-зег!,р, ) ехсесп з!г(пх-1/!ега( дев!ага!/оп Грамматика допускает произвольный уровень вложения объявлений.
Однако имеются некоторые семантические ограничения. Например, не допускается вложения функций (определения функции в теле другой функции). Список спецификаторов, начинающих объявление, не может быть пустым (нет умолчательного зпг, ВВ.2) и включает самую длинную из всех возможных последовательность спецификаторов. Например: (уреИер т! 1/ иоЫЯипз(япез!1) (/* ... */) Здесь~() принимает неименованный ипщяеИ изг. С помошью азиз() вводятся фрагменты ассемблерного кода. Более детальный смысл зависит от реализации, но общая идея состоит в том, что строка подается как ассемблерный код, подлежащей внедрению в компилируемый поток в указанном месте. Модификатор гея1згег означает намек компилятору на то, чтобы он попытался оптимизировать частый доступ к переменной, но зто большинство современных компиляторов понимают и без подсказок.
А.7.1. Деклараторы См. 94.9.1, главу 5 (указатели и массивы), 97.7 (указатели на функции) и 915.5 (указатели на члены классов). !и!(-с(ес!ага(ог-1!з!з !и! !-з(ес!ага!ог !и!!-с!ес!ага!ог-1!з!, !и!!-г!ее!ага!ог !и!(-Нес!ага!от Йес(ага!ог тпта1геег,г, Нес!ага!ог: г!!гес!-г!ес(ага!ог р!г-орега(ог Йес!ага!ог А.7. Объявления Йгес(-((ее!ага(от ((ес!ага(ог-1(( а(гес(-((ес!ага(ог ( рагате(ег-а(ее!ага((оп-с!пизе ) си-диа1(!(ег-зедяп ехсер((оп-зресфса((оп,р, Йгес( ((ее!ага(ог 1 сопя(ап(-ехргезз!оп~ ] ( ((ес!ага(ог ) ри -орега(от * си-диа!(((ег-зед,п ( (,р, пез(е((-пате-зрес(!)ег * си-диа!В(ег-зед,р, сг-диа1(!(ег-зед( си-диа1(У(ег си-диа! о (ег-зедог, стдиа1з(ег( сопят ио1ах11е Нес!ага(ог-Ы ::,р, !((-ехргезз(оп ::,р, пез(е((-пате-зресфегеп (уре-пате (уренй (уре-зрес(!(ег-зед аЫгас(-(!ес!ага(огяп (уре-зресу(ег-яед( (уре-зрес(((ег (уре-зресд(ег-зед,г, аЫгас(-((ее!ага(ог( р(г-орега(ог аЬзиас(-Иес1ага(ог „ йгес(-аЬз(гас(-((ес!ага(ог йгес(-аЬз(гас(-((ес!ага(ог( йгес(-аЬз(гас(-(!ее!ага(огяп ( рагате(ег-((ес!ага(!оп-с!пизе ) си-диа(фег-зед,п ехсер((оп-зрес)!(са((оп,р, йгес(-аЬз(гас(-((ес!ага(огяп 1 сопя(ап(-ехргезйоп,г, ) ( аЬз(гас(йес(ага(ог ) рагате(ег-((ес(ага((оп-с(аизе( рагате(ег-((ес!ага((оп-1!з(,р,...,, регате(ег-((ес!ага((оп-!(з(, рагате(ег-((ее!ага(юп-1(з(' рагате(ег-((ес!ага((оп рагате(ег-((ее!ага(!оп-!(з(, рагате(ег-((ес!ага((оп рагате(ег-Йес!ага((оп( ((ес1-зресв(ег-зед ((ее!ага(ог ((ес!-зресд)ег-зед Йес!ага!ог = аззфптеп(-ехргезз!оп ((ес1-зресфег-зед аЬз(гас(-((ее!ага(ог,п ((ес1-зресфег-зед аЬз(гас(-((ее!ага(ог~ = азз(алтея(-ехргезз(оп !й по(юп-((е((п((!оп: ((ес1-зрес(((ег-зед, ((ес!ага(ог с(ог-!п(((а!(хег,п 1йпс(!оп-Ьоа(у ((ес1-зресд)ег-зед р, ((ес!ага(ог!ипс(!оп-(гу-Ыос(( Приложение А.
Грамматика (йпс((оп-Ьоз(ур сотроипг(-з(а(етеп! (п(((а((зегр тЫа((гег-с1аизе ( ехргезз(оп-1(з! лица!иег-с1аизе: азмкптеп(-ехргезмоп ( тЫа(иег-!и( „р, ) ( ) (п(1(а(!еег-!(з(р (п(((а!(еег-с(пизе т!((а!(гег-!!з(, (п!((а((еег-с!аизе Спецификатор ео(ап1е — это подсказка компилятору, что объект может изменить свое значение способом, не описанным в языке программирования, так что агрессивной оптимизации следует избегать. Например, часы реального времени могут быть объявлены следутоп)им образом: ат(егп сопя! ро!а!((е (опя с(ос(з; Два последовательных считывания объекта с(ос(с могут порождать разные результаты. А.8.
Классы См. главу 10. с1азз-пате: Ыепи!) ег !етр1а(е-и( с(азз-зрес)1) егр с(азз-Ьеаг( ( тетЬег-зрес(()са(!оп,р, ) с(азз-ЬеаА с(азз-(геу Ыеп(р)ег,р, Ьазе-с1аизе,р, с!азз-(геу пез(ей-пате-зреса)ег Ыепи))ег Ьазе-с(аизе,р, с(азз-(сеУ пез(ес(-паве-зРес(У) ег,р, (етР(а(е-Ы Ьазе-с1аизе,р, с(азз-()еу( с1азз зсеасе ипьоп т ет Ьег-зрес()) са((о ар тетЬег-г(ес(агааоп вевЬег-зресфса((оп,р, ассезз-зрес(() ег: тетЬег-зрес(() са(!оп,р, тевЬег-г(ес(а галоп: з(ес(-зресфег-зер(,р, ветЬег-с(ес!ага(ог-(и(,р, р (йпс(!оп-йеЯп!1(оп г рр, ::,р, пез!ед-пате-зрес(() ег еепр1аее,р, ип((иа!В1 ей-Ы А.8.