Программирование на Objective-C 2.0
Шрифт:
К этим операндам применяются обычные арифметические преобразования за исключением « и », когда для каждого операнда выполняется целочисленное расширение (см. ниже раздел «Преобразование базовых типов данных»). Если количество битов смешения меньше нуля либо больше или равно числа битов в объекте смешения, то результат смешения не определен. На некоторых машинах правое смещение является арифметическим (заполняется бит знака), а на других — логическим (заполнение нулем). Тип результата операции смещения такой же, как у расширяемого левого операнда. Операторы наращивания и уменьшения на 1 (операторы инкремента и декремента)
При условии, что I модифицируемое lvalue-выражение, тип которого не уточнен как const;
выражение ++I увеличивает I на 1, после
Ниже в разделе «Базовые операции с указателями» описываются эти операции с указателями. Операторы присваивания
При условии, что I модифицируемое lvalue-выражение, тип которого не уточнен как const; op любой оператор, который можно использовать как оператор присваивания (см. таблицу В.4); а выражение;
выражение I = а сохраняет значение а в I; I ор= а применяет орк I и а, сохраняя результат в I.
Если в первом выражении а имеет один из базовых типов данных (за исклю-чением void), то а преобразуется для соответствия типу I. Если I - указатель, то а должен быть указателем того же типа, void-указателем или null-указателем.
Если I — void-указатель, то а может быть указателем любого типа. Второе выражение интерпретируется как I = I ор (а), за исключением того, что I оценивается только один раз (например, в случае x[i++] += 10). Условный оператор
При условии, что а, Ь, с выражения;
выражение а ? b: с получает значение Ь, если а отлично or нуля, или с в противном случае. Вычисляется только выражение b или с.
Выражения Ь и с должны иметь одинаковый тип данных. Если это не так, но оба выражения имеют арифметические типы данных, то применяются обычные арифметические преобразования, чтобы сделать их типы одинаковыми. Если одно из них является указателем, а другое равно 0, то второе выражение используется как null-указатель того же типа, что и первое. Если одно из них является указателем на void, а другое является указагелем на другой тип, то вто-рое преобразуется в указатель на void и результат имеет такой же тип. Оператор приведения типа
При условии, что тип имя какого-либо базового типа данных, перечислимый тип данных (с ключевым словом enum) или тип, определенный как typedef либо приведенный тип данных; а выражение;
выражение ( тип) преобразует а в указанный тип.
Отметим, что использование типа в круглых скобках при объявлении или определении метода не является примером использования оператора приведе-ния типа. Оператор sizeof
При условии, что тип совпадает с описанием в предыдущем разделе; а выражение;
выражение sizeof (тип) имеет значение, равное числу байтов памяти, необходимых для зна-чения указанного типа; sizeof а имеет значение, равное числу байтов памяти, необходимых для ре-зультата вычисления а.
Для типа char результат по определению равен 1. Если а — имя массива, для которого задан размер (явным образом или неявно через инициализацию), и это не формальный параметр и не extern-массив, для которого не указан размер, то sizeof а дает число байтов, необходимых для хранения этих элементов в а.
Если а — имя класса, то sizeof (а) дает размер структуры, необходимой для хранения экземпляра а.
Целое значение, которое дает оператор sizeof, имеет тип size_t, который определен в стандартном header-файле .
Если а — массив переменной длины, то данное выражение вычисляется на этапе выполнения; в противном случае оно вычисляется на этапе компиляции и его можно использовать в константных выражениях (см. выше раздел «Кон-стантные выражения»). Оператор «запятая»
При условии, что а, b выражения;
выражение а, Ь означает вычисление а и затем вычисление Ь. Результирующее выражение имеет тип и значение b. Базовые операции с массивами
При условии, что а объявляется как массив из п элементов; i выражение
любого целого типа данных; v выражение;выражение а[0] является ссылкой на первый элемент а; а[n -1] является ссылкой на последний элемента; a[i] является ссылкой на элемент а с номером i; a[i] = v сохраняет значение v в ар].
В каждом случае тип результата совпадает с типом элементов, содержащихся в а. Сводку операций с указателями и массивами см. ниже в разделе «Базовые операции с указателями». Базовые операции со структурами
Примечание. Эго также относится к объединениям (union).
При условии, что х модифицируемое lvalue-выражение типа struct s; у выражение типа struct s; m имя одно из компонентов структуры S; obj любой объект; М любой метод; v выражение;
выражение х является ссылкой на всю структуру и имеет тип struct s; y.m является ссылкой на компонент m структуры у и имеет тип, объявленный для компонента т; x.m = v присваивает v компоненту m выражения х и имеет тип, объявленный для компонента т; х = у присваивает х значение у и имеет тип struct s; f (у) вызывает функцию f, передавая как аргумент содержимое структуры у (внутри f должен быть объявлен формальный параметр типа struct s); [obj М: у] вызывает метод М для объекта obj, передавая как аргумент содержимое структуры у (внутри метода этот параметр должен быть объявлен как тип struct s); return у; возвращает структуру у (возвращаемое значение, объявленное для функции или метода, должно иметь тип struct s). Базовые операции с указателями
При условии, что х 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 и эквивалентно во всех отношениях выражению а[п].