Программирование >>  Перегруженные имена функций и идентификаторы 

1 ... 51 52 53 [ 54 ] 55 56 57 ... 210


Константные выражения

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

В первом случае выражение может включать только целые константы, символьные константы, константы, описанные как имена, и sizeof выражения, возможно, связанные бинарными операциями:

<< >>

< >

<= >= && 11

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

к

&



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

Скобки могут использоваться для группирования, но не для вызова функций.

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

Основное правило состоит в том, что инициализаторы должны при вычислении давать константу или адрес ранее описанного внешнего или статического объекта плюс или минус константа.

Меньшая широта допустима для константных выражений после #if: константы, описанные как имена, sizeof выражения и перечислимые константы недопустимы.

Соображения мобильности

Определенные части C++ являются машинно-зависимыми по своей сути.

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

Некоторые из них, особенно знаковое расширение (преобразование отрицательного символа в отрицательное целое) и порядок расположения байтов в слове, являются досадными помехами, за которыми надо тщательно следить. Большинство других являются всего лишь мелкими сложностями.

Число регистровых переменных, которые фактически могут быть помещены в регистры, различается от машины к машине,



как и множество фактических типов. Тем не менее, все компиляторы на своей машине все делают правильно; избыточные или недействующие описания register игнорируются.

Некоторые сложности возникают при использовании двусмысленной манеры программирования. Писать программы, зависящие от какой-либо из этих особенностей, районе неблагоразумно.

В языке не определен порядок вычисления параметров функции. На некоторых машинах он слева направо, а на некоторых справа налево.

Порядок появления некоторых побочных эффектов также недетерминирован.

Поскольку символьные константы в действительности являются объектами типа int, то могут быть допустимы многосимвольные константы. Однако конкретная реализация очень сильно зависит от машины, поскольку порядок, в котором символы присваиваются слову, различается от машины к машине. На некоторых машинах поля в слове присваиваются слева направо, на других справа налево.

Эти различия невидны для отдельных программ, не позволяющих себе каламбуров с типами (например, преобразования int указателя в char указатель и просмотр памяти, на которую указывает указатель), но должны приниматься во внимание при согласовании внешне предписанных форматов памяти.

Свободная память

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

extern void* new (long); для получения памяти. Параметр задает число требуемых байтов. Память будет инициализирована. Если new не может найти требуемое количество памяти, то она возвращает ноль.

Операция delete вызывает функцию

extern void delete (void*); чтобы освободить память, указанную указателем, для повторного использования. Результат вызова delete() для указателя, который не был получен из new(), не определен, это же относится и к



1 ... 51 52 53 [ 54 ] 55 56 57 ... 210

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика