Изменить стиль страницы

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 описатель

описатель ( список_описаний_параметров ) описатель [ константное_выражение opt ]

оп_имя: простое_оп_имя typedef-имя :: простое_оп_имя

простое_оп_имя: идентификатор typedef-имя ~ typedef-имя имя_функции_операции имя_функции_преобразования

имя_функции_операции: operator операция

имя_функции_преобразования operator тип

список_описаний_параметров: список_описаний_прм opt ... opt

список_описаний_прм: список_описаний_прм , описание_параметра описание_параметра

описание_параметра: спецификаторы_описания описатель = выражение спецификаторы_описания описатель = константное_выражение спецификаторы_описания абстракт_описатель = выражение спецификаторы_описания абстракт_описатель = выражение

спецификатор_класса: заголовок_класса (* список_членов opt *) заголовок_класса (* список_членов opt public : список_членов opt *)

заголовок_класса: сост идентификатор opt сост идентификатор opt : public opt typedef-имя

список_членов: описание_члена список_членов opt

описание_члена: спецификаторы_описания opt описатель_члена инициализатор opt ; определение_функции opt

описатель_члена: описатель идентификатор opt : константное_выражение

инициализатор: = выражение = (* список_инициализаторов *) = (* список_инициализаторов , *) ( список_выражений )

список_инициализаторов: выражение список_инициализаторов , список_инициализаторов (* список_инициализаторов *)

спецификатор_enum: enum идентификатор opt (* enum-список *)

enum-список: перечислитель enum-список , перечислитель

перечислитель: идентификатор идентификатор = константное_выражение

14.3 Операторы

составной_оператор: (* список_операторов opt *)

список_операторов: оператор оператор список_операторов

оператор: описание составной_оператор выражение opt ; if ( выражение ) оператор if ( выражение ) оператор else оператор while ( выражение ) оператор do оператор while ( выражение ) ; for ( оператор выражение opt ; выражение opt ) оператор switch ( выражение ) оператор case константное_выражение : оператор default : оператор break ; continue ; return выражение opt ; goto идентификатор ; идентификатор : оператор

14.4 Внешние определения

программа: внешнее_определение внешнее_определение программа

внешнее_определение: определение_функции описание

определение_функции: спецификаторы_описания opt описатель_функции инициализатор_базового opt тело_функции

описатель_функции: описатель ( список_описаний_параметров )

тело_функции: составной_оператор

инициализатор_базового: : ( список_инициализаторов_членов opt )