Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (1160791), страница 201
Текст из файла (страница 201)
Инструкции условное- выражение: выражение-логического-ИПИ выражение-логического-ИПИ? выражение: выражение-присваивания выражение-присвиивония: условное-выражение выражение-логического-ИЛИ оператор-присваивания выражение-присваивания вьсражениенбсосо оператор-присваивания: одно из уь= »= «= с;— выражение: выражение-прпсваивания выражение, выражение-присваивания констатпное-выражение: условное-выражение Грамматические неоднозначности возникают из-за сходства между функциеподоб- ным приведением и объявлением. Например; спгх; эоиЩ ) сбаг)х); //преобразование х в сцасили объявление сЬасс пменен х? Все эти неоднозначности разрешаются в объявления. То есть «если нечто можно понять как объявление, это и есть объявление». Например: Т)а) — ьт; //выражение-инструкция Т)а)+<-; //выражение-инструкция Т)"е))гпг)в)), //объявление Т)/))4]; //обьявление Т) ), //обьявление Т)а)=т; // объявление Т)к6)()с //ооъявление Т)х), у,е= 7, //объявление Это избавление от неоднозначностей чисто статическое.
Гдпнственная информация, используемая для имени, — это известно ли оно как имя типа или как имя шаблона. Гели это не возможно определить, считается что имя относится к чему-то такому, что не является ни шаблоном, ни типом. Конструкция гетр!а/е неквалифицированнъсй-идентификатор используется для того, чтобы заявить, что в контексте, где это не может быть определено, неквалифи цированный-идентификатор является именем шаблона (см.
в В.13.5). А.6. Инструкции См. ~ 6.3. инструкция. помеченная-инструкция инструкция-выражение составная-инструкция 880 Приложение А. Грамматика инструкция-выбора инсгпрукция-итерации инстргукгГия -перехода инструкция-объявления блокыпг помеченная-инструкцияг идентификатор.
инструкция созе констанагное-выражение: инструкция с)е)ои)Г: инстоукция инструкция-вырпжение: вьграженгге„„; составная-пнструкиняг ( последовательность- инсгпрукций, ) последовапгельносгггь-ггнсгпрукцигй ггнсгггрукггия последа вапг ельч ость-инструкций инструкция ннспгрукция-выбора: 8 ) условие) инструтгия й ) условие ) инструкция е)эе инструкция эачгсй ( условие ) инструкция условие: выражение последовательность-спецификиторов-типа объявитель= выражение-присваивания инструкция-итерацииг чиЫ)е ) условие ) инструкция оо инструкция чч)гг)е ) выражение); )ог ) ггнструкцггя-иницалиэацгги-~огусловиеып выраэкение„„) инструкция ггнсгггрукцггя-ггнггцалиэации-~огг инструкция-выражение простое-обьявление инструкция-перехода: Ьгеоа; сопйпое; ге1огп выражение.
„ 9ОГО ггдентггфггкатор; инспгрукция-объявленияг объявление-блоки А.7. Объявления Структура объявлений описана в главе 4, перечисления — в 9 4.8, указатели и массивы — в главе 5, функции — в главе 7, пространства имев — в у 8.2, директивы компоновки — в 8 9.2.4, классы хранения — в 9 10.4. аоследовптельность-объявлений: объявление последовательность-объявлений объявление объявленпег объявление-блока оггределение функцгги А.7. Объявления 881 объявление-шаблона явное-инстпнцирование явная-специилиэация спецификация-компоновки определение-ссросспранства-инеи объявление-блока: простое-объявление аэт-определение определение- пеев донсииа -проппранппва-ислен иэспу- объявление иэспу-дирекспива простое-объявление; последовгстсльносспь-соессссфи катаре-объявленийнс ссгисок-ссницалиэссрукссцих-объявиспелей, „ спецификотор-объявленияс спецификатор-класса-хранение спецификатор-типа спецификатор-функции Ессеях гссредег последовательность-спецификаторов-объявленийс последовительность-спецификаторов-объявлениигн спецификатор-обьявления спецификатор-класса-храненняс аи1о ге9ийег эсагсс ех'сегп гпи1аЫе спецификатор-функциис спсспе сссдиа! ехрусу илгя-гуреде/с идентификаспор спецификатор-топал спецификатор-простого-типа спецификатор-класса спецификагпор-перенисления спецпфикптор-сложного-типа си-кволвфикатор спецификатор-проспюго-типис с„„специфика тор-вложенного-пивники ился-типа -„„спец ификатгср-вложенного-инени гегп р!аде„г, идентификагпар-шаблона сЬаг иссЬаг 1 Ьоо! 5ЬОГ1 сп1 ~оп9 882 Приложение А.
Грамматика экдаес( ипэ)9пед Йоо) доиЫе чо'и~ имя-типа: имя-класса амя-перечиглгния имя - 1уредеУ спецификатор-сложного-пипа> клк>чевое-слово-класса: „„слецификатор-вложенного-илгеничл идентификатор егит и.„, спецяфикатор-вложенного-илгени„„, идентификатор гурепоте .:„„, слецификатор-вложенного-имени идентифпкатор гурепогае ".„„, спеуафикатор-вложенного-и>гели Гегпр(оГе„„ иден>>>ификаг>горииаолона имя-перечисления: иденгтгф~гкалгг>р спецификатор-перечисления; еаигп и денга ификаторги ( список-элелгентов-ггеречисленпячч ) список-э>ге>ген>лов-ггеречггсленггя: определение->лемента-перечисления спггсок-зле>ген>лов-перечггсления, оарелеление-элемента-перечисления определение-элелмнта-леречигления; элелгент-перечиогенги элелген>гг-леречислег*ия = констанптог-выраэгение элемент-леречислениги идеюпификатор ил>я-пространства-имен> оригинальное-ильч-простраггсгггва-го~ен псевдонгог-лроспрансглва-и>ген оригинальное-имя-пространства-ил>ен> иденпшфикалгор олределение-пространенна - имен; определен>ге-г>мелованного-просгг>ранг>ива-г>>ген определение-нег>>ге повинного- пространства -гьч он определение-ил~енованного-лространслгва-гьгген> определение-оригинального-пространопва-имен определение-расширенного-пространстваноиен определение-оригинального-а растра нет во -илген.
по тес росе идентификатор ( >пело-пространства иимен ) определение-расгииренного-лростринслгва-имен> потеэросе гигя-орг>гиначьного-прог>прана>ива-гглгггн ( тело-лространства-имен ) опрег>е>гение-негглгенованного-пространстваигмен: по гаев росе ( теин лростра наива-имен ) 883 А.7, Объявления тело-пространства-и«ен: последовательность-объявленай„ псе в донна - пространства- имен; идентификаьпор определение-псевдонима-пространства-имен: помезросе пдентификатор = квал фицировинный-спецификатор-пространства-имен квалифицированный-спецификатор-пространыпва-имен :.„„, спецификатор-вложенного-именин, и«я-пространсспва-имен из(пу-объявление: овну ~трепете„г,::„„спецификатор-вложенногоыынени неквалифицированный-идентификатор, выло з неквалзфицнрованный-идентификатор; азгпу-директива: вяля логаезрасе зж«спецификатор-вложенного-имени„„ имя-пространства-имен; азт-определение: озм ( строковый-лтперал Н спецификиция-компоновки: екгет строковый-литерал ( список-объявленийг, ) ехьегп гтроковый-литерал объявление Грамматика допускает произвольную вложенность об ьявлений.
Однако есть некоторые семантические ограничения, Например, не разрешаются вложенные функции (функции, определенные локально относительно других функций), Перечень гпецификаторов, которые начинают объявление, не может быть пустым (нет «неявного сп(», Ч Б,2) н состоит из самой длинной возможной последовательности специфпкаторов. Например: (ур еде( ьпг й оозгц(ипз(улей й ( гн ... '! ) Здесь 1 (( принимает неименованный аргумент типа ипзсдпес(!пй азт (( — зто вставка ассемблерного текста.
Смысл определяется при реализации, но идея состоит в том, чтобы зта строка была частью ассемблерного кода, который будет вставлен в генерируемую программу в указаное место. Можно объявить переменную регистровой (гефт(ег). Это будет служить подсказкой компилятору оптимизировать постоянные обращения к переменной, что, впрочем, большинство современных компиляторов прекрасно понимают сами. А.7.1.
Объявители См. у 4.9.1, главу 5 (указатсли и массивы), 8 7.7 (указатели на функции) и у 15.5 (указатели на члены). список-иницализируюьцих-оаьявителей: иницализирующий-объявитель сгтсок-иницализирующих-объявителей, иницалтзирующий-объявитель 884 Приложение А. Грамматика инггцализируюгций-объявигггельг объявитель ггнггггггаггизагпорчг объявителсс непосредственно-объявитель рп -оператор объявитель непосредственно-обьявтпель: объявитель-идентификатор непосредственно-объявитель ( конструкция-объявления-парплгетра [ последовательность-си-квалификпторов,,спецификиция-исключения„ непосредтпвенно-объявитель [ константное-выражениечн'г [ объявигггель [ рР-операгггорг * послед овательнотпь-си-квал ифи катаров.„ $ ::„„, спецификатор-вложенного-юпени * последовательность-си-квалификаторовчн последовательносгпь-сп-квалификапгоров: сп-квалификатор последовательность-сп-квалификапгоров„„, си-квалификапгорг сопзг чо[аи[е объявитель-идентификатор; , иден пгифи кит ар-вырпжение :,„„, спецификитор-вложенного-имени.м илт-типа идентификатор-типа: последовательность-спецификаторов-ггита абсгпрактный-объявигпель„м пггследовптельность-спецификаторов-типаг специфика тор- типа последова гпельн ость -специфики торов- типа„ абстракпгный-объявителю рб-оператор ибстрактный-объявительы, непосредственно-абспграктньш-объявшпель непосредственно-абстрактный-обьявитель: непосредственно-абстрактнып-объявитель„„, ( конструкция -объявленгт -паралгетра [ последовательность-си-квалификаторов, спецификация-исключениячм непосредственно-абстрактный-объявипгель„„, [ констангпное-вырагкенгге,, ~ [ абстрактный-объявитель [ конструкция-объявления-паралгетраг список-объявления-параметров„„, ...„„, список-объявления-парилепгров, ...
список-объявления-параметросн объявление-параметра список-объявления-параметров, объявление-паралгегггра 885 А.8. Классы обьчвление-пираметра: последовательность-спецификаторов-объявленийобъявитель шкледовательность-спецификаторов-объявлений объявите чь = выражение-присвоивания последовительность-сиецификаторов-объявлений аошпракпчный-объявитеяь„„ посяедовительноппь-спецификаторов-объявленой абстраквчный-объявительм, = выражение-присваивания определение-функции: посл вдов агпел ь ность-спец ифи катаров-объя елена йм, объявитель с1ог-инициализаторы, тело-функции последовительность-спецификиторов-объявлении „объявитель сгу-блок-функции тело-функиии: составная-инструкция инициолизатор: = конструкция-инициализатора ( список- выражений ) конспчрукцччя-инччцгчалиэатора: вырпжение-присваивания ( список-инициализачпоров „,„, ~ список-инициализаторов: конструкция -инициал ива тора спгчсок-инициалччзагчэоров, конструкция-инициализатора Спечплфикатор во1аЯе — это подсказка компилятору, что объект может изменять свое -значение не описанным в языке образом, так что агрессивной оптнмизапии следует избегать.