Программирование на Objective-C 2.0
Шрифт:
За исключением этих двух особых случаев присваивание указателей различного типа не допускается, и обычно при такой попытке компилятор выдает предупреждающее сообщение. Перечислимые типы данных
Общий формат enum имя { епит_ /, епит_2,..} списокПеременнык,
Перечислимый тип с заданным именем определяется с перечисляемыми значениями enum l, епит_2,..., каждое из которых является идентификатором или идентификатором, после которого следует знак равенства и константное выра-жение. Можно также объявить спиажПеременных (с необязательными начальными значениями), и эти переменные будут иметь тип enum имя.
Компилятор присваивает перечисляемым
Если нужно объявить переменную определенного ранее (и именованного) перечислимого тина, можно использовать конструкцию enum имя списокПеременных,
Если объявлена переменная определенного перечислимого типа, то ей мож-но присвоить значение только того же типа, хотя компилятор, возможно, не зарегистрирует это как ошибку. typedef
Оператор typedef используется, чтобы присвоить новое имя базовому или производному типу данных. Этот оператор не определяет какой-либо новый тип, а просто назначает новое имя для существующего типа. Поэтому переменные, объявленные с типом, имеющим новое имя, интерпретируются компилятором точно так же, как с типом, для которого дополнительно назначено это новое имя.
Создавая определение typedef, нужно действовать, как при объявлении обычной переменной. При этом нужно поместить новое имя типа там, где обычно ставится имя переменной. И, наконец, перед всем этим нужно поставить ключевое слово typedef.
В показанном ниже примере typedef struct { float х; float у; } POINT;
имя POINT связывается со структурой, содержащей два компонента типа float с именами х и у. Затем можно объявлять переменные типа POINT, например, POINT origin = {0.0, 0.0}; Модификаторы типа: const, volatile и restrict
Перед объявлением типа можно помещать ключевое слов const, чтобы сообщить компилятору, что это значение нельзя изменять. Например, const int х5= 100;
объявляет х5 как постоянную целую переменную — ей нельзя присвоить другое значение во время выполнения программы. Компилятор не обязательно будет реагировать на попытки изменения значения такой переменной.
Модификатор volatile явно указывает компилятору, что значение изменяется (обычно динамически). Если в выражении используется volatile-переменная, доступ к ее значению разрешается в любом месте, где она появляется.
Чтобы объявить переменную port17 как тип «volatile-указатель на char», можно написать следующую строку. char *volatile port 17;
С указателями можно использовать ключевое слово restrict. Это указание компилятору на возможность оптимизации (аналогично ключевому слову register для переменных). Ключевое слово restrict сообщает компилятору, что данный указатель будет единственной ссылкой на определенный объект, то есть не будет указываться никаким другим указателем в пределах той же области действия. Строки int * restrict intPtrA; int * restrict intPtrB;
сообщают компилятору, что в пределах области действия, где определены intPtrA и intPtrB, они никогда не будут указывать на одно и то же значение. Их использование для указания целых значений (например, в массиве) будет взаимоисключающим. Выражения
Имена переменных, имена функций, выражения в виде сообщений, имена массивов, константы,
вызовы функций, ссылки на массивы, а также ссылки на структуры и объединения — все это интерпретируется как выражения. Применение унарного (одноместного) оператора к этим выражениям (в допустимых случаях) тоже является выражением, как и сочетание этих выражений с помощью бинарного (двумсстно1>) или тернарного (трехместного) оператора. И, наконец, выражение, заключенное в круглые скобки, тоже является выражением.Отличное от void выражение любого типа, которое идентифицирует объект данных, называется lvalue (1-значением). Если ему может быть присвоено зна-чение, оно называется модифицируемым (изменяемым) lvalue.
Модифицируемые lvalue-выражения обязательны в определенных местах. Выражение в левой части оператора присваивания должно быть модифициру-емым lvalue. Унарный адресный оператор можно применить только к модифицируемом lvalue или к имени функции. И, наконец, операторы наращивания и уменьшения на 1 (инкремента и декремента) можно применять только к модифицируемым lvalue-выражениям. Сводка операторов Objective-C
В таблице В.4 приводится сводка различных операторов языка Objcctivc-C. Эти операторы приводятся в порядке убывания старшинства, и операторы, сгруп-пированные вместе, имеют одинаковый уровень старшинства.
Рассмотрим на следующем примере, как использовать таблицу В.4. b | с & d * е
Оператор умножения имеет более высокий приоритет, чем побитовые операторы OR (|) и AND (&), поскольку он находится выше обоих операторов в таблице В.4. Аналогичным образом, побитовый оператор AND имеет более высокий приоритет, чем побитовый оператор OR, поскольку первый находится в этой т аблице выше, чем второй. Поэтому данное выражение вычисляется в следующем порядке. b | ( с & ( d * е ))
Теперь рассмотрим следующее выражение, b % с * d
Табл. В.4. Сводка операторов Objective-C Оператор Описание Ассоциативность 0 Вызов функции Слева направо [] Ссылка на элемент массива или выражение с сообщением - || - -> Указатель ссылки на компонент структуры - || - . Ссылка на компонент структуры или вызов метода - || - - Унарный минус Справа налево + Унарный плюс - || - ++ Оператор инкремента - || - -- Оператор декремента - || - ! Логическое отрицание - || - ~ Дополнение до нуля - || - * Ссылка на указатель (косвенным образом) - || - & Адрес - || - sizeof Размер объекта - || - (тип) Приведение типа (преобразование) - || - * Умножение Слева направо / Деление - || - % Взятие по модулю - || - + Сложение - || - - Вычитание - || - << Левый сдвиг - || - >> Правый сдвиг - || - < Меньше - || - <= Меньше или равно - || - > Больше - || - >= Больше или равно - || - == Равенство - || - != Неравенство - || - & Побитовый AND - || - ^ Побитовый XOR - || - | Побитовый OR - || - && Логический AND - || - || Логический OR - || - ?: Условный Справа налево = *= /= %= += -= & = ^= |= <<= >>= Операторы присваивания - || - , Оператор «запятая» - || -
Поскольку операторы взятия по модулю и умножения включены в одну группу таблицы В.4, они имеют одинаковый уровень старшинства. Эти операторы выполняются слева направо. Следующее выражение будет вычисляться как ( b % с ) * d
В следующем примере выражение ++а->b
будет вычисляться как ++(а->b)
поскольку оператор -> имеет более высокий приоритет, чем оператор ++.
И, наконец, поскольку операторы присваивания группируются справа на-лево, оператор а = b = 0;