C++
Шрифт:
Эти конструкции могут быть вложенными.
11.4 Управление строкой
Для помощи другим препроцессорам, генерирующим программы на С++, строка вида
#line константа «имя_файла»
заставляет компилятор считать, например, в целях дианостики ошибок, что константа задает номер следущей строки исходного файла, и текущий входной файл именуется идентификтором. Если идентификатор отсутствует, то запомненное имя файла не изменяется.
12. Константные выражения
В
+ – * / % amp; ! ^ «„ “» == != « » «= »= amp; amp; !!
или унарными операциями
+ – ~ !
или тернарной операцией
?:
Скобки могут использоваться для группирования, но не для вызова функций.
Во всех остальных случаях константное выражение может также содержать унарную операцию amp;, примененную к внешним или статическим объектам, или к внешним или статическим массивам, индексированным константным выражением. Унарная операция amp; может также быть применена неявно с помощью употребления ниндексированных массивов и функций. Основное правило состоит в том, что инициализаторы должны при вычислении давать контанту или адрес ранее описанного внешнего или статического обйекта плюс или минус константа.
Меньшая широта допустима для константных выражений после #if: недопустимы имена, описанные const, sizeof выражения и перечислимые константы.
13. Соображения мобильности
Определенные части С++ являются машинно зависимыми по своей сути. Следующий ниже список мест возможных затруднений не претендует на полноту, но может указать на основные из них.
Как показала практика, характеристики аппаратуры в читом виде, такие, как размер слова, свойства плавающей арифмтики и целого деления, не создают особых проблем. Другие апаратные аспекты отражаются на различных программных разработках. Некоторые из них, особенно знаковое расширение (преобразование отрицательного символа в отрицательное целое) и порядок расположения байтов в слове, являются досадными пмехами, за которыми надо тщательно следить. Большинство отальных являются всего лишь мелкими сложностями.
Число регистровых переменных, которые фактически могут быть помещены в регистры, различается от машины к машине, как и множество дейсвующих типов. Тем не менее, все компиляторы на «своей» машине все делают правильно; избыточные или ндействующие описания register игнорируются.
В языке неопределен порядок вычисления параметров фунции. На некоторых машинах он слева направо, а на остальных справа налево. Порядок появления побочных эффектов также ндетерминирован.
Поскольку символьные константы в действительности явлются объектами типа int, то могут быть допустимы многосивольные
14. Краткое изложение синтаксиса
Эта краткая сводка синтаксиса С++ предназначается, чтобы способствовать пониманию. Она не является точной формулирокой языка.
14.1 Выражения
выражение: терм выражение бинарная_операция выражение выражение ? выражение : выражение список_выражений
список_выражений: выражение список_выражений , выражение
терм: первичное_выражение унарная_операция терм терм ++ терм – sizeof выражение sizeof ( имя_типа ) ( имя_типа) выражение простое_имя_типа ( список_выражений ) new имя_типа инициализатор opt new ( имя_типа ) delete выражение delete [ выражение ] выражение
первичное_выражение: id :: идентификатор константа строка this ( выражение ) первичное_выражение[ выражение ] первичное_выражение ( список_выражений opt ) первичное_выражение.id первичное_выражение-»id
id: идентификатор typedef-имя :: идентификатор typedef-имя :: имя_функции_операции
операция: унарная_операция бинарная_операция специальная_операция операция_свободной_памяти
Бинарные операции имеют приоритет, убывающий в указанном порядке:
бинарная_операция: одна из * / % + – «„ “» « »
== != amp; ^ ! amp; amp; !! операция_присваивания
операция_присваивания: одна из = += -= *= /= %= ^= amp;= != »»= ««=
унарная_операция: одна из * amp; + – ~ ! ++ –
специальная_операция: одна из []
операция_свободной_памяти: одна из new delete
имя_типа: спецификаторы_описания абстрактный_описатель
абстрактный_описатель: пустой * абстрактный_описатель абстрактный_описатель ( список_описаний_параметров ) абстрактный_описатель [ константное_выражение opt ]
простое_имя_типа: typedef-имя char short int long unsigned float double void
typedef-имя: идентификатор
14.2 Описания
описание: спецификаторы_описания opt список_описателей opt ; описание_имени asm-описание
описание_имени: сост идентификатор ; enum идентификатор ;
сост:
class struct union
asm-описание: asm ( строка ) ;
спецификаторы_описания: спецификатор_описания спецификаторы_описания opt
спецификатор_описания: спецификатор_класса_памяти спецификатор_типа спецификатор_функции typedef friend
спецификатор_типа: простое_имя_типа спецификатор_класса спецификатор_enum усложненный_спецификатор_типа const
спецификатор_класса_памяти: auto extern register static
спецификатор_функции: inline overload virtual
усложненный_спецификатор_типа: ключ typedef-имя ключ идентификатор
ключ: class struct union enum
список_описателей: иниц-описатель иниц-описатель , список_описателей
иниц-описатель: описатель инициализатор opt
описатель: оп_имя ( описатель ) * const opt описатель amp; const opt описатель