Программирование на Objective-C 2.0
Шрифт:
На некоторых машинах переменная short int занимает половину памяти, ко-торая требуется переменной типа int. В любом случае для переменных типа short int выделяется не меньше 16 бит.
В Objective-C не существует способа записать константу типа short int. Чтобы вывести переменную типа short int, нужно поместить букву h перед любым из символов преобразования в целое значение: %hi, %ho или %hx. Для отображения значений short int можно также использовать любой из символов преобразования в целое значение, поскольку эти символы можно преобразовать в целые значения, когда они передаются в процедуру NSLog как аргументы.
Квалификатор, который можно помещать перед переменной типа int,
Этот квалификатор расширяет диапазон значений целой переменной.
Константа типа unsigned int формируется путем добавления и ИЛИ U после кон-станты. OxOOffU
Для целой константы можно сочетать и (ИЛИ U) и I (или L). Например, в следующем случае компилятор будет интерпретировать константу 20000 как unsigned long. 20000UL
Целая константа, которая не заканчивается буквами u, U, I ИЛИ L и слишком велика, чтобы уместиться в обычный размер типа int, интерпретируется компи-лятором как unsigned int. Если она слишком велика, чтобы уместиться в unsigned int, то компилятор обрабатывает ее как long int. Если она не умещается даже в long int, компилятор обрабатывает ее как unsigned long int.
При объявлении переменных с типом long int, short int или unsigned int вы можете опустить ключевое слово int. Переменную counter типа unsigned int можно объявить следующим образом: unsigned counter;
Переменные типа char также можно объявлять как unsigned.
Квалификатор signed позволяет явно указать компилятору, что определенная переменная содержит значения со знаком. В основном его используют перед объявлением char. Подробное описание этого квалификатора выходит за рамки этой книги. Тип id
Тип данных id используется для хранения объекта любого типа. Его можно на-зывать обобщенным типом объекта. Ниже объявляется переменная number с типом id. id number;
Можно объявлять методы, которые возвращают значения типа id. -(id) newObject: (int) type;
Здесь объявляется метод экземпляра с именем newObject, который принимает один целый аргумент с именем type и возвращает значение типа id. id — это тип по умолчанию для типа возвращаемого значения и типа аргумента. Ниже приводится объявление метода класса, который возвращает значение типа id. +alloclnit;
Тип данных id часто используется в этой книге. Тип id является основой таких важных средств в Objective-C, как полиморфизм {polymorphism) и динамическое связывание (dynamic binding). (Подробнее см. главу 9.)
В таблице 4.1 приводится сводка базовых типов и квалификаторов.
Табл. 4.1. Базовые типы данных Тип Примеры констант Символы формата NSLog char 'a', '\n' %c short int - %hi, %hx, %ho unsigned short int - %hu, %hx, %ho int 12, -97, OxFFEO, 0177 %i, %x, %o unsigned int 12u, 100U, OXFFu %u, %x, %o long int 12L, -2001, OxffffL %li, %lx, %lo unsigned long int 12UL, 100ul, OxffeeUL %lu, %lx, %lo long long int 0xe5e5e5e5LL, 500ll %lli, %llx, &llo unsigned long long int 12ull, OxffeeULL %llu, %llx, %llo float 12.34f, 3.1e-5f, 0x1.5p10, 0x1 P-1 %f, %e, %g, %a double 12.34, 3.1 e-5, 0x.1p3 %f, %e, %g, %a long double 12.341, 3.1 e-5l %Lf, $Le, %Lg id nil %p 4.2. Арифметические выражения
В Objective-C, как практически во всех языках программирования, знак «плюс» (+) используется для сложения двух значений, знак «минус» — для вычитания двух значений, звездочка (*) — для умножения двух значений, а слэш (/) — для деления двух значений. Эти операторы называются бинарными (binary) арифметическими операторами, поскольку они работают с
двумя значениями, или членами. Старшинство операторовВы уже видели, как в Objective-C выполняется простая операция, например, сложение. В следующей программе показаны операции вычитания, умножения и деления. В последних двух операторах этой программы показано, что оператор может иметь более высокий приоритет, или старшинство (precedence) по сравнению с другим оператором. Любой оператор в Objective-C имеет свой приоритет.
Приоритет определяет порядок вычисления выражения, содержащего более одного оператора: оператор с более высоким приоритетом вычисляется первым. Выражения, содержащие операторы с одинаковым приоритетом, вычисляются слева направо или справа налево (в зависимости от оператора). Это свойство ассоциативности (associative) оператора. В приложении В приводится полный список старшинства операторов и правил ассоциативности. // Использование арифметических операторов #import <Foundation/Foundation.h> int main (int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int a = 100; int b = 2; int c = 25; int d = 4; int result; result = a - b; //вычитание NSLog (@"a - b = %i", result); result = b * с; //умножение NSLog (@"b * c = %i", result); result = a / с; //деление NSLog (@"a / c = %i", result); result = а + b * с; //старшинство NSLog (@"а + b * с = %i", result); NSLog (@"а * b + с * d = %i", а * b + с * d); [pool drain]; return 0; }
Вывод программы 4.2 a - b = 98 b * c = 50 a/c = 4 a + b * c = 150 a * b + c * d = 300
После объявления целых переменных a, b, с, d и result программа присваивает результат вычитания b из а переменной result и затем выводит ее значение с по-мощью вызова NSLog.
В следующей строке значение b умножается на значение с, и произведение сохраняется в переменной result: result = b * с;
Результат умножения выводится с помощью вызова NSLog. В следующей строке программы используется оператор деления и с помощью NSLog выводится результат деления а на с, то есть 100 на 25.
Попытка деления на ноль вызывает аварийное завершение. Даже если про-грамма не будет прекращена, результат такого деления не имеет смысла. В главе 6 вы научитесь проверять, не равен ли делитель нулю, прежде чем выполнить операцию деления. Если делитель равен нулю, можно обойти операцию деления.
Результат следующего выражения не равен 2550 (102 х 25); вместо этого NSLog выводит значение 150. а + b * с
Objective-C, как и большинство других языков программирования, выполняет несколькох операций над членами выражения по определенному порядку. Вычисление выражения обычно происходит слева направо, но операции умно-жения и деления имеют приоритет над операциями сложения и вычитания. Поэтому система вычисляет выражение а + b * с
следующим образом: а + (b * с)
Для изменения порядка вычисления членов внутри выражения можно ис-пользовать круглые скобки. Показанное выше выражение является допустимым выражением Objective-C. Следующую строку можно подставить в программу 4.2, чтобы получить те же результаты: result = а + (b * с);
Но переменной result будет присвоено значение 2550, если использовать следующее выражение: result = (а + b) * с;
Значение а (100) будет сложено со значением b (2) до умножения на с (25). Круглые скобки можно вкладывать друг в друга; выражение будет вычисляться, начиная с внутренних круглых скобок. Убедитесь, что число закрывающих скобок равно числу открывающих. В последней выполняемой строке программы 4.2 выражение передается как аргумент процедуре NSLog без присваивания этого выражения какой-либо переменной. Выражение а * b + с * d