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

на главную - закладки

Жанры

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

При условии, что х lvalue-выражение типа t, pt модифицируемое lvalue-выражение типа «указатель на t»; v выражение;

выражение &х дает указатель на х и имеет тип «указатель на t»; pt = &х задает pt как указатель на х и имеет тип «указатель на Ь>; pt = 0 присваивает pt null-указатель; pt == 0 проверяет, является ли pt null-указателем; *pt является ссылкой на значение, указываемое pt и имеет тип t *pt = v сохраняет значение v в том месте, на которое указывает pt, и имеет тип t Указатели на массивы

При условии, что а массив элементов типа t; ра1 модифицируемое lvalue-выражение типа «указатель на t», которое указывает на какой-либо элемент в а;

ра2 lvalue-выражение типа «указатель на Ь>, которое указывает на какой-либо элемент в а или на элемент, следующий за последним элементов в а; v выражение; п целое выражение;

выражение a, &a, &a[0] каждое дает указатель на первый элемент; &a[n] создает указатель на элемент с номером n массива а и имеет тип «указатель на t»; *pa1 является ссылкой на элемент, на который указывает pal, и имеет тип «t»; *pa1 = v сохраняет значение v в элементе, на который указывает pal, и имеет тип «t»; ++pa1 задает указатель ра1 на следующий элемент а независимо от типа элементов, содержащихся в а, и имеет тип «указатель на /»; --pa1 задает указатель pal на предыдущий элемента независимо от типа элементов, содержащихся в а, и имеет тип «указатель на i»; *++pa1 увеличивает pal на 1 и затем ссылается назначение в а, на которое указывает pal; имеет тип t, *pa1++ ссылается на значение в а, на которое указывает ра1, прежде чем увеличить ра1 на 1; имеет тип к pa1 + n создает указатель, который указывает в а на n элементов дальше, чем ра1, и имеет тип «указатель на /»; pa1 - n создает указатель, который указывает в а на n элементов ближе, чем ра1, и имеет тип «указатель на /»; *(pa1 + n) = v сохраняет значение v в элементе, на который указывает ра1 + n, и имеет тип « указатель на f»; pa1 < pa2 проверяет, что ра1 указывает в а более ближний элемент, чем ра2; имеет тип int (для сравнения двух указателей можно использовать любые операторы отношения); pa2 - pa1 дает число элементов, содержащихся в а между указателями ра2 и pal (в предположении, что ра2 указывает на элемент, который находится дальше, чем ра1), и имеет значение целого типа; a + n создает указатель на элемент массива а с номером п и имеет тип «указатель на t»; эквивалентно во всех отношениях выражению &а[n]; *(а + n) ссылка на элемент массива а с номером п, имеет тип «fa и эквивалентно во всех отношениях выражению а[п].

Целое значение, получаемое в результате вычитания двух указателей, имеет конкретный тип 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).

Поделиться:
Популярные книги

Ричард Блейд, пэр Айдена

Лорд Джеффри
1. Ричард Блейд. Зрелые годы
Фантастика:
героическая фантастика
7.29
рейтинг книги
Ричард Блейд, пэр Айдена

Аватар

Жгулёв Пётр Николаевич
6. Real-Rpg
Фантастика:
боевая фантастика
5.33
рейтинг книги
Аватар

Итальянский фашизм

Устрялов Николай Васильевич
Научно-образовательная:
история
политика
5.00
рейтинг книги
Итальянский фашизм

Башни полуночи

Сандерсон Брендон
13. Колесо Времени
Фантастика:
фэнтези
8.53
рейтинг книги
Башни полуночи

Катуков против Гудериана

Прудников Виктор
Сражения Великой Отечественной Войны
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Катуков против Гудериана

Гурко. Под стягом Российской империи

Тумасов Борис Евгеньевич
Русские полководцы
Проза:
историческая проза
5.00
рейтинг книги
Гурко. Под стягом Российской империи

Смертельные враги

Зевако Мишель
5. История рода Пардальянов
Приключения:
исторические приключения
5.00
рейтинг книги
Смертельные враги

Месть изгоя. Книга 3. Вариант О.Рыбаченко

Большаков Алексей Владимирович
5.00
рейтинг книги
Месть изгоя. Книга 3. Вариант О.Рыбаченко

Красавица Альмиу

Мак Иван
23. Легенды Вселенной
Фантастика:
боевая фантастика
5.00
рейтинг книги
Красавица Альмиу

Любовь-морковь и третий лишний

Донцова Дарья
17. Евлампия Романова. Следствие ведет дилетант
Детективы:
иронические детективы
7.50
рейтинг книги
Любовь-морковь и третий лишний

Ловчий смерти

Леженда Валентин
Фантастика:
фэнтези
5.00
рейтинг книги
Ловчий смерти

Инквизитор и нимфа

Зонис Юлия
Фантастика:
фэнтези
6.00
рейтинг книги
Инквизитор и нимфа

Лейтенант. Назад в СССР. Книга 8. Часть 1

Гаусс Максим
8. Второй шанс
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Лейтенант. Назад в СССР. Книга 8. Часть 1

Русские инородные сказки - 6

Фрай Макс
6. Русские инородные сказки
Фантастика:
фэнтези
6.25
рейтинг книги
Русские инородные сказки - 6