Чтение онлайн

ЖАНРЫ

Программирование на Objective-C 2.0
Шрифт:

Целое значение, получаемое в результате вычитания двух указателей, имеет конкретный тип ptrdiffj, который определен в стандартном header-файле <stddef.h>. Указатели на структуры

При условии, что х модифицируемое lvalue-выражение типа struct s; ps модифицируемое lvalue-выражение типа «указатель на struct ss>; m имя какого-либо компонента структуры s, имеющего тип t; v выражение;

выражение &х дает указатель на х и имеет тип «указатель на struct s»; ре - &х задает ре как указатель па х, имеющий тип «указатель на struct s>>; ps->m является ссылкой на компонент m структуры, указанной с помощью ps,

и имеет тип t, (*ps).m тоже является ссылкой на этот компонент и эквивалентно во всех отношениях выражению ps->m; ps->m = v сохраняет значение v в компоненте m структуры, указанной с помо-щью ps, и имеет тип t. Составные литералы

Составной литерал (compound literal) представляет собой имя типа, заключен-ное в круглые скобки, после которого следует список инициализации. В ре-зультате создается неименованное значение указанного типа, область действия которого ограничена блоком, в котором оно создано, или глобальной областью действия, если оно определено вне блока. В последнем случае все инициализаторы должны включать только константные выражения.

Например, (struct point) {.х = 0, .у = 0)

является выражением, которое создает структуру типа struct point с указанными начальными значениями. Его можно присвоить другой структуре типа struct point, например, origin = (struct point) {.x = 0, .у = 0);

Или его можно передать функции или методу, если предполагается, что ар-гумент имеет тип struct point, например, moveToPoint ((struct point) {.x = 0, .у = 0});

Можно также определять типы, отличные от структур. Например, если intPtr имеет тип int *, то оператор intPtr = (int [100]) {[0] = 1, [50] = 50, [99] = 99 };

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

Если размер массива не задан, он определяется списком инициализации. Преобразование базовых типов данных

Язык Objective-C преобразует операнды арифметических выражений в заранее определенном порядке, который называется обычными арифметическими преобразованиями .

Если один из операндов имеет тип long double, второй операнд преобразуется в long double, таким же будет тип результата.

Если один из операндов имеет тип double, второй операнд преобразуется в double, таким же будет тип результата.

Если один из операндов имеет тип float, второй операнд преобразуется в тип float, таким же будет тип результата.

Если один из операндов имеет тип _Bool, char, short int, является битовым полем типа int или является перечислимым типом данных, то он преобразуется в тип int, если int может полностью представлять его диапазон значений; в противном случае он преобразуется в unsigned int. Если оба операнда имеют одинаковый тип, таким же будет тип результата.

Если оба операнда указаны как signed или оба как unsigned, то целый тип меньшего размера преобразуется в больший целый тип, и таким же будет тип результата.

Если операнд с атрибутом unsigned имеет размер, который не меньше размера операнда с атрибутом signed, то операнд signed преобразуется в тип операнда unsigned, таким же будет тип результата.

Если операнд с атрибутом signed может представлять все значения операнда unsigned, то второй преобразуется в тип первого, если он может полностью представлять весь диапазон его значений, таким же будет тип результата.

Есл и был достигнут

этот шаг, то оба операнда преобразуются в тип с атрибутом unsigned, соответствующий типу с атрибутом signed.

Шаг 4 называется более формально целочисленным расширением. Преобразование операндов нормально проходит в большинстве ситуаций, хотя следует отметить следующие особенности.

Преобразование char в int может вызвать на некоторых машинах расширение на знаковый бит, если char не объявлен как unsigned.

Преобразование целого типа с атрибутом signed в целый тип большего раз-мера вызывает расширение влево за счет знакового бита; преобразование целого типа с атрибутом unsigned в целый тип большего размера вызывает заполнение левою бита нулем.

Преобразование любого значения в _Воо1 дает значение 0, если значение равно нулю, и 1 в противном случае.

Преобразование более длинного целого типа в более короткий вызывает усечение целого значения слева.

Преобразование типа с плавающей точкой в целый тип вызывает усечение дробной части значения. Если целый тип является недостаточным, чтобы вместить преобразованное значение с плавающей точкой, то результат яв-ляется неопределенным (как и в случае преобразования отрицательного значения с плавающей точкой в целое с атрибутом unsigned).

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

Термин класс памяти (storage class) относится к способу выделения памяти ком-пилятором и к области действия определения конкретной функции или метода. Классы памяти — это auto, static, extern и register. Класс памяти можно не указывать в объявлении, и он будет назначен по умолчанию, как это описывается ниже.

Термин область действия (scope) относится к границам действия определенного идентификатора внутри программы. Идентификатор, определенный вне любой функции, метода или блока операторов (мы будем называть здесь это БЛОКОМ), доступен для ссылки в любой последующей точке файла. Идентификаторы, определенные внутри БЛОКА, являются локальными относительно этого БЛОКА и могут локально переопределять идентификатор, определенный вне этого БЛОКА. Имена меток, а также имена формальных параметров известны во всем БЛОКЕ. Метки, переменные экземпляра, имена структур и компонентов структур, имена объединений и компонентов объединений, а также имена перечислимых типов данных не обязательно должны отличаться друг от друга или от имен переменных, функций или методов. Однако идентификаторы перечисления все же должны отличаться от имен переменных и от других идентификаторов перечисления, определенных в пределах одной области действия. Имена классов имеют глобальную область действия и должны отличаться от имен других переменных и типов в пределах одной области действия. Функции

Если при определении функции определяется класс памяти, он должен быть указан как static или extern. К функции, которая объявляется как static, можно обращаться только в пределах файла, который содержит эту функцию. Функ-ции, объявленные как extern (или функции, для которых не указан никакой класс), могут вызываться функциями или методами из других файлов. Переменные

В таблице В.5 приводится сводка различных классов памяти, которые могут использоваться в объявлении переменных, а также их области действия и спо-собы их инициализации.

Поделиться с друзьями: