Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Скидка до 20% на услуги дата-центра. Аренда серверной стойки. Colocation от 1U!

Миграция в облако #SotelCloud. Виртуальный сервер в облаке. Выбрать конфигурацию на сайте!

Виртуальная АТС для вашего бизнеса. Приветственные бонусы для новых клиентов!

Виртуальные VPS серверы в РФ и ЕС

Dedicated серверы в РФ и ЕС

По промокоду CITFORUM скидка 30% на заказ VPS\VDS

VPS/VDS серверы. 30 локаций на выбор

Серверы VPS/VDS с большим диском

Хорошие условия для реселлеров

4VPS.SU - VPS в 17-ти странах

2Gbit/s безлимит

Современное железо!

Объявление переменных

Мы приступаем к изучению синтаксиса операторов C++. В языке различают несколько типов операторов. Каждый из них выполняет в программе строго определённые функции.

Так, операторы объявления служат для ввода имён в программу. Процедура ввода имени переменной предполагает не только создание отличного от любого ключевого слова идентификатора, но и кодирование дополнительной информации о характеристиках объекта, с которым будет связано объявляемое имя.

К характеристикам объекта относятся тип объекта, класс памяти, время жизни объекта, множество других свойств, представляемых различными модификаторами.

Прежде чем приступить к описанию грамматики объявления переменных, введём для употребления в БНФ пару новых символов: [ и ]. Эти символы мы будем называть синтаксическими скобками. Заключение какого либо символа БНФ в синтаксические скобки означает, что этот символ в данной БНФ, а значит и в описываемом выражении является необязательным элементом. Он может входить в выражение, а может и не появляться вовсе.

Договоримся также об использовании в БНФ ещё одного символа. Этот символ будет иметь вид последовательности из пяти звёздочек, стоящих непосредственно за символом ::= в левой части формулы. Таким образом, содержащая этот символ БНФ будет выглядеть так:

Описатель ::= *****

или даже так:

          ::= *****

Этот символ мы будем называть прерывателем БНФ. Он будет означать, что определение нетерминального символа прерывается и будет продолжено позже.

Оператор ::= ОператорОбъявления
         ::= *****

ОператорОбъявления ::= Объявление
Объявление ::= ОбъявлениеПеременной
           ::= *****

ОбъявлениеПеременной ::= ОбъявлениеПеременнойОсновногоТипа
                     ::= *****

ОбъявлениеПеременнойОсновногоТипа ::=
                 [СписокСпецификаторовОбъявления] [СписокОписателей];

СписокСпецификаторовОбъявления ::=
              [СписокСпецификаторовОбъявления] СпецификаторОбъявления

СпецификаторОбъявления ::= СпецификаторКлассаПамяти
                 ::= СпецификаторТипа
                 ::= cvСпецификатор
                 ::= fctСпецификатор
                 ::= *****

СпецификаторКлассаПамяти ::= auto
                         ::= register
                         ::= static
                         ::= extern

СпецификаторТипа ::= ИмяПростогоТипа
                 ::= СпецификаторПеречисления
                 ::= СпецификаторКласса
                 ::= УточнённыйСпецификаторТипа

УточнённыйСпецификаторТипа ::= КлючевоеСловоКласса Идентификатор
                           ::= КлючевоеСловоКласса ИмяКласса
                           ::= enum ИмяПеречисления

ИмяПростогоТипа ::= char
                ::= short
                ::= int
                ::= long
                ::= signed
                ::= unsigned
                ::= float
                ::= double
                ::= void
                ::= ******

cvСпецификатор ::= const
               ::= volatile

СписокОписателей ::= ОписательИнициализатор
                 ::= СписокОписателей , ОписательИнициализатор

ОписательИнициализатор ::= Описатель [Инициализатор]

Описатель ::= dИмя
          ::= (Описатель)
          ::= *****

Инициализатор ::= = Выражение
              ::= (СписокВыражений)
              ::= *****

Выражение ::= Литерал
          ::= Имя
          ::= *****

СписокВыражений ::= ВыражениеПрисваивания
                ::= СписокВыражений , ВыражениеПрисваивания

dИмя ::= Имя
     ::= ИмяКласса
     ::= ~ ИмяКласса
     ::= ОписанноеИмяТипа
     ::= КвалифицированноеИмяТипа

ВыражениеПрисваивания - этот нетерминальный символ используется в Справочном руководстве по C++ для обозначения элементов списка выражений. Не следует особо смущаться по поводу этого нового обозначения. Это всего лишь частный случай выражения.

dИмя - это имя того, что описывается описателем в данном объявлении. В "Справочном руководстве по языку программирования C++" английский эквивалент понятия описатель - declarator. Обилие нетерминальных символов, производных от символа Имя не должно вызывать никаких затруднений. В конечном счёте, нетерминальные символы ИмяКласса , ОписанноеИмяТипа , ИмяПеречисления (об этом позже) - являются обыкновенными идентификаторами. Всё зависит от контекста объявления. Что объявляется, так и называется. Именующее класс ОписанноеИмяТипа одновременно является и ИменемКласса .

ИмяКласса ::= Идентификатор
ОписанноеИмяТипа ::= Идентификатор
ИмяПеречисления::= Идентификатор

Мы располагаем достаточно большим (хотя пока и неполным) множеством БНФ, которые задают правила построения синтаксически безупречных операторов объявления переменных в C++.

Согласно приведённым правилам, оператором объявления переменных будет считаться пустой оператор

 ;

он состоит из точки с запятой. Между прочим, точкой с запятой заканчиваются все операторы C++. Оператором объявления будет также считаться и такая последовательность спецификаторов объявления:

auto register static extern char short int const;

и здесь также важно не забыть поставить точку с запятой. С точки зрения синтаксиса это правильное предложение.

Язык программировани C++ позволяет описывать данные и алгоритмы их обработки. Вместе с тем, правильно построенная цепочка слов языка может быть абсолютно бессмысленной, то есть не нести никакой информации ни о данных, ни о шагах конкретного алгоритма. Большая часть порождаемых с помощью грамматических правил предложений оказывается семантически некорректными и лишёнными всякого смысла.

Грамматика не отвечает за семантику и тем более за смысл предложений. Она всего лишь описывает правила построения операторов. Тем не менее, транслятор обеспечивает частичный семантический контроль предложений. Поэтому ранее рассмотренные объявления и воспринимаются как ошибочные. Также ошибочным оказывается объявление, состоящее из одного спецификатора объявления:

int ;

Можно было бы усовершенствовать систему обозначений, которая применяется в БНФ, а заодно и сделать более строгими правила синтаксиса. Например, можно было бы добиться того, чтобы пустые операторы воспринимались как синтаксически некорректные предложения. Однако это не может привести к кардинальному решению проблемы семантического контроля.

Назад | Содержание | Вперед

 

Бесплатный конструктор сайтов и Landing Page

Хостинг с DDoS защитой от 2.5$ + Бесплатный SSL и Домен

SSD VPS в Нидерландах под различные задачи от 2.6$

✅ Дешевый VPS-хостинг на AMD EPYC: 1vCore, 3GB DDR4, 15GB NVMe всего за €3,50!

🔥 Anti-DDoS защита 12 Тбит/с!

VPS в России, Европе и США

Бесплатная поддержка и администрирование

Оплата российскими и международными картами

🔥 VPS до 5.7 ГГц под любые задачи с AntiDDoS в 7 локациях

💸 Гифткод CITFORUM (250р на баланс) и попробуйте уже сейчас!

🛒 Скидка 15% на первый платеж (в течение 24ч)

Новости мира IT:

Архив новостей

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 7861149
Пресс-релизы — pr@citforum.ru
Обратная связь
Информация для авторов
Rambler's Top100 TopList liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2019 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...