Главная · Поиск книг · Поступления книг · Top 40 · Форумы · Ссылки · Читатели

Настройка текста
Перенос строк


    Прохождения игр    
Demon's Souls |#15| Dragon God
Demon's Souls |#14| Flamelurker
Demon's Souls |#13| Storm King
Demon's Souls |#12| Old Monk & Old Hero

Другие игры...


liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня
Rambler's Top100
Образование - Страустрап Б. Весь текст 579.17 Kb

Язык С++

Предыдущая страница Следующая страница
1 ... 42 43 44 45 46 47 48  49 50
указатель на  объект данного  размера  может  быть  преобразован  в
указатель на объект меньшего размера и обратно без изменений.

                             - стр 308 -

  Например, программа,  выделяющая память, может получать размер (в
байтах) размещаемого  объекта и  возвращать указатель  на char; это
можно использовать следующим образом.

  extern void* alloc ();
  double* dp;

  dp = (double*) alloc (sizeof (double));
  *dp= 22.0 / 7.0;

alloc   должна обеспечивать  (машинно зависимым  образом)  то,  что
возвращаемое ею значение подходит для преобразования в указатель на
double;   в этом  случае использование  функции мобильно. Различные
машины различаются  по числу  бит  в  указателях  и  требованиям  к
выравниванию объектов.  Составные объекты  выравниваются  по  самой
строгой границе, требуемой каким-либо из его составляющих.

                  15. КОНСТАНТНЫЕ ВЫРАЖЕНИЯ

  В нескольких  местах C++  требует выражения,  вычисление  которых
дает  константу:   в  качестве   границы  массива  (#8.3),  в  case
выражениях  (#9.7),   в  качестве   значений  параметров   функции,
присваиваемых по  умолчанию, (#8.3),  и в инициализаторах (#8.6). В
первом случае  выражение может  включать  только  целые  константы,
символьные константы,  константы, описанные  как  имена,  и  sizeof
выражения, возможно, связанные бинарными операциями

   + - * / % & | ^ << >> == != < > <= >= && ||

 или унарными операциями

  - ~ !

или тернарными операциями

  ? :

  Скобки могут  использоваться для  группирования, но не для вызова
функций.
  Большая   широта    допустима   для    остальных   трех   случаев
использования; помимо  константных выражений,  обсуждавшихся  выше,
допускаются константы  с плавающей  точкой, и можно также применять
унарную операцию  & к  внешним  или  статическим  объектам,  или  к
внешним  или   статическим  массивам,  индексированным  константным
выражением. Унарная  операция & может также быть применена неявно с
помощью употребления неиндексированных массивов и функций. Основное
правило состоит  в том,  что инициализаторы  должны при  вычислении
давать  константу   или  адрес   ранее  описанного   внешнего   или
статического обйекта плюс или минус константа.
  Меньшая широта  допустима для  константных выражений  после  #if:
константы, описанные  как имена,  sizeof выражения  и  перечислимые
константы недопустимы.

                             - стр 309 -

                 16. СООБРАЖЕНИЯ МОБИЛЬНОСТИ

  Определенные части C++ являются машинно зависимыми по своей сути.
Следующий ниже  список мест  возможных затруднений не претендует на
полноту, но может указать на основные из них.
  Как показала  практика, характеристики  аппаратуры в чистом виде,
такие, как  размер слова,  свойства плавающей  арифметики и  целого
деления, не  создают  особых  проблем.  Другие  аппаратные  аспекты
отражаются на  различных программных разработках. Некоторые из них,
особенно знаковое расширение (преобразование отрицательного символа
в отрицательное  целое) и  порядок  расположения  байтов  в  слове,
являются досадными  помехами, за  которыми надо  тщательно следить.
Большинство других являются всего лишь мелкими сложностями.
  Число  регистровых  переменных,  которые  фактически  могут  быть
помещены  в  регистры,  различается  от  машины  к  машине,  как  и
множество фактических  типов. Тем  не  менее,  все  компиляторы  на
"своей" машине  все делают  правильно; избыточные или недействующие
описания register игнорируются.
  Некоторые сложности  возникают  при  использовании  двусмысленной
манеры программирования.  Писать программы, зависящие от какой-либо
из этих особенностей, райне неблагоразумно.
  В языке  неопределен порядок  вычисления параметров  функции.  На
некоторых машинах  он слева  направо, а на некоторых справо налево.
Порядок    появления     некотрых    побочных     эффектов    также
недетерминирован.
  Поскольку  символьные   константы  в   действительности  являются
объектами  типа   int,  то  могут  быть  допустимы  многосимвольные
константы. Однако  конкретная реализация  очень сильно  зависит  от
машины, поскольку  порядок, в  котором символы присваиваются слову,
различается от  машины к  машине. На некоторых машинах поля в слове
присваиваются слева направо, на других справо налево.
  Эти различия  невидны для отдельных программ, не позволяющих себе
каламбуров с  типами (например, преобразования int указателя в char
указатель и  просмотр памяти,  на которую  указывает указатель), но
должны приниматься во внимание при согласовании внешне предписанных
форматов памяти.

                    17. СВОБОДНАЯ ПАМЯТЬ

  Операция new (#7.2) вызывает функцию

  extern void* _new (long);

для получения  памяти.  Параметр  задает  число  требуемых  байтов.
Память будет  инициализирована. Если  _new не может найти требуемое
количество памяти, то она возвращает ноль.
  Операция delete вызывает функцию

   extern void _delete (void*);

чтобы  освободить  память,  указанную  указателем,  для  повторного
использования. Результат  вызова _delete()   для указателя, который
не был  получен из  _new(),  неопределен,  это  же  относится  и  к
повторному вызову  _delete() для одного и того же указателя. Однако
уничтожение с помощью delete указателя со значением ноль безвредно.

                             - стр 310 -

  Предоставляются  стандартные   версии  _new()   и  _delete(),  но
пользователь  может   применять  другие,   более   подходящие   для
конкретных приложений.
  Когда с  помощью операции  new создается классовый объект, то для
получения   необходимой    памяти   конструктор    будет   (неявно)
использовать new.  Конструктор может  осуществить свое  собственное
резервирование памяти  посредством присваивания  указателю this  до
каких-либо использований. С помощью присваивания this значения ноль
деструктор может  избежать  стандартной  операции  дерезервирования
памяти для объекта его класса. Например:

  class cl
    {
      int v[10];
      cl () { this = my_own_allocator (sizeof (cl)); }
      ~cl () { my_own_deallocator (this); this = 0; }
    }

  На  входе   в   конструктор   this   являеется   не-нулем,   если
резервирование памяти  уже имело  место (как  это имеет  место  для
автоматических объектов), и нулем в остальных случаях.
  Если производный  класс осуществляет  присваивание this, то вызов
конструктора (если он есть) базового класса будет иметь место после
присваивания, так  что конструктор  базового  класса  ссылаться  на
объект   посредством   конструктора   производного   класса.   Если
конструктор базового  класса  осуществляет  присваивание  this,  то
значение также  будет использоваться  конструктором  (если  таковой
есть)  производного класса.

              18. КРАТКОЕ ИЗЛОЖЕНИЕ СИНТАКСИСА

  Мы надеемся,  что эта  краткая сводка  синтаксиса    C++  поможет
пониманию. Она не является точным изложением языка.

     18.1 Выражения

     выражение:
          терм
          выражение           бинарная_операция           выражение
          выражение       ?       выражение       :       выражение
          список_выражений
     терм:
          первичный
          *                                                    терм
          &                                                    терм
          -                                                    терм
          !                                                    терм
          ~                                                    терм
          ++терм
          --терм
          терм++
          терм--
          (                   имя_типа)                   выражение
          имя_простого_типа           (           список_выражений)

                             - стр 311 -

          sizeof                                          выражение
          sizeof             (              имя_типа              )
          new                                              имя_типа
          new ( имя_типа )
     первичный:
          id
          ::                                          идентификатор
          константа
          строка
          this
          (                       выражение                       )
          первичный[                  выражение                   ]
          первичный      (       список_выражений       opt       )
          первичный.id
          первичный->id
     id:
          идентификатор
          typedef-имя :: идентификатор
     список_выражений:
          выражение
          список_выражений, выражение
     операция:
          унарная_операция
          бинарная_операция
          специальная_операция
  Бинарные операции имеют приоритет, убывающий в указанном порядке:
     бинарная_операция:
          *                          /                            %
          +                                                       -
          <<                                                     >>
          <                                                       >
          ==                                                     !=
          &
          ^
          |
          &&
          ||
          =   +=  -=  *=  /=  %=  ^=  &=  |=  >>=  <<=
                                                  унарная_операция:
           *   &   -   ~   !   ++   --
     специальная_операция:
          ()       []
     имя_типа:
          спецификаторы_описания абстрактный_описатель
     абстрактный_описатель:
          пустой
          *                                   абстрактный_описатель
          абстрактный_описатель  (   список_описаний_параметров   )
          абстрактный_описатель  [   константное_выражение  opt   ]
          ( абстрактный_описатель )
     простое_имя_типа:
          typedef-имя
          char
          short
          int
          long

                             - стр 312 -

          unsigned
          float
          double
     typedef-имя:
          идентификатор

     18.2 Описания

     описание:
          спецификаторы_описания  opt   список_описателей   opt   ;
          описание_имени
          asm-описание
     описание_имени:
          агрег                   идентификатор                   ;
          enum  идентификатор ;
     агрег:
          class
          struct
          union
     asm-описание:
          asm ( строка );
     спецификаторы_описания:
          спецификатор_описания спецификатор_описания opt
     спецификатор_описания:
          имя_простого_типа
          спецификатор_класса
          enum_спецификатор
          sc_спецификатор
          фнк_спецификатор
          typedef
          friend
          const
          void
     sc_спецификатор:
          auto
          extern
          register
          static
     фнк-спецификатор:
          inline
          overload
          virtual
     список_описателей:
          иниц-описатель
          иниц-описатель , список_описателей
     иниц-описатель:
          описатель инициализатор opt
     описатель:
          оп_имя
          (                       описатель                       )
          *             const             opt             описатель
          &             const             opt             описатель
          описатель      (       список_описаний_параметров       )
          описатель [ константное_выражение opt ]

                             - стр 313 -

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

                             - стр 314 -

     список_описаний_параметров:
          список_описаний_прм opt ... opt
Предыдущая страница Следующая страница
1 ... 42 43 44 45 46 47 48  49 50
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (4)

Реклама